백준 1672번 [ DNA 해독 ]

홍수민·2023년 2월 3일
0

BAEKJOON이다

목록 보기
14/18

https://www.acmicpc.net/problem/1672

요즘은 새로운 함수를 많이 사용해보려고 노력하고 있다. 이미 내장된 함수가 있는데 그걸 굳이굳이 풀어서 코드를 만들면 나도 귀찮으니까 ㅠㅠㅠ 그래서 어디서 본 듯한 함수 이름을 떠올리고, 문제 해결에 사용될 수 있는지 찾아보며 간단히 함수 공부도 하고 있당

이번에 쓸 함수는 erase() 이다!! 사실 삭제하는 함수는 remove만 있는 줄 알았는데, remove를 찾아보니 erase라는 함수도 있다는 걸 알게 되었다. 이 문제에는 remove보다는 erase를 쓰는 게 나을 것 같아서 erase에 대해 조금 설명을 해보려 한다.

erase 함수란?

string 헤더에 있는 함수로, string에서 원하는 범위의 문자들을 삭제한다. (vector 헤더를 선언해줘도 되는데, 두 개를 다 빼고 iostream 헤더만 있어도 코드가 잘 굴러갔다..!! 그렇지만 일반적으로 string 헤더를 선언해준다.)

사용 방법

erase(position) : position에 해당하는 아이템 삭제
erase(first, last) : first을 포함하고, last 이전까지의 아이템들 모두 삭제

erase와 remove의 차이점은?

1. 헤더의 차이

remove : algorithm 헤더
erase : string 헤더
단, vector 헤더는 둘 다 가능

2. size의 크기

remove : 데이터 값은 삭제되지만, 컨테이너의 size가 실제로 줄어들지는 않음
erase : 데이터의 값뿐만 아니라, 컨테이너의 size까지 줄어듦

3. 함수의 기능

remove : 데이터 값이 똑같거나, 데이터 조건이 참이 되는 데이터 전부를 제거 (remove_if)
erase : 위치를 통해, 1개 또는 연결된 여러 개의 데이터 제거 가능

4. 어떤 것을 인자로 보내는가?

remove : 특정 값을 인자로 보냄 -> 단순 해당 값 삭제 및 특정 범위를 탐색하여 삭제하려는 값을 찾아내어 삭제 가능
erase : 해당 값의 위치를 인자로 보냄 -> 범위 내에서 특정 값을 찾아내는 것은 불가능

4. remove 추가 설명

실제로 원소를 제거하는 것이 아님. 원소가 대체되어 컨테이너 맨 뒤로 들어감(size와 capacity 유지 이유).
탐색 시작 iterator, 탐색 끝 iterator, 비교값 val을 입력값으로 받음
val와 같은 값을 가진 원소가 있다면 바로 뒷부분을 가져와서 그 값을 덮어버림.

remove(first, last, 삭제하려는 값);

erase와 remove의 공통점은?

1. last는 범위에 포함되지 않는다!

2. 맨 끝 범위에 위치한 값은 삭제할 수 없다!

일단 erase와 remove에 관한 내용은 여기까지! 찾아보니까 내용 왕 많은데, 아직은 그 내용들을 전부 받아들이긴 버겁다 ㅠㅠ

이 내용들을 활용하여 요 문제에 대한 코드를 작성하면

코드

#include <iostream>
#include <string>
using namespace std;

int main() {
  int N;
  cin >> N;

  string DNA;
  cin >> DNA;

  for(int i=N-1; i>=0; i--){
    if(DNA[i]=='A' && DNA[i+1]=='A'){
      DNA.erase(i+1);
    }
    else if(DNA[i]=='G' && DNA[i+1]=='G'){
      DNA.erase(i+1);
    }
    else if(DNA[i]=='C' && DNA[i+1]=='C'){
      DNA.erase(i+1);
    }
    else if(DNA[i]=='T' && DNA[i+1]=='T'){
      DNA.erase(i+1);
    }
    else if((DNA[i]=='G' && DNA[i+1]=='A')||(DNA[i]=='A' && DNA[i+1]=='G')){
      DNA.erase(i+1);
      DNA[i] = 'C';
    }
    else if((DNA[i]=='C' && DNA[i+1]=='A')||(DNA[i]=='A' && DNA[i+1]=='C')){
      DNA.erase(i+1);
      DNA[i] = 'A';
    }
    else if((DNA[i]=='T' && DNA[i+1]=='A')||(DNA[i]=='A' && DNA[i+1]=='T')){
      DNA.erase(i+1);
      DNA[i] = 'G';
    }
    else if((DNA[i]=='G' && DNA[i+1]=='C')||(DNA[i]=='C' && DNA[i+1]=='G')){
      DNA.erase(i+1);
      DNA[i] = 'T';
    }
    else if((DNA[i]=='G' && DNA[i+1]=='T')||(DNA[i]=='T' && DNA[i+1]=='G')){
      DNA.erase(i+1);
      DNA[i] = 'A';
    }
    else if((DNA[i]=='T' && DNA[i+1]=='C')||(DNA[i]=='C' && DNA[i+1]=='T')){
      DNA.erase(i+1);
      DNA[i] = 'G';
    }
  }
  cout << DNA;
}

경우를 너무 많이 넣은 게 보이지만..ㅎㅎ 지금 수준으로는 이걸 대체할 수는 없당
요즘 string에 재미붙인 상태라 string 관련 문제 많이 풀어야징

profile
수만이다

0개의 댓글