본문 바로가기

백준

백준2596 - 비밀편지

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