2024. 1. 10. 16:41ㆍ알고리즘
백준 24313번
문제
오늘도 서준이는 점근적 표기 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자.
알고리즘의 소요 시간을 나타내는 O-표기법(빅-오)을 다음과 같이 정의하자.
O(g(n)) = {f(n) | 모든 n ≥ n0에 대하여 f(n) ≤ c × g(n)인 양의 상수 c와 n0가 존재한다}
이 정의는 실제 O-표기법(https://en.wikipedia.org/wiki/Big_O_notation)과 다를 수 있다.
함수 f(n) = a1n + a0, 양의 정수 c, n0가 주어질 경우 O(n) 정의를 만족하는지 알아보자.
입력
첫째 줄에 함수 f(n)을 나타내는 정수 a1, a0가 주어진다. (0 ≤ |ai| ≤ 100)
다음 줄에 양의 정수 c가 주어진다. (1 ≤ c ≤ 100)
다음 줄에 양의 정수 n0가 주어진다. (1 ≤ n0 ≤ 100)
출력
f(n), c, n0가 O(n) 정의를 만족하면 1, 아니면 0을 출력한다.
이 문제에서 고민되었던 부분은 모든 n>=n0 에 대하여 f(n) ≤ c × g(n)을 만족하는지를 판단하는 것이었다.
처음 풀 때는 n0로 주어지는 값을 a1 * n + a0 <= c * n 에 대입하여 만족하는지를 판단했는데 오류가 나왔다.
스스로 이유를 찾을 수 없어서 다른 사람의 풀이를 참고한 결과,
a0가 음수인 경우에 예외처리를 해야한다는 것을 알았다.
https://bakjoon-coding.tistory.com/32
스스로 과정을 정리해보면
n >= n0 이므로 a1 * n0 + a0 <= c * n0을 만족하면서 a0가 음수라면 a1<=c 를 만족해야한다.
그렇지 않으면 a0가 음수일 때 위의 조건을 만족하지 않을 수 있기 때문이다.
예를 들어 a1이 20, c가 10, n0이 1, a0가 -5 이라고 가정하자.
20 * 1 - 5 > 10 * 1 이기 때문에 조건을 만족하지 않는다.
그렇기 때문에 a0가 음수라면 a1<=c를 만족하는지 조건을 추가해야한다.
const input = require('fs').readFileSync('./input.txt').toString().trim().split('\n');
const [a1, a0] = input[0].split(' ').map(Number);
const c = Number(input[1]);
const n0 = Number(input[2]);
function f(n) {
return a1 * n + a0;
}
function g(n) {
return n;
}
if (f(n0) <= c * g(n0) && a1 <= c) {
return console.log(1);
}
return console.log(0);
조건을 구하는 다른 방법도 있다.
모든 n>=n0에 대하여 a1 * n + a0 <= c * n 을 만족해야하므로, a0 <= (c - a1) * n 을 만족하게 되고
a0의 범위가 -100<=a0<=100 이기 때문에 -100 <= a0 <= (c - a1) * n을 만족해야한다.
0 <= a0 + 100 <= (c - a1) * n + 100을 만족해야하므로, 0 <= (c - a1 ) * n을 만족해야한다.
n0가 조건에서 양의 정수이므로 n은 양의 정수이다.
따라서 (c - a1 ) >= 0을 만족해야하기 때문에 c >= a1 이어야한다.
느낀점
조건이 만족하지 않을 때 문제 속에서 다른 조건을 찾아야했다.
어떤 사고의 흐름을 통해 두번째 조건을 찾아야하는지 처음에는 감이 잡히지 않았다.
문제 속의 조건을 잘 확인한 후, 추가할 조건이 없는지 다시 한 번 확인해야겠다.
'알고리즘' 카테고리의 다른 글
브루트 포스 - 멘토링 (0) | 2024.01.12 |
---|---|
2차원 배열 - 봉우리 (2) | 2024.01.11 |
2차원 배열 - 격자판 최대합 (0) | 2024.01.11 |
브루트 포스 - 블랙잭 (0) | 2024.01.10 |
시간 복잡도 (1) | 2024.01.10 |