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

20783 단어 JavaSWEAalgorithmJava

Link

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


Code

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

class Solution {

    public static void main(String args[]) throws Exception {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("0001101", 0);
        map.put("0011001", 1);
        map.put("0010011", 2);
        map.put("0111101", 3);
        map.put("0100011", 4);
        map.put("0110001", 5);
        map.put("0101111", 6);
        map.put("0111011", 7);
        map.put("0110111", 8);
        map.put("0001011", 9);
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), "");
        int T = Integer.parseInt(st.nextToken());
        for (int testCase = 1; testCase <= T; testCase++) {
            st = new StringTokenizer(br.readLine(), " ");
            int N = Integer.parseInt(st.nextToken());
            int M = Integer.parseInt(st.nextToken());
            String[] arr = new String[N];
            for (int i = 0; i < N; i++) {
                st = new StringTokenizer(br.readLine(), " ");
                arr[i] = st.nextToken();
            }
            int result = 0;
            boolean flag = true;
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M - 55; j++) {
                    String code = arr[i].substring(j, j + 56);
                    int check = 0;
                    for (int k = 0; k < 8; k++) {
                        String temp = code.substring(k * 7, k * 7 + 7);
                        if (!map.containsKey(temp)){
                            result = 0;
                            break;
                        }
                        else {
                            result += map.get(temp);
                            if (k % 2 == 0) {
                                check += 3 * map.get(temp);
                            }
                            else {
                                check += map.get(temp);
                            }
                        }
                    }
                    if (check > 0 && check % 10 == 0) {
                        System.out.printf("#%d %d\n", testCase, result);
                        flag = false;
                    }
                    if (!flag) {
                        break;
                    }
                }
                if (!flag) {
                    break;
                }
            }
            if (flag) {
                System.out.printf("#%d %d\n", testCase, 0);
            }
        }
    }
}

Solution

Hashmap을 초기화할때 put을 반복해서 초기화한게 걸린다. 검색해서 나온 방법으로 할때 IntelliJ컴파일러에서는 가능했지만 SWEA 컴파일러에서는 오류가 발생하여 어쩔수없이 put으로 바꿨다. 다음에 다시 시도해봐야겠다.
일단 arr를 입력받은다음 한 row를 56글자 단위로 자르고 다시 7글자 단위로 잘라 그 코드가 hashmap에 존재하는지 안하는지 체크, 존재하지않으면 break, 아니면 복호화하여 result와 check에 각각 맞게 대입하고 check를 통해 암호코드를 검증, 맞으면 result를 출력하고 아니면 0을 출력하게된다.
세로 길이는 체크하지않아도 정답이 나와 작성하지 않았다.

좋은 웹페이지 즐겨찾기