https://www.acmicpc.net/problem/17968
문제 해석
문제가 영어로 되어 있어서 정리를 좀 해봤다.
배열 A는 다음과 같은 규칙을 만족하는 수열이다.
- A[0]=1, A[1]=1이다.
- 어떤 k(k > 0)가 i - 2k ≥ 0이라는 조건을 만족시킬 때, A[i-2k], A[i-k], A[i]로 이루어진 부분수열은 등차수열이 되지 않는다. 즉, A[i]-A[i-k] ≠ A[i-k] - A[i-2k]이다.
예를 들어, A[2]는 1이 될 수 없다. 왜냐하면, A[0]=1, A[1]=1이기 때문에 A[2]가 1이면 A[0], A[1], A[2]는 공차가 0인 등차수열이 되기 때문이다. 그렇기에 A[2]는 A[0], A[1], A[2] 부분수열이 등차수열이 되지 않게 하면서도 가장 작은 양의 정수인 2가 되어야 한다.
입력으로 음수가 아닌 정수 n이 주어졌을 때, A[n]의 값을 구하는 프로그램을 만들자.
코드
let fs = require("fs");
let filePath = process.platform === "linux" ? "dev/stdin" : "./input.txt";
let n = +fs.readFileSync(filePath).toString().trim();
function solution(n) {
let arr = [1, 1];
for (let i = 2; i <= n; i++) {
let possible = new Array(1000).fill(true);
// 불가능한 수 찾아서 possible 배열에 표시
for (let k = 1; k <= Math.floor(n / 2); k++) {
if (i - 2 * k >= 0) {
let impossible = 2 * arr[i - k] - arr[i - 2 * k];
possible[impossible] = false;
} else break;
}
// 가능한 수 중 가장 작은 양의 정수 찾기
for (let j = 1; j < 1000; j++) {
if (possible[j]) {
arr.push(j);
break;
}
}
}
return arr[n];
}
console.log(solution(n));
코드 설명
2부터 n까지 배열 A[i]의 값을 하나씩 구할 것이다.
- A[i]의 값은 k가 1부터 시작하여 i - 2k < 0이 되기 전까지 탐색하며 불가능한 수들을 먼저 걸러낸다. 여기서 불가능한 수란, A[i] - A[i-k] == A[i-k] - A[i-2k]를 만족하는 수를 말하므로에 A[i-k]*2 - A[i-2k]를 불가능하다고 possible 배열에 표시해주면 된다.
- 이제 걸러내고 남은 수 중 양의 정수이면서 가장 작은 수를 구한다. 그러니까 possible[j]가 true인 값을 구하면 된다.
이렇게 다 구한 뒤 arr[n]에 있는 값을 출력하면 된다.
느낀 점
영어 문제라서 좀 쫄았는데 천천히 읽어보니 별로 어렵지 않았다. 물론 문제 자체가 쉬운 문제라서 그런 것도 있지만...앞으로는 영어 문제를 만나게 되더라도 뒤로 가지 말고 읽어보고 해석해봐야겠다.
'문제풀이 > 완전탐색' 카테고리의 다른 글
[Python/파이썬] 백준 2659번 십자카드 문제 (0) | 2025.02.27 |
---|---|
[Python/파이썬] 백준 1120번 문자열 (0) | 2025.01.08 |
[Python/파이썬] SW Expert Academy 20731번 서로소 그리드 (1) | 2024.06.12 |
[Python/파이썬] 백준 21943번 연산 최대로 (0) | 2024.06.03 |
[Python/파이썬] 백준 1254번 팰린드롬 만들기 (0) | 2024.05.31 |
https://www.acmicpc.net/problem/17968
문제 해석
문제가 영어로 되어 있어서 정리를 좀 해봤다.
배열 A는 다음과 같은 규칙을 만족하는 수열이다.
- A[0]=1, A[1]=1이다.
- 어떤 k(k > 0)가 i - 2k ≥ 0이라는 조건을 만족시킬 때, A[i-2k], A[i-k], A[i]로 이루어진 부분수열은 등차수열이 되지 않는다. 즉, A[i]-A[i-k] ≠ A[i-k] - A[i-2k]이다.
예를 들어, A[2]는 1이 될 수 없다. 왜냐하면, A[0]=1, A[1]=1이기 때문에 A[2]가 1이면 A[0], A[1], A[2]는 공차가 0인 등차수열이 되기 때문이다. 그렇기에 A[2]는 A[0], A[1], A[2] 부분수열이 등차수열이 되지 않게 하면서도 가장 작은 양의 정수인 2가 되어야 한다.
입력으로 음수가 아닌 정수 n이 주어졌을 때, A[n]의 값을 구하는 프로그램을 만들자.
코드
let fs = require("fs"); let filePath = process.platform === "linux" ? "dev/stdin" : "./input.txt"; let n = +fs.readFileSync(filePath).toString().trim(); function solution(n) { let arr = [1, 1]; for (let i = 2; i <= n; i++) { let possible = new Array(1000).fill(true); // 불가능한 수 찾아서 possible 배열에 표시 for (let k = 1; k <= Math.floor(n / 2); k++) { if (i - 2 * k >= 0) { let impossible = 2 * arr[i - k] - arr[i - 2 * k]; possible[impossible] = false; } else break; } // 가능한 수 중 가장 작은 양의 정수 찾기 for (let j = 1; j < 1000; j++) { if (possible[j]) { arr.push(j); break; } } } return arr[n]; } console.log(solution(n));
코드 설명
2부터 n까지 배열 A[i]의 값을 하나씩 구할 것이다.
- A[i]의 값은 k가 1부터 시작하여 i - 2k < 0이 되기 전까지 탐색하며 불가능한 수들을 먼저 걸러낸다. 여기서 불가능한 수란, A[i] - A[i-k] == A[i-k] - A[i-2k]를 만족하는 수를 말하므로에 A[i-k]*2 - A[i-2k]를 불가능하다고 possible 배열에 표시해주면 된다.
- 이제 걸러내고 남은 수 중 양의 정수이면서 가장 작은 수를 구한다. 그러니까 possible[j]가 true인 값을 구하면 된다.
이렇게 다 구한 뒤 arr[n]에 있는 값을 출력하면 된다.
느낀 점
영어 문제라서 좀 쫄았는데 천천히 읽어보니 별로 어렵지 않았다. 물론 문제 자체가 쉬운 문제라서 그런 것도 있지만...앞으로는 영어 문제를 만나게 되더라도 뒤로 가지 말고 읽어보고 해석해봐야겠다.
'문제풀이 > 완전탐색' 카테고리의 다른 글
[Python/파이썬] 백준 2659번 십자카드 문제 (0) | 2025.02.27 |
---|---|
[Python/파이썬] 백준 1120번 문자열 (0) | 2025.01.08 |
[Python/파이썬] SW Expert Academy 20731번 서로소 그리드 (1) | 2024.06.12 |
[Python/파이썬] 백준 21943번 연산 최대로 (0) | 2024.06.03 |
[Python/파이썬] 백준 1254번 팰린드롬 만들기 (0) | 2024.05.31 |