SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
풀이
DP를 사용해서 해결했습니다.
문제에서 A가 가장 작으며 그런 조합이 여러 가지인 경우 B가 가장 작은 조합을 선택하면 된다는 조건이 있고 GCD(a, b)일 때,테스트 케이스에서 주어진 K = 1부터 해보면
K = 1
GCD(2, 1) = GCD(1, 2 % 1) = GCD(1, 0) = 1
K = 2
GCD(3, 2) = GCD(2, 3 % 2) = GCD(2, 1) = (K = 1)인 경우가 반복
K = 3
GCD(5, 3) = GCD(3, 5 % 3) = GCD(3, 2) = (K = 2)인 경우가 반복
...
K = n
GCD((n - 1의 a) + (n - 1의 b), n - 1의 a) = (K = n - 1)인 경우가 반복하는 형태가 됩니다.
즉,
memo[i][0] = memo[i - 1][0] + memo[i - 1][1]
memo[i][1] = memo[i - 1][0]
가 됩니다.
이때, K가 90에 가까워질수록 수가 매우 커질 수 있으므로 long 자료형으로 해야 합니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Solution {
public static int K;
public static long[][] memo = new long[91][2];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder("");
memo[1][0] = 2;
memo[1][1] = 1;
for (int i = 2; i <= 90; ++i) {
memo[i][0] = memo[i - 1][0] + memo[i - 1][1];
memo[i][1] = memo[i - 1][0];
}
int T = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= T; ++tc) {
K = Integer.parseInt(br.readLine());
sb.append("#").append(tc).append(" ")
.append(memo[K][0]).append(" ").append(memo[K][1])
.append("\n");
}
System.out.println(sb);
}
}
pyo7410/Algorithm
1일 1커밋을 목표로! Contribute to pyo7410/Algorithm development by creating an account on GitHub.
github.com
'알고리즘 > SWEA' 카테고리의 다른 글
[Java] SWEA 2819번 격자판의 숫자 이어 붙이기 (0) | 2021.04.05 |
---|---|
[Java] SWEA 4672번 수진이의 팰린드롬 (0) | 2021.03.30 |
[Java] SWEA 3289번 서로소 집합 (0) | 2021.03.23 |
[Java] SWEA 1251번 하나로 (0) | 2021.03.22 |
[Java] SWEA 7699번 수지의 수지 맞는 여행 (0) | 2021.03.19 |