코드굽는 타자기

SWEA[1240] - 단순 2진 암호코드[D3] 본문

알고리즘/Simulation

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

bright-jun 2020. 2. 17. 15:52

링크

SWEA[1240]

문제설명

  • 시뮬

문제풀이

  • 시뮬

문제코드

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

public class Solution1240 {
    public static void main(String args[]) throws Exception
    {    
        System.setIn(new FileInputStream("res/swea/1240.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T;
        T=Integer.parseInt(br.readLine().trim());

        for(int test_case = 1; test_case <= T; test_case++)
        {
            int ans=0;
            StringTokenizer st = new StringTokenizer(br.readLine().trim()," ");
            int N=Integer.parseInt(st.nextToken());
            int M=Integer.parseInt(st.nextToken());
            StringBuilder[] code = new StringBuilder[N];
            for (int i = 0; i < N; i++) {
                code[i] = new StringBuilder(br.readLine());
            }
            int [] decode = new int[8];

//            decode 시작점 찾기
            int si=0;
            int sj=0;
            top:
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M-14; j++) {
                    String num = code[i].substring(j,j+7);
                    String num2 = code[i].substring(j+7,j+14);
                    if(    (num.equals("0001101") ||           
                        num.equals("0011001") ||           
                        num.equals("0010011") ||           
                        num.equals("0111101") ||           
                        num.equals("0100011") ||           
                        num.equals("0110001") ||           
                        num.equals("0101111") ||           
                        num.equals("0111011") ||           
                        num.equals("0110111") ||           
                        num.equals("0001011")) &&
                        (num2.equals("0001101") ||           
                        num2.equals("0011001") ||           
                        num2.equals("0010011") ||           
                        num2.equals("0111101") ||           
                        num2.equals("0100011") ||           
                        num2.equals("0110001") ||           
                        num2.equals("0101111") ||           
                        num2.equals("0111011") ||           
                        num2.equals("0110111") ||           
                        num2.equals("0001011"))) {           
                        si=i;                              
                        sj=j;                              
                        break top;                         
                    }                                      
                }                                          
            }                                              


            for (int m = 0; m < 8; m++) {
                String num = code[si].substring(sj+m*7, sj+(m+1)*7);
                if(num.equals("0001101")) {
                    decode[m]=0;
                }else if(num.equals("0011001")) {
                    decode[m]=1;
                }else if(num.equals("0010011")) {
                    decode[m]=2;
                }else if(num.equals("0111101")) {
                    decode[m]=3;
                }else if(num.equals("0100011")) {
                    decode[m]=4;
                }else if(num.equals("0110001")) {
                    decode[m]=5;
                }else if(num.equals("0101111")) {
                    decode[m]=6;
                }else if(num.equals("0111011")) {
                    decode[m]=7;
                }else if(num.equals("0110111")) {
                    decode[m]=8;
                }else if(num.equals("0001011")) {
                    decode[m]=9;
                }
                else {
                    decode[m]=-1;
                }
            }
            int gum=0;
            gum = (decode[0] + decode[2] + decode[4] + decode[6])*3
                    + decode[1] + decode[3] + decode[5] + decode[7];
            if(gum%10==0) {
                for (int k = 0; k < 8; k++) {
                    ans+=decode[k];
                }
            }
            System.out.println("#"+test_case+" "+ans);
        }
    }
}

아쉬운점

  • 7번째 테케
    • 000001011110을 앞에서 체크해보면
    • 9:0001011
    • 6:0101111 둘다 가능
    • 2칸 검사해야함

잘한점

  • 구현

다른 풀이

  • 0과 1 갯수의 비율 1:3:2:1 같은 경우 뒤에 3개만 가지고 식별가능
  • lastIndexOf 메서드 사용하면 뒤에서부터 검사 가능

'알고리즘 > Simulation' 카테고리의 다른 글

SWEA[5650] - 핀볼 게임  (0) 2020.02.19
SWEA[5656] - 벽돌 깨기  (1) 2020.02.19
SWEA[1211] - Ladder2[D4]  (0) 2020.02.17
SWEA[1210] - Ladder1[D4]  (0) 2020.02.17
SWEA[2382] - 미생물 격리  (0) 2020.02.14
Comments