Developing Myself Everyday
 

SW Expert Academy

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

swexpertacademy.com

 

문제와 관련된 내용은 위의 링크에서 확인할 수 있습니다.


 

 

 

 

나의 풀이

이 문제는 크게 3 단계로 문제가 구성되어 있다고 생각할 수 있습니다.

 

단계 1 -  직사각형 배열에서 암호코드 정보 찾기

문제에서 주어지는 직사각형 배열에서 필요한 암호코드는 사실 단 한줄입니다. 그렇기 때문에 직사각형 배열을 쭉 읽어 나가다가, 1이 포함된 줄이 있으면 해당 줄로만 암호 코드 계산할 수 있습니다.

 

 

단계 2 - 암호코드 정보에서 암호코드 찾기

단계 1에서 얻은 암호코드 정보는 아래와 같을 것입니다.

 

00000000000000011101101100010111011011000101100010001101001001101110110000000000

 

여기서 불필요한 0을 제거해야 하는데, 문제를 자세히 보면 모든 암호코드의 마지막 숫자가 1인 것을 확인할 수 있습니다.

 

저는 이 정보를 바탕으로 뒤에서부터 암호코드를 찾고자 했습니다. 1이 나올때까지 불필요한 0은 제거하고, 7개씩 암호코드 정보를 잘라서 암호코드를 얻었습니다.

 

7개씩 암호코드 정보를 얻은 다음에 다음 암호코드 정보의 마지막 숫자가 1이 아니라면 탐색은 종료했습니다.

 

 

단계 3 - 암호코드 판별하기

마지막은 암호코드가 옮은 암호코드인지 판별하는 부분입니다. 이는 짝수 번째와 홀수 번째를 구하고 이를 계산하면 되는 단순한 계산입니다.

 

 

이를 구현한 코드는 아래와 같습니다.

import java.util.*;

class Solution {

    static String[][] passwords = {
            {"0", "0", "0", "1", "1", "0", "1"},
            {"0", "0", "1", "1", "0", "0", "1"},
            {"0", "0", "1", "0", "0", "1", "1"},
            {"0", "1", "1", "1", "1", "0", "1"},
            {"0", "1", "0", "0", "0", "1", "1"},
            {"0", "1", "1", "0", "0", "0", "1"},
            {"0", "1", "0", "1", "1", "1", "1"},
            {"0", "1", "1", "1", "0", "1", "1"},
            {"0", "1", "1", "0", "1", "1", "1"},
            {"0", "0", "0", "1", "0", "1", "1"}
    };

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T;
        T = sc.nextInt();

        for (int test_case = 1; test_case <= T; test_case++) {
            int n = sc.nextInt();
            int m = sc.nextInt();

            String[][] lines = new String[n][m];
            for (int i = 0; i < n; i++) {
                lines[i] = sc.next().split("");
            }

            List<String> secretCode = new ArrayList<>(findSecretCode(lines));
            
            for (int i = secretCode.size() - 1; i >= 0; i--) {
                if (secretCode.get(i).equals("1")) {
                    break;
                }
                secretCode.remove(secretCode.size() - 1);
            }


            List<Integer> passwordCodes = new ArrayList<>(findPasswordCodes(secretCode));

            Collections.reverse(passwordCodes);

            System.out.println("#" + test_case + " " + defineIsRight(passwordCodes));
        }

        sc.close();
    }

    static List<String> findSecretCode(String[][] lines) {
        for (String[] line : lines) {
            boolean check = false;

            for (String code : line) {
                if (code.equals("1")) {
                    check = true;
                    break;
                }
            }

            if (check) {
                return Arrays.asList(line);
            }
        }
        
        return new ArrayList<>();
    }
    
    static List<Integer> findPasswordCodes(List<String> secretCode) {
        List<Integer> passwordCodes = new ArrayList<>();
        int i = secretCode.size() - 1;
        while (i >= 0) {
            List<String> temp = new ArrayList<String>();
            for (int j = 0; j < 7; j++) {
                temp.add(secretCode.get(i));
                i--;
            }

            Collections.reverse(temp);

            for (int k = 0; k < 10; k++) {
                if (Arrays.equals(passwords[k], temp.toArray())) {
                    passwordCodes.add(k);
                    break;
                }
            }

            if (secretCode.get(i).equals("0")) {
                break;
            }
        }
        
        return passwordCodes;
    }
    
    static int defineIsRight(List<Integer> passwords) {
        int odd = 0;
        int even = 0;
        for (int i = 1; i < 9; i++) {
            if (i % 2 == 1) {
                odd += passwords.get(i - 1);
            } else {
                even += passwords.get(i - 1);
            }
        }

        if ((odd * 3 + even) % 10 == 0) {
            return odd + even;
        }

        return 0;
    }
}
profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!