728x90
문제
접근 방식
DP로 풀 필요도 없이 규칙만 찾으면 연산 한 줄로도 풀 수 있는 문제지만 그냥 DP로 풀어봤다.
우선 DP 테이블은 불리언 타입의 1차원 배열로 생성한 후에
상근이가 이기는 경우를 true, 창영이가 이기는 경우를 false로 채워주면 된다.
자기 순서에 1, 3, 4개 중 한 번씩 가져갈 수 있으니 이 경우에 상근이는 무조건 이길 수 있고
1, 3, 4번의 초기값은 true로 설정해준다.
9까지 직접 계산해 가며 표를 만들어보면 알 수 있는데
n번째 수를 가져가는 경우 중 상근이가 한 번이라도 가져가는 경우가 있다면
무조건 상근이가 이기는 경우이기 때문에
상근이가 처음에 1개를 가져가거나 3개를 가져가거나 4개를 가져간 후에
창근이가 지는 경우가 한 번이라도 있다면 상근이가 이기는 것이 된다.
dp[i] = (!dp[i - 1 || !dp[i - 3] || !dp[i - 4])
즉, 위와 같은 풀이가 나오게 된다.
이 문제는 n의 범위가 1,000 이하이기 때문에 dp 테이블이 설정이 가능하지만
같은 문제에 n의 범위만 int 형을 벗어난 돌 게임 6 문제 같은 경우에는
배열을 선언할 수 없기 때문에 다른 방법으로 풀어야 한다.
처음에 언급했던 것처럼 이 문제는 더 간단하게 풀 수 있는데
n을 7로 나눈 나머지가 0이거나 2인 경우에만 상근이가 지기 때문에
한 줄 만으로도 풀 수 있는 문제다.
풀이
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
boolean[] dp = new boolean[1001];
dp[1] = dp[3] = dp[4] = true;
for (int i = 5; i <= n; i++) {
dp[i] = (!dp[i - 1] || !dp[i - 3] || !dp[i - 4]);
}
System.out.println(dp[n] ? "SK" : "CY");
}
}
'Java > Algorithms' 카테고리의 다른 글
[백준] 2294번 : 동전2 (0) | 2024.03.16 |
---|---|
[백준] 9084번 : 동전 (0) | 2024.03.16 |
[백준] 4883번 : 삼각 그래프 (4) | 2024.03.11 |
[백준] 2293번 : 동전 1 (0) | 2024.03.09 |
[백준] 11052번 : 카드 구매하기 (0) | 2024.03.08 |