본문 바로가기
코딩테스트/SWEA

[JAVA] SWEA 1240번 단순 2진 암호코드

by PEKAH 2021. 8. 4.

문제

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15FZuqAL4CFAYD&categoryId=AV15FZuqAL4CFAYD&categoryType=CODE

 

SW Expert Academy

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

swexpertacademy.com

 

풀이

이런 문제는 규칙을 찾는 것이 중요하다.

 

입력을 보면 0으로만 이루어진 라인이 있고, 그렇지 않은 경우에는 모두 같은 형태를 띄고 있다.

 

하여 입력 중 하나의 라인만 가져와 작업하도록 하였다.

 

0000011101101100010111011011000101100010001101001001101110110000000000

 

암호코드를 보면 0-9까지 모두 0으로 시작해 1로 끝나는 것을 알 수 있다. 

 

이를 통해 알 수 있는 사실은, 오른쪽에 있는 0들은 모두 필요없는 수라는 것이다.

 

000001110110110001011101101100010110001000110100100110111011

 

0을 모두 제거하고 오른쪽 끝에서부터 7개씩 끊어 값을 대조한 후,

 

나머지 연산을 수행해 답을 구하면 된다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class 단순2진암호코드 {
	static String passwords;
	static String codes[] = {
			"0001101", // 0
			"0011001", // 1
			"0010011", // 2
			"0111101", // 3
			"0100011", // 4
			"0110001", // 5
			"0101111", // 6
			"0111011", // 7
			"0110111", // 8
			"0001011"  // 9
	};
	static int sum[] = new int[9];
	
	public static int Verification() {
		int n1 = 0, n2 = 0;
		
		for (int i = 1; i < sum.length; i++) {
			if (i % 2 == 1) n1 += sum[i];
			else if (i % 2 == 0) n2 += sum[i];
		}
		
		if (((n1 * 3) + n2) % 10 == 0) return n1 + n2;
		else return 0;
	}
	
	public static int Encode() {
		int idx = 8;
		
		for (int i = passwords.length() - 1; i > 0; i--) {
			if (passwords.charAt(i) != '0') {
				passwords = passwords.substring(0, i + 1);
				break;
			}
		}
	
		for (int i = passwords.length(); i > 7; i--) {
			String temp = passwords.substring(i - 7, i);
			if (Arrays.asList(codes).contains(temp)){
				passwords = passwords.substring(0, i - 7);
				sum[idx--] = Arrays.asList(codes).indexOf(temp);
				i = passwords.length() + 1;
			}
		}
		
		return Verification();
	}
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		int T = Integer.parseInt(br.readLine());
		for (int test_case = 1; test_case <= T; test_case++) {
			st = new StringTokenizer(br.readLine());
			int N = Integer.parseInt(st.nextToken());
			int M = Integer.parseInt(st.nextToken());
			
			passwords = "";
			
			for (int i = 0; i < N; i++) {
				boolean flag = false;
				String str = br.readLine();
				for (int k = 0; k < M; k++)
					if (str.charAt(k) == '1') {
						flag = true;
						break;
					}
				
				if (flag) for (int j = 0; j < M; j++) passwords = str;
			}
			
			System.out.println("#" + test_case + " " + Encode());
		}
	}
}

 

 

댓글