너지살 2023. 8. 8. 00:33

 

 

링크

https://softeer.ai/practice/info.do?idx=1&eid=624&sw_prbl_sbms_sn=246435 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

 

 

문제 풀이

전광판의 숫자가 변할 때 몇 개의 전등의 스위치를 눌러야 하는지를 구해야 합니다. 

 

이 때 전광판의 한 글자의 전등은 7개로 구성되어 있습니다.

먼저, 이 7개의 전등의 임의의 순서를 부여하여 어떤 숫자가 몇 번 전광판을 눌러야 하는지를 2차원 배열로 저장했습니다. 

 

그 후 숫자 2개를 String으로 입력받았습니다.

String으로 받은 이유는 한 글자씩 비교하기 편했고 자릿수 차이로 인해 불이 꺼진 전광판을 N 으로 구분하기 위해서 였습니다. 

숫자 2개의 길이를 비교해서 길이가 짧은 쪽에 N을 추가해 길이가 긴 쪽과 같은 길이를 만들도록 했습니다.

그 다음 한 글자씩 비교해서 전등을 몇 번 눌러야 하는지를 구했습니다.

이 때 한 쪽에 N이 있으면 나머지 숫자의 전등은 모두 끄든, 키든 해야 함으로 전부 더해줬습니다.

양쪽에 N이 없다면 전등을 비교하여 몇 개의 전등의 스위치를 눌러야 하는지 계산해서 정답을 구했습니다.

 

 

소스 코드 

import java.util.*;
import java.io.*;

/*
숫자별 눌러야 하는 부분을 배열로 저장  

전의 숫자와 후의 숫자의 같은 자릿수의 하나씩 비교

배열을 비교해 다른 부분을 세어준다. 

*/


public class Main
{
    // 0 ~ 9 까지 번호의 어떤 부분이 불이 들어와야하는지 저장
    public static void init() {
        numberLight = new int[10][7]; 

        // 0
        numberLight[0][0] = 1;
        numberLight[0][1] = 1;
        numberLight[0][2] = 1;
        numberLight[0][4] = 1;
        numberLight[0][5] = 1;
        numberLight[0][6] = 1;


        // 1 
        numberLight[1][2] = 1;
        numberLight[1][5] = 1;

        // 2 
        numberLight[2][0] = 1;
        numberLight[2][2] = 1;
        numberLight[2][3] = 1;
        numberLight[2][4] = 1;
        numberLight[2][6] = 1;

        // 3 
        numberLight[3][0] = 1;
        numberLight[3][2] = 1;
        numberLight[3][3] = 1;
        numberLight[3][5] = 1;
        numberLight[3][6] = 1;

        // 4
        numberLight[4][1] = 1;
        numberLight[4][2] = 1;
        numberLight[4][3] = 1;
        numberLight[4][5] = 1;

        // 5
        numberLight[5][0] = 1;
        numberLight[5][1] = 1;
        numberLight[5][3] = 1;
        numberLight[5][5] = 1;
        numberLight[5][6] = 1;

        // 6 
        numberLight[6][0] = 1;
        numberLight[6][1] = 1;
        numberLight[6][3] = 1;
        numberLight[6][4] = 1;
        numberLight[6][5] = 1;
        numberLight[6][6] = 1;

        // 7
        numberLight[7][0] = 1;
        numberLight[7][1] = 1;
        numberLight[7][2] = 1;
        numberLight[7][5] = 1;

        // 8 
        numberLight[8][0] = 1;
        numberLight[8][1] = 1;
        numberLight[8][2] = 1;
        numberLight[8][3] = 1;
        numberLight[8][4] = 1;
        numberLight[8][5] = 1;
        numberLight[8][6] = 1;

        // 9 
        numberLight[9][0] = 1;
        numberLight[9][1] = 1;
        numberLight[9][2] = 1;
        numberLight[9][3] = 1;
        numberLight[9][5] = 1;
        numberLight[9][6] = 1;
        

    }

    static int T; // 테스트 케이스 
    static String before; // 전 자연수
    static String after; // 후 자연수 

    static StringBuilder sb; 
    static StringTokenizer st;

    static int[][] numberLight; 

    public static void main(String args[]) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
        sb = new StringBuilder(); 

        init(); 

        T = Integer.parseInt(br.readLine()); 
        for(int seq = 0; seq < T; seq++) {
            st = new StringTokenizer(br.readLine());
            before = st.nextToken();
            after = st.nextToken(); 

            solution(before, after);
        }
        System.out.println(sb); 
    }

    public static void solution(String before, String after) {
        int beforeLength = before.length();
        int afterLength = after.length(); 

        StringBuilder strbuild = new StringBuilder(); 

        // 자릿수가 다르면 N을 추가해서 자릿수를 같게 해준다. 
        if(beforeLength > afterLength) {
            for(int i = 0; i < beforeLength - afterLength; i++) {
                strbuild.append("N");
            }
            String data = strbuild.toString(); 
            after = data + after;
        }
        else {
               for(int i = 0; i < afterLength - beforeLength ; i++) {
                strbuild.append("N");
            }
            String data = strbuild.toString(); 
            before = data + before;
        }



        int answer = 0; 

        
        // N이 있다면 불이 꺼진 경우이므로 불이 켜진 스위치를 전부 더한다.
        // N이 없다면 숫자가 있다는 것이니 숫자의 차이만큼 스위치 더한다. 
        for(int i = 0; i < after.length(); i++) {

            int check = 0;

            if(before.charAt(i) == 'N') {
                int afterNum = (int)(after.charAt(i) - '0'); 
                for(int j = 0; j < 7; j++) {    
                    if(numberLight[afterNum][j] == 1) {
                        check++;
                    }
                }
            }
            else if(after.charAt(i) == 'N') {
                int beforeNum = (int)(before.charAt(i) - '0');
                for(int j = 0; j < 7; j++) {
                    if(numberLight[beforeNum][j] == 1) {
                        check++;
                    }
                }
            }
            else {
                int beforeNum = (int)(before.charAt(i) - '0');
                int afterNum = (int)(after.charAt(i) - '0'); 

                if(beforeNum != afterNum) {
                    for(int j = 0; j < 7; j++) {
                        if(numberLight[beforeNum][j] != numberLight[afterNum][j]) {
                            check++;
                        }
                    }
                }
            }
            // System.out.println(beforeNum + " " + afterNum + " " + check);
            answer += check;
        }

        sb.append(answer).append("\n");

    }
}