문제
병현이는 지은이에게 문자 A, B, C, D, E, F, G, H 로 쓰여진 편지를 날마다 보내는데, 컴퓨터로 보내는 비밀편지로, 한 문자마다 0 또는 1인 숫자 여섯 개를 사용하여 보낸다. 둘 사이의 약속은 다음과 같다.
- A 000000
- B 001111
- C 010011
- D 011100
- E 100110
- F 101001
- G 110101
- H 111010
병현이가 어느 날 001111000000011100 을 보내면 지은이는 이것을 BAD로 이해하게 된다. 그런데 둘 사이에 약속이 잘 만들어져 있기 때문에, 통신에 문제가 생겨서 한 문자를 표시하는 여섯 숫자 중 어느 한 숫자만 틀리게 오는 경우, 지은이는 원래 보내려는 문자를 알아 낼 수가 있다.
예를 들어 지은이가 000100을 받았을 때, A와 숫자 한자만 다르고, 다른 문자들과는 각각 숫자 두 자 이상이 다르므로 지은이는 이것이 A라고 알아보게 된다.
다만 111111과 같이 모든 문자의 표현과 숫자 두 자 이상이 다른 경우에는 무슨 문자인지 알 수가 없게 된다. 예를 들어 지은이가 011111000000111111000000111111 을 받았을 때, BA 다음에 알아 볼 수 없는 문자가 나오는데. 이 경우 이런 것이 처음 나오는 문자의 위치인 3을 출력한다.
지은이가 받은 편지를 보고 문자들을 알아내어 출력하거나, 모르는 문자가 있는 경우, 이것이 처음 나오는 위치를 출력하는 프로그램을 작성하시오.
입력
출력
주어진 입력에서 지은이가 이해한 문자들을 출력하거나, 모르는 문자가 나오는 경우 그런 것이 처음 나오는 위치를 출력한다.
예제입출력

문제풀이
al [] :알파벳의미를 담고 있는 숫자 배열
arr [] :입력받은 숫자를 저장할 배열
1. al의 배열과 arr배열을 비교하여 배열 요소가 6개나 5개 일치하는 배열 찾기
2. 6개나5개 일치하는 배열이 있다면 al배열의 인덱스값+65 해서 나온 알파벳값 문자열에 append해주기
3. 일치하는 배열이 없다면 해당 문자 위치 출력하고 종료 / 입력받은 문자열 반복문 종료 후 알파벳 문자열 출력
+
알파벳 저장할 문자열을 concat으로 이어붙여서 저장하려 했는데 처음에 문자열이 null이면 불가능! concat 사용하려면 null이 아닌 값으로 꼭 초기화 시켜 줘야한다.
stringbuilder는 초기화 없이도 append로 이어 붙이기 가능!
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import javax.swing.plaf.synth.SynthSeparatorUI;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); // 몇번입력받는지
int[][] al = { { 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, 1, 1, 1 }, { 0, 1, 0, 0, 1, 1 }, { 0, 1, 1, 1, 0, 0 },
{ 1, 0, 0, 1, 1, 0 }, { 1, 0, 1, 0, 0, 1 }, { 1, 1, 0, 1, 0, 1 }, { 1, 1, 1, 0, 1, 0 } };
StringBuilder result = new StringBuilder();
String s = br.readLine(); // 문자열 입력받기
int[] arr = new int[s.length()];
for (int i = 0; i < s.length(); i++) {
arr[i] = s.charAt(i) - '0';
}
for (int i = 0; i < n; i++) {
int[] cnt = new int[8]; // 어떤문자인지 확인할 cnt 배열
for (int j = 0; j < 6; j++) {
for (int t = 0; t < 8; t++) {
if (al[t][j] == arr[i * 6 + j])
cnt[t]++;
}
}
int ns = 0;// 6개 갯수
int nf = 0;// 5개 갯수
int index = 0;
for (int t = 0; t < 8; t++) {
if (cnt[t] == 6) {
result = result.append((char) (t + 65));
ns++;
break;
} else if (cnt[t] == 5) {
nf++;
index = t;
}
}
if (ns == 0 && nf == 1) {
result = result.append((char) (index + 65));}
else if (ns == 0 && nf == 0) {
System.out.println(i+1);
return;
}
}
System.out.println(result);
}
}
'알고리즘 문제풀이' 카테고리의 다른 글
| [Java] 백준 #1940 주몽 (0) | 2023.02.05 |
|---|---|
| [Java]백준 #12891 DNA 비밀번호 (1) | 2023.02.05 |
| [Java] 백준 #11660 구간 합 구하기5 (0) | 2023.02.05 |
| [Java] 백준 11724 연결요소의 개수 (0) | 2023.01.29 |
| [JAVA] 백준 #11659 구간 합 구하기4 (0) | 2023.01.29 |