[백준] (JAVA) 16113 : 시그널
문제
https://www.acmicpc.net/problem/16113
16113번: 시그널
zxcvber는 외계인을 연구하는 과학자다. 그는 지난 10년간 우주에서 오는 시그널를 연구했지만, 아무런 성과가 없었다. 그러던 어느 날, 갑자기 우주에서 이상한 시그널이 오기 시작했다. zxcvber는
www.acmicpc.net
설명
입출력
나의 풀이
문제 설명
입력의 첫째줄이 시그널의 길이인데 문제에서 시그널을 5개로 쪼갠다는 것은
행을 5로 하며 시그널을 끊어서 5줄로 나타낸다는 것이다. (시그널의 길이는 항상 5의 배수)
예제 1의 입력인 시그널 ###..#..#.#..#..###..#..#.#..#..###..#.. 을 5줄로 나타내면 아래와 같다.
이때 나타나는 시그널이 81이므로 해독된 시그널은 81을 출력하는 문제이다.
풀이 계획
1. 숫자 0,1,2,3,4,5,6,7,8,9를 기준에 따라 나누어 주었다.
(1) 0행의 3연속된 3칸이 모두 #인 숫자를 기준으로 (1,4)와 (0,2,3,5,6,7,8,9)로 나누었다.
(2) (1)에서 나눈 숫자들을 다시 각 행의 #의 위치에따라 나누었다.
2. 위에서 나눈 기준에따라 코드를 작성한다. (i열이 모든 수의 첫 시작 열)
(1) 0행의 i열로부터 #이 2칸 연속인가에 따라 첫 번째 if문으로 (1,4)-(0,2,3,5,6,7,8,9) 나누기
(2) (1,4) 조건문 안에서 3행의 i열의 #유무에 따라 1과 4가 정해진다.
(3) (0,2,3,5,6,7,8,9) 조건문 안에서 1행의 #위치에 따라 각각
check_0_8_9, check_2_3_7, check_5_6 함수를 호출한다.
(4) (3)에서 호출한 각 함수 안에서 그림에 나온 조건에 따라 행의 #유무를 비교하며 암호를 완성한다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
static String result = "";
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int r = 5;
int c = N / r;
// System.out.println("r = " + r);
// System.out.println("c = " + c);
String st = br.readLine();
String[][] signal = new String[r][c];
int k=0;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
signal[i][j] = String.valueOf(st.charAt(k));
k++;
}
}
// 확인용
// for (String[] strings : signal) {
// System.out.println(Arrays.toString(strings));
}
for (int i = 0; i < c; i++) {
if (signal[0][i].equals("#")) {
if (i == c - 1 ) {
result += "1";
continue;
}
if (!signal[0][i + 1].equals("#")) {
// 0또는 4 (다음 열이 #이 아님)
if (signal[3][i].equals("#")) {
// 3행이 #이므로 암호는 1
result += "1";
} else {
result += "4";
i += 3;
}
} else {
// 0,4 제외
if (signal[1][i].equals("#") && signal[1][i + 2].equals("#")) {
check_0_8_9(i, signal);
} else if (!signal[1][i].equals("#") && signal[1][i + 2].equals("#")) {
check_2_3_7(i, signal);
} else {
check_5_6(i, signal);
}
i += 3;
}
}
}
System.out.println(result);
}
static public void check_0_8_9(int i, String[][] signal) {
if (!signal[2][i + 1].equals("#")) {
result += "0";
} else {
if (signal[3][i].equals("#")) {
result += "8";
} else {
result += "9";
}
}
}
static public void check_2_3_7(int i, String[][] signal) {
if (!signal[2][i].equals("#")) {
result += "7";
} else {
if (signal[3][i].equals("#")) {
result += "2";
} else {
result += "3";
}
}
}
static public void check_5_6(int i, String[][] signal) {
if (!signal[3][i].equals("#")) {
result += "5";
} else {
result += "6";
}
}
}
결과를 확인하면 잘 출력된다.
처음 짠 코드는 60%정도에서 에러가 났었는데 맨 마지막 열의 암호가 1인 경우였다.
예를 들어 아래와 같은 예시일 때의 상황을 따로 처리해주지 않아서 인덱스 에러가 발생했다.
아래와 같이 끝이 1인 경우를 처리하고 continue를 걸어주었다.
구현 문제를 풀면서 코드가 길어지면서 이게 맞나..?라는 생각이 들긴 했지만 결과도 잘 나오고 통과도 잘 돼서 신기하다..