https://www.acmicpc.net/problem/2596
문제
병현이는 지은이에게 문자 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을 출력한다.
지은이가 받은 편지를 보고 문자들을 알아내어 출력하거나, 모르는 문자가 있는 경우, 이것이 처음 나오는 위치를 출력하는 프로그램을 작성하시오.
입력
첫줄에는 보낸 문자의 개수(10개 보다 작다.)가 입력된다. 다음 줄에는 문자의 개수의 여섯 배 만큼의 숫자 입력이 주어진다.
출력
주어진 입력에서 지은이가 이해한 문자들을 출력하거나, 모르는 문자가 나오는 경우 그런 것이 처음 나오는 위치를 출력한다.
풀이
1. 약속한 문자는 문자열 배열 alphabet에 차례대로 저장해둔다.
2. 한 문자씩 약속한 문자와 일치하는지 검사할 것이기 때문에 입력받은 문자열 text를 6개씩 잘라 s에 저장한다.
3, [decode] 함수: 문자열 s와 검사할 alpabet 배열의 인덱스 num을 인자로 받는다. 문자열s와 검사할 약속 문자를 비교하며 일치하지 않으면 count를 1 증가시킨다. 일치하지 않는 문자의 개수 count를 반환한다.
4. 약속한 문자가 8개이므로 반복문 8번동안 decode 함수를 호출하고 반환받은 일치하지 않는 문자의 개수가 2개 미만이면 잘 해독한 것이므로 isFound를 true로 바꾸고 'A'+j 값을 answer 배열에 추가한다. 이때 'A'+j는 아스키 코드를 이용한 것으로 연속한 대문자로 이루어져있기 때문에 첫글자 'A'와 일치한 약속 문자의 인덱스를 더하여 해석한 문자를 char값으로 나타낼 수 있다. 또한 해독에 성공했기 때문에 반복문을 탈출한다.
5. 만약 alpabet 배열을 모두 순회하였음에도 일치하는 약속 문자가 없다면(=isFound가 false) i+1을 출력하고 종료한다.
6. 완성된 해독본 answer을 출력한다.
코드
#include <iostream>
#include <string>
using namespace std;
string text, answer, alphabet[8] = {"000000","001111","010011","011100","100110","101001","110101","111010"};
int decode(string s, int num) {
int count=0;
for(int i=0;i<s.length();i++) {
if(s[i]!=alphabet[num][i])
count++;
}
return count;
}
int main() {
int N, index;
cin >> N >> text;
for(int i=0;i<N;i++) {
string s = text.substr(i*6, 6);
bool isFound = false;
for(int j=0;j<8;j++) {
if(decode(s, j)<2) {
isFound = true;
answer+='A'+j;
break;
}
}
if(!isFound) {
cout << i+1;
return 0;
}
}
cout << answer;
return 0;
}
'Koala - 13기 > 기초 알고리즘 스터디' 카테고리의 다른 글
[백준/python] 2789번: 유학 금지 (0) | 2024.02.01 |
---|---|
[백준/Python] 1316:그룹 단어 체커 (0) | 2024.01.29 |
[백준/Python] 11655번 : ROT13 (0) | 2024.01.28 |
[백준/java] 11068 회문인수 (0) | 2024.01.28 |
[백준/Python] 15905번 : 스텔라(STELLA)가 치킨을 선물했어요 (0) | 2024.01.28 |