백준-시그널(16113)

정민주·2024년 7월 3일

코테

목록 보기
22/95

⭐문제

문제 설명

해당 문제는 숫자가 #(검은색) .(흰색)으로 나타나 있는 5개의 긴 행 만큼의 문자열이 하나의 형태로 붙여서 주어진다. 이를 적절하게 잘라 입력에서 나타내고 있는 숫자를 구하는 문제이다.

풀이

  1. 긴 문자열을 5개의 행으로 잘라 배열에 넣는다.
  2. 열의 최대치는 입력값 길이/5로 설정한 다음 for문을 0부터 돌린다.
  3. #을 만날 경우, 숫자를 만났다는 의미이므로 해당하는 숫자를 찾고, 해당 문자열의 크기만큼 i를 늘린 후 다시 for 문을 진행한다.

  • 예를 들어 81이라는 숫자의 문자열의 입력은 다음과 같다.
    40(총 문자열 길이)
    ###..#..#.#..#..###..#..#.#..#..###..#..
  1. 위 입력값을 5개의 행으로 구분하여 배열에 넣는다.
    map[0] = ['#', '#', '#', '.', '.', '#', '.', '.']
    map[1] = ['#', '.', '#', '.', '.', '#', '.', '.']
    map[2] = ['#', '#', '#', '.', '.', '#', '.', '.']
    map[3] = ['#', '.', '#', '.', '.', '#', '.', '.']
    map[4] = ['#', '#', '#', '.', '.', '#', '.', '.']
  1. for문을 0부터 8(40/5) 까지 돌리며 #을 만난 경우, 해당하는 숫자를 찾는다.
  1. [0][0]에서 #을 바로 만났기에, 해당하는 숫자인 8을 찾은 후 i은 i+3을 하여 4부터 재진행한다.

코드

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

public class Main {

    static char [][] map;

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int leng = Integer.parseInt(br.readLine());

        String str = br.readLine();

        map = new char[5][leng/5];

        // 5등분해서 배열에 넣는다.
        for(int i = 0; i<5; i++){
            map[i] = str.substring(i*leng/5,leng/5*(i+1)).toCharArray();
            }

        ArrayList<Integer> list = new ArrayList<>();

        // 맨 윗줄 만 검사한다.

        for(int i = 0; i<leng/5; i++){
            //#이면 검사한다.
            if(map[0][i] == '#'){

                if(i+2 <= leng/5){ //범위 안에 있으면서, ###일 때
                    if(map[0][i+1] == '#' && map[0][i+2] == '#'){

                        list.add(choice(i)); //###인 경우(2,3,5,6,7,8,9)중 찾아서 저장한다.

                        i = i+3; //3칸을 먹기 때문에 i=i+3

                        if(i >= leng/5) break; //i+3이 범위를 벗어나면 다음 for문에서 에러가 나기때문에, 종료구문을 쓴다.

                        continue; //아래 (1,4)구문에 들어가면 안되므로, continue구문을 쓴다.
                    }
                }
				/*

				###이 아닌 경우, 즉 1(#)이거나 4(#.#)일 때
				1은 (3,i)가 '#'이지만, 4는 '.'이다.

				   .#.   .#.#. <-- 이부분의 앞은 같으므로 확인하지 않는다.
				   .#.   .#.#.
				   .#.   .###.
				   .#.   ...#. <-- 이 부분이 ('#' or '.' 인지 확인)
				   .#.   ...#.  <-- 이 부분을 확인해도 무방.

				*/
                if(map[3][i] == '#') list.add(1); //(3,i)가 '#'이면 1을
                else{ //그렇지 않으면 4를 추가한다. 4역시 3칸을 차지하기 때문에, i=i+3를 꼭 해준다.
                    list.add(4);
                    i = i+3;
                    if(i >= leng/5) break; //i+3의 결과가 범위를 벗어나면 에러가 나기 때문에, 종료구문을 써준다.
                }

            }

        }

        for(int n : list){
            System.out.print(n);
        }

    }

    //###인 경우, (2,3,5,6,7,8,9)중 찾는 함수.
    private static int choice(int x){

        StringBuffer sb = new StringBuffer();
        //한 줄의 String으로 만든다.
        for(int i = 0; i<5; i++){
            for(int j = 0; j<3; j++){
                sb.append(map[i][j+x]);
            }
        }

        return check(sb.toString());
    }

    //찾는다.
    private static int check(String sb){

        int result = 10;
        String [] num = new String[10];

        //1과 4는 필요없다.
        num[0] = "####.##.##.####";
        num[2] = "###..#####..###";
        num[3] = "###..####..####";
        num[5] = "####..###..####";
        num[6] = "####..####.####";
        num[7] = "###..#..#..#..#";
        num[8] = "####.#####.####";
        num[9] = "####.####..####";

        for(int i = 0; i<num.length; i++){
            if(sb.equals(num[i])){
                result = i;
                break;
            }
        }
        return result;
    }
}

0개의 댓글