본문 바로가기
Computer/Algorithm_Java

[BaekJoon] 24313번 알고리즘 수업 - 점근적 표기 1 문제풀이 (Success)

by HJ0216 2023. 8. 3.
 

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

 

Language: Java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
 
        int A = Integer.parseInt(st.nextToken());
        int B = Integer.parseInt(st.nextToken());
 
        int C = Integer.parseInt(br.readLine());
        int N = Integer.parseInt(br.readLine());
        
        int x = 1;
        for (x = 1; x <= N; x++) {
            if ((C - A) * x >= B) {
                break;
            }
        }
 
        if (x <= N && A<=C) {
            bw.write("1");
        } else {
            bw.write("0");
        }
 
        bw.flush();
        bw.close();
    }
 
}
 
 
 

🤔 해설

1. for 반복문

    - 수식을 만족하는 x가 있을 경우, N과 비교하여 O(n)을 만족하는지 판단

🚨 A<=C 조건식 추가

 ax + b <= cx

b<=(c-a)x

에서 x의 범위를 살펴보기 위해서 총 3가지 가능성 고려

    - c=a

        - 특정값 이상의 모든 x에 대해서 부등식을 만족할 수 있음

        - 예: b=0일 경우, N과 무관하여 N보다 크거나 같은 모든 x에 대해서 부등식 만족

    - c>a

        - b/(c-a)<=x에서 b/(c-a)보다 크거나 같고 x보다 작거나 같은 N을 찾을 수 있음

        - 예: b=10, c=2, a=1일 경우, N>=10까지 O(n)을 만족

            - N=9일 경우, x가 9인 경우부터 판단할 수 있는데 부등식을 만족하지 않으므로 O(n) 불만족

    - c<a

        - b/(c-a)>=x에서 x는 N보다 크거나 같은 수로 값의 범위가 없으므로 양의 무한대까지 커질 수 있음

        - c<a를 만족하는 x가 있을 수 없음

        - O(n)을 판별하는 조건식에서 c<a일 경우는 N값과 무관하게 무조건 불만족

 

😮 이 외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
 
        int A = Integer.parseInt(st.nextToken());
        int B = Integer.parseInt(st.nextToken());
 
        int C = Integer.parseInt(br.readLine());
        int N = Integer.parseInt(br.readLine());
 
        int fn = A * N + B;
        int gn = C * N;
 
        if (C >= A && fn <= gn) {
            bw.write("1");
        } else {
            bw.write("0");
        }
 
        bw.flush();
        bw.close();
    }
 
}
 
 
 

- for 반복문 사용하지 않고, 조건식으로 판별