개발자 톡

연습문제 톡 [21년 재직자 대회 예선] 전광판

java - 정답 코드

등록일
2025-01-29 19:27:28
조회수
10
작성자
tjsqls2067
import java.io.*;
import java.util.*;


public class Main {
    // 전광판 기록 배열 생성
    private static int CNT_OF_NUM = 5;
    private static int SWITH_OF_ONE_NUM = 7;
    private static int[][] board = new int[CNT_OF_NUM][SWITH_OF_ONE_NUM];
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);


        int T = Integer.parseInt(sc.nextLine());


        // 1. 각 숫자 스위치 플래그를 배열에 저장
        int[][] numPosArr = {
            {1,1,1,0,1,1,1}, // 0
            {0,0,1,0,0,1,0}, // 1
            {1,0,1,1,1,0,1}, // 2
            {1,0,1,1,0,1,1}, // 3
            {0,1,1,1,0,1,0}, // 4
            {1,1,0,1,0,1,1}, // 5
            {1,1,0,1,1,1,1}, // 6
            {1,1,1,0,0,1,0}, // 7
            {1,1,1,1,1,1,1}, // 8
            {1,1,1,1,0,1,1} // 9
        };

        // 2. T개의 해당하는 테스트 케이스 순회
        for(int cnt = 0; cnt < T; cnt++){
            initBoard();
            String[] strs = sc.nextLine().split(" ");
            String[] A = strs[0].split("");
            String[] B = strs[1].split("");

            // 2-1. 스위치 ON/OFF CNT 변수 생성
            int cntOnOff = 0;

            // 3. A에 해당하는 숫자를 자릿수 별로 나누기
            for(int i = A.length - 1; i >= 0; i--){
                int numOfA = Integer.parseInt(A[i]);
                int[] rowOfNum = numPosArr[numOfA];
                int[] rowOfBoard = board[CNT_OF_NUM - (A.length - i)];  

                for(int j = 0; j < SWITH_OF_ONE_NUM; j++){
                    if(rowOfNum[j] != rowOfBoard[j]){
                        rowOfBoard[j] = rowOfNum[j];
                    }
                }
            }

            // 4. B에 해당하는 숫자를 자릿수 별로 나누기
            // 4-1. 현재 전광판과 각 숫자에 대해 ON/OFF 플래그가 다른 지점을 CNT 더해줌
            for(int i = B.length - 1; i >= 0; i--){
                int numOfB = Integer.parseInt(B[i]);
                int[] rowOfNum = numPosArr[numOfB];
                int[] rowOfBoard = board[CNT_OF_NUM - (B.length - i)];  

                // 4-2. 스위치 ON/OFF한 CNT를 더해줌
                for(int j = 0; j < SWITH_OF_ONE_NUM; j++){
                    if(rowOfNum[j] != rowOfBoard[j]){
                        cntOnOff++;
                        rowOfBoard[j] = rowOfNum[j];
                    }
                }
            }

            // B의 길이보다 긴 A 자릿수 고려
            if(A.length > B.length){
                for(int i = 0; i < A.length - B.length; i++){
                    int numOfA = Integer.parseInt(A[i]);
                    for(int tmp : numPosArr[numOfA]){
                        cntOnOff += tmp;
                    }
                }
            }

            System.out.println(cntOnOff);
        }
    }


    private static void initBoard(){
        for(int i = 0; i < CNT_OF_NUM; i++){
            for(int j = 0; j < SWITH_OF_ONE_NUM; j++){
                board[i][j] = 0;
            }
        }
    }
}


#[21년_재직자_대회_예선]_전광판

이 카테고리의 톡 더보기