백준
[C++] 백준 DNA 해독
MINU.SHINNNN
2024. 1. 30. 00:30
https://www.acmicpc.net/problem/1672
1672번: DNA 해독
N개의 A, G, C, T로 구성되어 있는 DNA 염기서열이 있다. 그리고 우리는 이 염기서열을 아래의 표를 이용하여 해독을 해야 한다. 해독 방법은 염기 서열에서 제일 끝에 있는 두 개의 염기를 An-1, An이
www.acmicpc.net
풀이
염기서열의 길이 범위가 N(1 ≤ N ≤ 1,000,000) 이므로 한번의 반복문으로 해결해야 하는 문제입니다.
주어진 염기 표를 map 자료구조를 사용해 해싱하여 문제를 해결할 수 있습니다.
map<pair<char, char>, char> 을 선언하고 모든 표를 기록해줍니다.
문자열을 빼는 경우 string의 pop_back() 함수를 사용하면 됩니다.
#include <iostream>
#include <map>
using namespace std;
int main()
{
// freopen("input.txt", "r", stdin);
int n;
string s;
map<pair<char, char>, char> m;
m[make_pair('A', 'A')] = 'A';
m[make_pair('A', 'G')] = 'C';
m[make_pair('A', 'C')] = 'A';
m[make_pair('A', 'T')] = 'G';
m[make_pair('G', 'A')] = 'C';
m[make_pair('G', 'G')] = 'G';
m[make_pair('G', 'C')] = 'T';
m[make_pair('G', 'T')] = 'A';
m[make_pair('C', 'A')] = 'A';
m[make_pair('C', 'G')] = 'T';
m[make_pair('C', 'C')] = 'C';
m[make_pair('C', 'T')] = 'G';
m[make_pair('T', 'A')] = 'G';
m[make_pair('T', 'G')] = 'A';
m[make_pair('T', 'C')] = 'G';
m[make_pair('T', 'T')] = 'T';
cin >> n;
cin >> s;
while (true) {
if (s.size() == 1)
break;
int k = s.size();
char ss = m[make_pair(s[k-2], s[k-1])];
s.pop_back();
s.pop_back();
s += ss;
}
cout << s << endl;
return 0;
}