카테고리 없음
[PCCP 모의고사] 3번 유전법칙 c++
코앤미
2023. 8. 2. 10:47
문제 링크
https://school.programmers.co.kr/learn/courses/15008/lessons/121685
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이
우선, 시간 제한 사항에 주목하자.
1 ≤ queries의 길이(쿼리의 개수) ≤ 5
queries의 원소는 [n, p] 형태입니다.
1 ≤ n ≤ 16
1 ≤ p ≤ 4^(n-1)
최대 p는 4^(n-1)이다. 즉 4^15은 아래와 같이 10억을 넘는 연산이 발생하기에, 시간초과가 발생한다.
그렇기에 완전탐색은 해결책이 아니다. 이 경우, 4로 나눈 몫, 그리고 나머지를 활용하여 문제를 해결할 수 있다.
3번째 세대( 0~15) 에서 4로 나눈 몫은 아래와 같이 규정할 수 있다.
0~3 -> 0
4~7 -> 1
8~11 -> 2
12~15 ->3
즉, 해당 세대의 최상위 부모에서 몇번쨰 자식에서 파생되었는지를 구할 수 있다. ( 이 부분이 이해가 가지 않는다면 직접 해보며 이해하는 것을 추천한다. )
이 과정을 반복하면서, 1-> n세대까지 가는 과정에서 본인이 몇번째 자식에서 파생되었는지 구하면서 가짓수를 따져 나간다면, 손쉽게 답이 완성된다.
정답 코드
#include <string>
#include <vector>
#include<math.h>
#include<iostream>
using namespace std;
string bb[4]={"RR","Rr","Rr","rr"};
vector<string> solution(vector<vector<int>> queries) {
vector<string> answer;
int n,p;
for(int i=0;i<queries.size();i++){
n=queries[i][0]-1;//1
p=queries[i][1]-1;//1
if(n==0||n==1){
if(n==0)answer.push_back("Rr");
else if(n==1){
answer.push_back(bb[p]);
}
continue;
}
int st=pow(4,n-1);
int now,nxt;
int type=1;
while(st>=1){
now=p/st;
if(type==0){
type=0;
}
else if(type==1||type==2){
type=now;
}
else if(type==3){
type=3;
}
p%=st;
st/=4;
}
answer.push_back(bb[type]);
// printf("%d\n",mod);
}
return answer;
}