https://www.acmicpc.net/problem/2596
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로 이해하게 된다. 그
www.acmicpc.net
맵과 벡터를 활용하여 풀었다. 맵의 각각의 원소를 벡터로 저장한다. 먼저 온전한 알파벳일 때 숫자 코드를 맵에 원소에 저장하고 온전한 알파벳 코드에서 한 글자씩 바꿔서 해당 맵에 원소에 다시 저장한다. 그런 후 입력한 코드를 6자씩 끊어서 알파벳 코드를 탐색한다. 탐색 결과 해당 알파벳이 있으면 최종 결과를 출력하기 위하여 한 글자씩 저장한다. 그렇지 않으면 탐색을 종료하고 해당 위치에 알파벳 순서를 출력한다.
#include <string>
#include <iostream>
#include <map>
#include <vector>
using namespace std;
int main() {
int n; //주어진 단어의 갯수
int cnt = 1; //단어의 위치
string s; //주어진 코드
string ans; //답
string mat[8] = { "000000", "001111", "010011", "011100", "100110", "101001", "110101", "111010" }; //A, B, C, D, E, F, G, H
map<string, vector<string>> mp; //알파벳을 담는 부분
//정상적인 알파벳 코드와 한 부분 바꾼 알파벳 코드를 저장하는 부분
for (int i = 0; i < 8; i++) {
mp[mat[i]].push_back(mat[i]);
for (int j = 0; j < 6; j++) {
string check = mat[i];
if (check[j] == '0') {
check[j] = '1';
}
else {
check[j] = '0';
}
mp[mat[i]].push_back(check);
}
}
cin >> n;
cin >> s;
//해당 코드에 맞는 알파벳을 찾는 부분
for (int i = 0; i < s.size(); i += 6) {
int alpha = 0; //알파벳을 지정해줄 변수
string temp = s.substr(i, 6); //6개식 끊는다.
map<string, vector<string>>::iterator iter = mp.begin();
for (iter; iter != mp.end(); iter++) {
bool flag = false;
for (int i = 0; i < iter->second.size(); i++) {
if (temp == iter->second[i]) { //해당 알파벳 코드를 찾으면
ans = ans + char('A' + alpha); //답에 한 글자를 더한다
flag = true;
break;
}
}
if (flag) {
break;
}
alpha++;
}
if (ans.size() != cnt) { //해당 알파벳 코드가 없으면
ans = char('0' + cnt); //잘못된 부분을 답으로 저장하고
break; //종료
}
cnt++;
}
cout << ans;
}
'백준' 카테고리의 다른 글
백준2512 - 예산 (0) | 2019.12.04 |
---|---|
백준1987 - 알파벳 (0) | 2019.12.04 |
백준17265 - 나의 인생에는 수학과 함께 (0) | 2019.12.01 |
백준1002 - 터렛 (0) | 2019.11.28 |
백준1092 - 배 (0) | 2019.11.25 |