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

+ Recent posts