https://www.acmicpc.net/problem/1672
문제
> 입력받은 DNA를 주어진 염기서열표로 해독하라.
> 입력받은 DNA의 마지막인 n과 n-1에 대해 염기서열표에 대조해 대응되는 염기로 바꾼다.
> 염기를 바꿔나가며 최종적으로 한 염기가 남을때 해당 염기를 출력하라.
접근
Map으로 염기서열표를 만들고 입력받은 DNA값과 대조해서 염기서열을 찾아 새로 DNA를 작성한다.
문제해결
> DNA를 문자 배열로 입력받는다.
> 염기서열표를 Map을 이용해 만든다.
> DNA의 n과 n-1 즉 size() -1 과 size() -2를 가져오고 해당 염기를 Map에 넣어 새로운 염기를 가져온다.
> DNA 배엘에서 n과 n-1에 해당하는 값을 제거해주고 새로 가져온 염기를 넣어준다.
> 위 과정을 반복해 한 염기를 남기고 출력한다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int N;
cin >> N;
vector<char> DNA(N);
for(int i = 0; i < N; i++)
cin >> DNA[i];
map<char, map<char, char>> DNAlist;
DNAlist =
{
{'A', {{'A', 'A'}, {'G', 'C'}, {'C', 'A'}, {'T', 'G'}}},
{'G', {{'A', 'C'}, {'G', 'G'}, {'C', 'T'}, {'T', 'A'}}},
{'C', {{'A', 'A'}, {'G', 'T'}, {'C', 'C'}, {'T', 'G'}}},
{'T', {{'A', 'G'}, {'G', 'A'}, {'C', 'G'}, {'T', 'T'}}}
};
while (DNA.size() > 1)
{
int Dsize = DNA.size();
char n = DNA[Dsize - 1];
char n_1 = DNA[Dsize - 2];
DNA.pop_back();
DNA.pop_back();
char NewDNA = DNAlist[n_1][n];
DNA.push_back(NewDNA);
}
cout << DNA[0];
}

후기
Map으로 염기서열표 만드는것까진 생각했는데
Map<char, char, char> 이렇게가 되나?에서 막혀 자료탐색중 Map<char, Map<char, char>>형태를 알게되었다. 매우편했다.
염기서열표를 직접 선언해서 썼지만 입력받아서 그때 그때 만들 방법을 알아보자.