Algorithm/SWEA

[SWEA] 1240. 단순 2진 암호코드 (Java, 자바)

고기가좋아 2022. 2. 9. 17:51
반응형

문제

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15FZuqAL4CFAYD 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


 

풀이

주어진 이진 암호 코드들의 맨 뒤 숫자는 항상 1이므로 주어진 배열에서 암호 코드를 찾을 때 뒤에서부터 1을 찾도록 반복했다.

암호 코드의 총길이는 56으로 고정되어있으므로 배열 한 행을 탐색할 때 남은 인덱스가 56보다 작으면 탐색을 중지하였다.

(배열 한 개당 암호코드는 한 개 이므로)

주어진 이진 암호코드들은 7자리 이진 코드 이므로 모두 십진수로 변환하여 배열에 저장하였다.

입력받은 배열에서 암호 코드를 찾은 뒤 십진수로 변환하여 십진수로 변환된 암호코드 배열에서 동일한 값을 찾아

해당 인덱스를 해독한 암호코드 배열에 추가하였다.

8자리 암호 코드가 완성되면 주어진 검증방법을 통해 검증하여 정상 암호 코드인지 판별하였다.


 

코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Solution {
	static int[] pw;	// 배열에서 해독한 암호 코드
	static int[] code = {13, 25, 19, 61, 35, 49, 47, 59, 55, 11}; // 주어진 숫자의 해당하는 이진수를 십진수로 변환

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;
		br.readLine();
		for (int test_case = 1; test_case <= 10; test_case++) {
			st = new StringTokenizer(br.readLine());

			int N = Integer.parseInt(st.nextToken());
			int M = Integer.parseInt(st.nextToken());

			pw = new int[8];
			String line;

			for (int i = 0; i < N; i++) {
				line = br.readLine();
				for (int j = M - 1; j >= M - 56 - 1; j--) {	// 배열 뒤에서부터 탐색, 암호코드 길이보다 인덱스가 작아지면 탐색 중지
					if (line.charAt(j) == '1') {	// 1이면 암호코드 맨 뒤 숫자						
						int index = 0;
						for (int k = j - 55; k <= j; k += 7) {
							pw[index++] = convertCode(line.substring(k, k + 7));	// 이진 암호코드를 숫자로 변환
						}
						break;
					}
				}
			}			
			bw.write(String.format("#%d %d\n",test_case, validateCode()));	// 변환된 숫자로 암호코드 검증		
		}
		bw.flush();
		bw.close();
		br.close();
	}
	
	private static int validateCode() {
		int validate = 0;
		int sum = 0;
		for(int i = 0; i<8; i++) {
			if(i % 2 == 0) {
				validate += 3*pw[i];	// 홀수번째면 3 곱해서 저장
			} else {
				validate += pw[i];
			}
			sum += pw[i];
		}
		
		if(validate % 10 == 0) {	// 검증코드가 10의 배수이면 정상 암호코드
			return sum;
		} else {
			return 0;
		}
	}

	private static int convertCode(String binary) {
		int sum = 0;
		int n = 1;
		for(int i = 0; i<7; i++) {	// 이진수를 십진수로 변환
			if(binary.charAt(6-i) == '1') {	
				sum += n;
			}
			n *= 2;
		}
		for(int i = 0; i<10; i++) {	// 주어진 암호코드 배열에서 비교하여 같을때 해당 인덱스 추출
			if(sum == code[i]) {
				return i;
			}
		}		
		return 0;
	}
}
반응형