(C++) 백준 1672번 - DNA 해독

코딩너구리·2025년 10월 2일

코딩 문제 풀이

목록 보기
12/266

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>>형태를 알게되었다. 매우편했다.
염기서열표를 직접 선언해서 썼지만 입력받아서 그때 그때 만들 방법을 알아보자.

0개의 댓글