알고리즘/백준
[백준] 시그널 16113 JAVA
nagrang
2026. 2. 18. 15:06
1. 문제
https://www.acmicpc.net/problem/16113

- 구현, 문자열 문제
- 실패
- 다른건 다 열 사이즈가 3인데, 1만 열 사이즈가 1임. 그래서 모두 3으로 고정하고 확인 했더니 예외 케이스가 생김
- 1은 1열로 다시 구현했으나 그랬더니 8인데 1로 분리하는 오류가 생김
2. 해결
solution : 열을 하나씩 검사한다
1. 현재 열이 전부 '.'이면 그냥 넘어간다. (숫자 절대 아님)
2. 현재 열에 '#'이 하나라도 있으면, 그 열을 시작으로 3열을 묶어 0~9(1제외) 중 무엇인지 검사.
3. 만약 3열 패턴에 맞는 숫자가 없으면 1이다.
keyPoint : 1을 정확히 판단하는게 아니라 현재 열에 #이 있는데 0~9(1 제외)가 아니라면 1이라고 판단
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int N;
static char[][] map;
/*
solution : 열을 하나씩 검사한다
1. 현재 열이 전부 '.'이면 그냥 넘어간다. (숫자 절대 아님)
2. 현재 열에 '#'이 하나라도 있으면, 그 열을 시작으로 3열을 묶어 0~9(1제외) 중 무엇인지 검사.
3. 만약 3열 패턴에 맞는 숫자가 없으면 1이다.
*/
public static void main(String[] args) throws IOException {
N = Integer.parseInt(br.readLine());
String str = br.readLine();
int L = N/5;
map = new char[5][L];
// 1. 시그널을 5행 L열의 2차원 배열로 재배치
for(int i=0; i<5; i++){
for(int j=0; j<L; j++){
map[i][j] = str.charAt(i*L + j);
}
}
StringBuilder sb = new StringBuilder();
for(int j=0; j<L; j++){
if(isEmptyColumn(j)) continue;
// 1은 1열, 나머지는 3열이므로 3열을 먼저 체크
String num = getNumber(j, L);
sb.append(num);
if(num.equals("1")){
j+=0;
} else{
j+=2;
}
}
System.out.println(sb);
}
static String getNumber(int col, int maxL){
if (col + 2 >= maxL) return "1";
// 3x5 영역을 하나의 문자열로 합침
StringBuilder shape = new StringBuilder();
for(int i=0; i<5; i++){
for(int j=col; j<col+3; j++){
shape.append(map[i][j]);
}
}
String s = shape.toString();
if (s.equals("####.##.##.####")) return "0";
if (s.equals("###..#####..###")) return "2";
if (s.equals("###..####..####")) return "3";
if (s.equals("#.##.####..#..#")) return "4";
if (s.equals("####..###..####")) return "5";
if (s.equals("####..####.####")) return "6";
if (s.equals("###..#..#..#..#")) return "7";
if (s.equals("####.#####.####")) return "8";
if (s.equals("####.####..####")) return "9";
return "1";
}
static boolean isEmptyColumn(int col){
for(int i=0; i<5; i++){
if (map[i][col] == '#') return false;
}
return true;
}
}