점근적 표기 1

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

 

백준 알고리즘 24313번 알고리즘 수업 - 점근적 표기 1 (C++/C언어)

실버Ⅳ https://www.acmicpc.net/problem/24313 24313번: 알고리즘 수업 - 점근적 표기 1 f(n) = 7n + 7, g(n) = n, c = 8, n0 = 1이다. f(1) = 14, c × g(1) = 8이므로 O(n) 정의를 만족하지 못한다. www.acmicpc.net 시간 제한 메모

bakjoon-coding.tistory.com

 

스스로 과정을 정리해보면

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