SWEA

SWEA 1240 단순 2진 암호코드 by JAVA

리콜 2023. 10. 30. 20:58

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

 

SW Expert Academy

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

swexpertacademy.com

 

문제에서 정해준 값들은 

T = 테스트 케이스 갯수

N = 입력되는 배열의 세로

M = 입력되는 배열의 가로

 

그리고

핵심적으로 각 암호 숫자가 어떤 값을 의미하는지 알려주었다.

0001101 = 0
0011001 = 1
0010011 = 2
0111101 = 3
0100011 = 4
0110001 = 5
0101111 = 6
0111011 = 7
0110111 = 8
0001011 = 9

로 값을 정해주었다.

 

문제 화면에서는 밑에 0 과 1의 비율도 알려주는데 그냥 헷갈리도록 하는 장치 인것 같다.

 

그리고 N x M 의 배열에 7개의 비트로 8자리인 가로가 56자리 0과 1로 이루어진 암호코드가 랜덤한 자리에 주어진다.

 

이안에서 해당 암호가 옳바른 암호인지 구별하기 위해 (홀수 자리의 합 x 3) + (짝수 자리의 합)이 10의 배수인지 확인한뒤

10의 배수 라면 모두 더한 값을 출력하고 

아니라면 0을 출력하여 잘못되었다고 한다.

 

내가 제출한 코드는 다음과 같

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

public class Solution {

    static List<String> answer = Arrays.asList("0001101", "0011001", "0010011", "0111101", "0100011", "0110001","0101111", "0111011","0110111", "0001011");
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T;
        T =Integer.parseInt(br.readLine());

        for(int test_case = 1; test_case <= T; test_case++) {
            StringTokenizer st = new StringTokenizer(br.readLine() , " " );
            int n,m;
            String[] answerBycode = new String[8];
            n = Integer.parseInt(st.nextToken());
            m = Integer.parseInt(st.nextToken());

            int[][] code = new int[n][m];
            int line =-1;
            //암호 코드 다 넣기
            for(int i = 0; i < n;i++){
                String str = br.readLine();
                for(int j =0; j<m;j++){
                    code[i][j] = Character.getNumericValue(str.charAt(j));
                    if(code[i][j] == 1 && line == -1){
                        line = i;
                    }
                }
            }
            String str = Arrays.toString(code[line]).replaceAll("[^0-9]", "");

            int index = str.lastIndexOf("1") - 55;
            int indexEnd = index + 7;

            for(int i =0; i<8;i++){
                answerBycode[i] = str.substring(index+(7*i) ,indexEnd + (7 *i));

                answerBycode[i] = matchAnswer(answerBycode[i]);
            }
            int result = verf(answerBycode);
            System.out.println("#" + test_case + " "+ result);


        }
    }
    public static String matchAnswer(String answerByCode){
        int find = answer.indexOf(answerByCode);
        if(find != -1){
            return Integer.toString(find);
        }
        return Integer.toString(0);
    }

    public static int verf(String[] answerBycode){
        int result = 0;
        for(int i = 0; i<8;i++){
            if((i + 1) %2 == 0){ //짝수
                result += Integer.parseInt(answerBycode[i]);

            }
            if((i +1) %2 != 0){ //홀수
                result += 3* Integer.parseInt(answerBycode[i]);
            }
        }
        System.out.println(result);
        if(result % 10 == 0){ // 올바른 코드
            result = 0;
            for(int i=0;i<8;i++){
                result += Integer.parseInt(answerBycode[i]);

            }
            return result;
        }
        return 0;
    }

}

먼저 입력은 다 받아야하니 이중 for문으로 값을 받아 넣어준다. 그러다 암호코드가 들어간 열을 발견하면 해당열을 line이라는 변수에 기록해둔다.

 

그 뒤 배열을 string으로 변환한뒤 제일 뒤에서 1을 찾는다.

이유는 주어진 암호 값들을 보면 제일 뒤가 1로 끝나는 것을 알 수 있다.

따라서 제일 끝에 1을 찾은뒤 일정 숫자를 빼주면 첫번째 자리를 찾을 수 있다.

 

그리고 substring을 이용하여 7자리씩 옮겨가며 잘라 배열에 넣어준다.

그 뒤 주어진 암호와 비교하는 matchAnswer로 비교한뒤 값을 넣어준다.

 

받은 배열을 다시 주어진 조건에 맞는지 확인하는 verf함수에 넣어 확인하고 값을 받아

출력해준다. 

 

 

반응형