본문 바로가기

코딩 테스트/BAEKJOON

[Java] 2290 LCD Test

문제

문제
지민이는 새로운 컴퓨터를 샀다. 
하지만 새로운 컴퓨터에 사은품으로 온 LC-디스플레이 모니터가 잘 안나오는 것이다.
지민이의 친한 친구인 지환이는 지민이의 새로운 모니터를 위해 테스트 할 수 있는 프로그램을 
만들기로 하였다.

입력
첫째 줄에 두 개의 정수 s와 n이 들어온다.
(1 ≤ s ≤ 10, 0 ≤ n ≤ 9,999,999,999)이다. n은 LCD 모니터에 나타내야 할 수 이며, s는 크기이다.

출력
길이가 s인 '-'와 '|'를 이용해서 출력해야 한다. 
각 숫자는 모두 s+2의 가로와 2s+3의 세로로 이루어 진다. 
나머지는 공백으로 채워야 한다. 
각 숫자의 사이에는 공백이 한 칸 있어야 한다.

문제 풀이

아래 처럼 패널의 영역을 나누어서 숫자별로 영역들에 표시를 하도록 작성한다.

출처 : https://cnu-jinseop.tistory.com/97

자바 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class N2290 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        int s = Integer.parseInt(st.nextToken());
        String number = st.nextToken();
        char[][] panel = new char[2 * s + 3][(s + 2) * number.length() + number.length() - 1];

        // 패널에 공백으로 초기화
        // 나중에 숫자를 채워넣을 때 숫자 사이의 공백을 미리 채워넣기 위함
        for (char[] chars : panel) {
            Arrays.fill(chars, ' ');
        }

        // 입력받은 number를 한자씩 끊어서 패널에 프린트
        for(int i = 0; i < number.length(); i++){
            numberPrint(number.charAt(i) - '0', i, s, panel);
        }
    
        // 결과 출력
        for (char[] chars : panel) {
            for (char aChar : chars) {
                System.out.print(aChar);
            }
            System.out.println();
        }
    }

    // 숫자별로 몇 번째 세그먼트를 활성화 할지 지정한다.
    public static void numberPrint(int num, int loc, int size,char[][] panel){
        int x = loc * (size + 3);
        int y = 0;
        if(num == 1){
            segmentPrint(x, y, size, panel, 1);
            segmentPrint(x, y, size, panel, 2);
        }
        else if(num ==2){
            segmentPrint(x, y, size, panel, 1);
            segmentPrint(x, y, size, panel, 3);
            segmentPrint(x, y, size, panel, 4);
            segmentPrint(x, y, size, panel, 5);
            segmentPrint(x, y, size, panel, 7);
        }else if(num == 3){
            segmentPrint(x, y, size, panel, 1);
            segmentPrint(x, y, size, panel, 2);
            segmentPrint(x, y, size, panel, 3);
            segmentPrint(x, y, size, panel, 4);
            segmentPrint(x, y, size, panel, 5);
        }
        else if(num == 4){
            segmentPrint(x, y, size, panel, 1);
            segmentPrint(x, y, size, panel, 2);
            segmentPrint(x, y, size, panel, 4);
            segmentPrint(x, y, size, panel, 6);
        }
        else if(num == 5){
            segmentPrint(x, y, size, panel, 2);
            segmentPrint(x, y, size, panel, 3);
            segmentPrint(x, y, size, panel, 4);
            segmentPrint(x, y, size, panel, 5);
            segmentPrint(x, y, size, panel, 6);
        }
        else if(num == 6){
            segmentPrint(x, y, size, panel, 2);
            segmentPrint(x, y, size, panel, 3);
            segmentPrint(x, y, size, panel, 4);
            segmentPrint(x, y, size, panel, 5);
            segmentPrint(x, y, size, panel, 6);
            segmentPrint(x, y, size, panel, 7);
        }
        else if(num == 7){
            segmentPrint(x, y, size, panel, 1);
            segmentPrint(x, y, size, panel, 2);
            segmentPrint(x, y, size, panel, 3);
        }
        else if(num ==8){
            segmentPrint(x, y, size, panel, 1);
            segmentPrint(x, y, size, panel, 2);
            segmentPrint(x, y, size, panel, 3);
            segmentPrint(x, y, size, panel, 4);
            segmentPrint(x, y, size, panel, 5);
            segmentPrint(x, y, size, panel, 6);
            segmentPrint(x, y, size, panel, 7);
        }
        else if(num == 9){
            segmentPrint(x, y, size, panel, 1);
            segmentPrint(x, y, size, panel, 2);
            segmentPrint(x, y, size, panel, 3);
            segmentPrint(x, y, size, panel, 4);
            segmentPrint(x, y, size, panel, 5);
            segmentPrint(x, y, size, panel, 6);
        }
        else if(num == 0){
            segmentPrint(x, y, size, panel, 1);
            segmentPrint(x, y, size, panel, 2);
            segmentPrint(x, y, size, panel, 3);
            segmentPrint(x, y, size, panel, 5);
            segmentPrint(x, y, size, panel, 6);
            segmentPrint(x, y, size, panel, 7);
        }
    }

    // 각 세그먼트별로 패널에 출력한다.
    public static void segmentPrint(int x, int y, int size, char[][] panel, int segNum){
        if(segNum == 1){
            int pos = 1;
            for(int i = 0; i < size; i++) {
                panel[i + pos][x + size + 1] = '|';
            }
        }
        else if(segNum == 2){
            int pos = size + 2;
            for(int i = 0; i < size; i++){
                panel[i + pos][x + size + 1] = '|';
            }
        }
        else if(segNum == 3){
            for(int i = 0; i < size; i++){
                panel[y][i + x + 1] = '-';
            }
        }
        else if(segNum == 4){
            int pos = size + 1;
            for(int i = 0; i < size; i++){
                panel[y + pos][i + x + 1] = '-';
            }
        }
        else if(segNum == 5){
            int pos = 2 * size + 2;
            for(int i = 0; i < size; i++){
                panel[y + pos][i + x + 1] = '-';
            }
        }
        else if(segNum == 6){
            for(int i = 0; i < size; i++){
                panel[y + i + 1][x] = '|';
            }
        }
        else if(segNum == 7){
            int pos = size + 2;
            for(int i =0 ; i < size; i++){
                panel[y + i + pos][x] = '|';
            }
        }
    }
}

 

'코딩 테스트 > BAEKJOON' 카테고리의 다른 글

[Java] 16927 배열 돌리기 2  (0) 2024.05.09
[Java] 16926 배열돌리기 1  (0) 2024.05.09
[Java] 16931 겉넓이 구하기  (0) 2024.05.08
[Java] 16967 배열 복원하기  (0) 2024.05.07
[Java] 16920 확장게임  (0) 2024.05.02