public class PccpTest1_3 {
// PCCP 모의고사 1회 3번 유전법칙
public static String solve(int generation, long number) {
long upperCaseLastNum = 0;
long centerGroupLastNum = 0;
String strRoot = "Rr";
long tempNum = 0;
if (generation == 1) {
return strRoot;
}
upperCaseLastNum = (long) Math.pow(4, generation - 2);
centerGroupLastNum = upperCaseLastNum + (2 * upperCaseLastNum);
if (number <= upperCaseLastNum) {
return "RR";
} else if (upperCaseLastNum < number && number <= centerGroupLastNum) {
tempNum = number % ((centerGroupLastNum - upperCaseLastNum) / 2) == 0 ?
(centerGroupLastNum - upperCaseLastNum) / 2 : number % ((centerGroupLastNum - upperCaseLastNum) / 2);
return solve(generation - 1, tempNum);
} else { // centerGroupLastNum < number
return "rr";
}
}
public static String[] solution(int[][] queries) {
String[] answer = {};
int generation = 0;
long number = 0;
answer = new String[queries.length];
for (int i = 0; i < queries.length; i++) {
generation = queries[i][0];
number = queries[i][1];
answer[i] = solve(generation, number);
}
return answer;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] queries = {{3, 1}, {2, 3}, {3, 9}}; // RR, Rr, RR
System.out.println(solution(queries));
}
}
그림으로 패턴 확인
위 규칙을 이용해 내가 알고자 하는 형질의 세대와 번호를 전 세대로 가져가며 범위를 줄여가는 방식을 사용했다.
즉, 내가 알고자 하는 형질이 3세대의 10번째 번호라면
A. 3세대의 대문자 그룹 마지막 번호는 4, 3세대의 2세대 2개의 그룹 마지막 번호는 12
=> 10번은 2세대 그룹 범위에 속한다는 것
B. 2세대 2개의 그룹은 총 12 - 4 = 8개로 구성되며, 2로 나눈 4의 값을 이용한다. (2개의 중복되는 그룹이므로)
C. 10 % 4의 값이 2이므로, 3세대의 10번째 번호 형질은 2세대의 2번째 번호 형질과 같다는 것을 의미한다.
주의해야 할 점은 4로 나눴을 경우 1, 2, 3, 4가 나오도록 10 % 4의 값이 0일 경우 4를 넣어줘야 한다는 점이다.
아래 코드에서 밑줄 친 부분이 이에 해당한다.
다음 코드는 parent를 자가 수분했을 때 다음 세대 형질을 출력하는 코드이다.
public static void selfPollination(String parent) { // parent를 자가 수분했을 때 다음 세대 형질 출력해보기
char leftChar = parent.charAt(0);
char rightChar = parent.charAt(1);
Queue<Character> leftQ = new LinkedList<>();
Queue<Character> rightQ = new LinkedList<>();
rightQ.offer(leftChar);
for (int i = 0; i < 3; i++) {
leftQ.offer(leftChar);
rightQ.offer(rightChar);
}
leftQ.offer(rightChar);
for (int i = 0; i < 4; i++) {
System.out.print(leftQ.poll().toString() + rightQ.poll().toString() + " ");
}
}
parent가 "Rr"일 경우 => "RR", "Rr", "Rr", "rr" 출력
프로그래머스 PCCP 모의고사 문제 풀이 Java
'Java > PCCP' 카테고리의 다른 글
[Java] PCCP 모의고사 1회 문제 풀이 정답 (0) | 2022.11.26 |
---|---|
[Java] PCCP 모의고사 1회 운영체제 (0) | 2022.11.26 |
[Java] PCCP 모의고사 1회 체육대회 (0) | 2022.11.26 |
[Java] PCCP 모의고사 1회 외톨이 알파벳 (1) | 2022.11.26 |