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

hyng·2022년 1월 5일
0

SWEA

목록 보기
1/78
post-custom-banner

처음 문제를 읽었을 때 설명이 이해가 안 갔다.
그래서 다른 블로그들의 글을 참고해서 풀었다.

solution

문제에서 주어지는 암호 코드를 보면 모든 암호코드가 "1"로 끝나는 것을 볼 수 있다.
그래서 아래의 과정으로 코드를 짜면 되는데,

  1. nm 크기의 배열을 전부 입력받아 끝 인덱스(nm-1)부터 값이 1인 인덱스를 찾는다.
  2. 해당 인덱스까지 총 길이가 8*7 = 56인 문자열을 찾는다. 이때 찾은 문자열이 검증해야 하는 암호코드이다.
  3. 이제 찾은 암호코드를 문제에서 주어지는 방법으로 검증하면 된다.

code

import java.util.*;

class Solution
{
    static HashMap<String, Integer> table = new HashMap<>();

	public static void main(String args[]) throws Exception
	{
		Scanner sc = new Scanner(System.in);

        StringBuffer sb = new StringBuffer();

        table.put("0001101",0);
        table.put("0011001",1);
        table.put("0010011",2);
        table.put("0111101",3);
        table.put("0100011",4);
        table.put("0110001",5);
        table.put("0101111",6);
        table.put("0111011",7);
        table.put("0110111",8);
        table.put("0001011",9);


        int T = Integer.parseInt(sc.nextLine());



       
        for(int tc=1; tc<=T; tc++){
            String input[] = sc.nextLine().split(" ");

            int N = Integer.parseInt(input[0]);
            int M = Integer.parseInt(input[1]);
    
            sb.append("#").append(tc).append(" ");

            StringBuffer code = new StringBuffer();
            for(int i=0; i<N; i++){
                input = sc.nextLine().split("");
                for(int j=0; j<M; j++){
                    code.append(input[j]);
                }
            }
            //57길이의 암호코드 찾음.
            String passCode = "";
            for(int s=code.length()-1; s>=0; s--){
                if(code.charAt(s)-'0' == 1){
                    passCode = code.substring(s - 55, s+1);
                    break;
                }
            }
            //암호코드 확인
            sb.append(isCorrect(passCode)).append("\n");


           
        }
        System.out.println(sb);
        
	}
    static int isCorrect(String passCode){
        StringBuffer parsedPassCode = new StringBuffer();
        
        //짝수 홀수 인덱스를 찾기 쉽도록 앞에 0을 삽입한다.
        parsedPassCode.append(0);

        int sum = 0;
        int start = 0;

        while(start + 7 <= passCode.length()){
            String s = passCode.substring(start, start+7);
            int num = table.get(s);
            parsedPassCode.append(num);
            sum += num;
            start += 7;
        }
        int oddSum = 0;
        int evenSum = 0;
        oddSum += parsedPassCode.charAt(1)-'0' + parsedPassCode.charAt(3)-'0' + parsedPassCode.charAt(5)-'0' + parsedPassCode.charAt(7)-'0';
        evenSum += parsedPassCode.charAt(2)-'0' + parsedPassCode.charAt(4)-'0' + parsedPassCode.charAt(6)-'0';

        int verificationCode = oddSum * 3 + evenSum + parsedPassCode.charAt(8)  -'0';

        return verificationCode % 10 == 0 ? sum : 0;
    }
}
profile
공부하고 알게 된 내용을 기록하는 블로그
post-custom-banner

0개의 댓글