문제 : boj9242
입력받은 문자열을 숫자로 변경만 할 수 있다면 6의 배수인지는 n%6==0 과 같이 쉽게 알 수 있다. 또한 코드는 8자리 이하라고 했으므로 최대 10^8-1의 값이므로 정수로 표현하는데에도 문제가 없다.
따라서 주어진 문자가 잘못된 문자인지 여부를 알 수 있고, 주어진 문자가 숫자로 무엇과 대응되는지만 알면 풀 수 있다. 그럼 주어진 문자를 주어진 기준문자(아래와 같은)와 비교만 잘 하면 된다.
이 때 주의점은 각 문자의 특징을 잡아서, 예를들어 마지막 열에 5개의 별표가 있다면 1 혹은 7일테니 첫번째 열에 *이 있다면 7, 아니면 1 이런방식은 틀린 입력값을 제대로 잡아낼 수 없다. 따라서 문자의 모든 위치(5x3)을 모두 비교하는게 맞다.
내 경우엔 우선 기준 데이터를 파싱해서 5x3짜리 배열 10개로 만들었다. 이후 들어온 문자를 파싱해서 5x3짜리 배열 n개로 변경하고(n은 2~8로 주어진 코드의 개수), 비교했다. 이 때 기준 데이터와 하나도 맞는게 없다면 잘못된 입력인 것이고 혹은 파싱 중에 exception이 떨어진다면 역시 잘못된 개수로 들어온 입력일 것이다. 예를들어 아래와 같이 2열만 존재하는 입력이 들어올 경우 파싱이 제대로 안되서 exception이 떨어질 것이다.
**
*
**
**
**
직관적으로 푸는 방법을 찾긴 쉬우나, 구현하기는 사람에 따라 어려울 수도 있는 그런류의 문제이다.
코드 : github
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
private static final String[] ORIGINAL = {
"*** * *** *** * * *** *** *** *** ***",
"* * * * * * * * * * * * * *",
"* * * *** *** *** *** *** * *** ***",
"* * * * * * * * * * * * *",
"*** * *** *** * *** *** * *** ***"
};
class Digit {
boolean[][] arr;
public Digit() {
arr = new boolean[5][3];
}
@Override
public boolean equals(Object obj) {
Digit ano = (Digit)obj;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
if (this.arr[i][j] != ano.arr[i][j])
return false;
}
}
return true;
}
}
private void init(Digit[] digits) {
for (int i = 0; i < 10; i++) {
digits[i] = new Digit();
}
for (int i = 0; i < 5; i++) {
String cur = ORIGINAL[i];
for (int j = 0; j < digits.length; j++) {
for (int k = 0; k < 3; k++) {
digits[j].arr[i][k] = cur.charAt(j*4+k)=='*'?true:false;
}
}
}
}
private void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Digit[] digits = new Digit[10];
init(digits);
try {
Digit[] inputs = new Digit[0];
for (int i = 0; i < 5; i++) {
String cur = br.readLine();
if (i == 0) {
inputs = new Digit[cur.length() / 4 + 1];
for (int z = 0; z < inputs.length; z++) inputs[z] = new Digit();
}
for (int j = 0; j < inputs.length; j++) {
for (int k = 0; k < 3; k++) {
inputs[j].arr[i][k] = cur.charAt(j * 4 + k) == '*' ? true : false;
}
}
}
int num = 0;
for (int i = 0; i < inputs.length; i++) {
num *= 10;
boolean chk = true;
for (int j = 0; j < 10; j++) {
if (inputs[i].equals(digits[j])) {
num += j;
chk = false;
break;
}
}
if (chk) {
System.out.println("BOOM!!");
return;
}
}
System.out.println(num % 6 == 0 ? "BEER!!" : "BOOM!!");
} catch (Exception e) {
System.out.println("BOOM!!");
}
}
public static void main(String[] args) throws Exception {
new Main().solution();
}
}
'PS > BOJ' 카테고리의 다른 글
백준 18384 자바 - PRIM (BOJ 18384 JAVA) (0) | 2022.03.22 |
---|---|
백준 1035 자바 - 조각 움직이기 (BOJ 1035 JAVA) (0) | 2022.03.21 |
백준 2191 자바 - 들쥐의 탈출 (BOJ 2191 JAVA) (0) | 2022.03.20 |
백준 9997 자바 - 폰트 (BOJ 9997 JAVA) (0) | 2022.03.20 |
백준 3164 자바 - 패턴 (BOJ 3164 JAVA) (0) | 2022.03.19 |
댓글