λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🎯PS - Baekjoon, etc/그리디

[이것이 μ½”λ”© ν…ŒμŠ€νŠΈλ‹€] 1이 될 λ•ŒκΉŒμ§€ (Java)

by hyeon-z 2023. 3. 3.

 

μ‹œκ°„μ œν•œ

1초

 

문제

μ–΄λ– ν•œ μˆ˜ N이 1이 λ  λ•ŒκΉŒμ§€ λ‹€μŒμ˜ λ‘ κ³Όμ • μ€‘ ν•˜λ‚˜λ₯Ό λ°˜λ³΅μ μœΌλ‘œ μ„ νƒν•˜μ—¬ μˆ˜ν–‰ν•˜λ €κ³  ν•œλ‹€.
단, 두 번째 연산은 N이 K둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§ˆ λ•Œλ§Œ 선택할 수 μžˆλ‹€.

 

1. Nμ—μ„œ 1을 λΊ€λ‹€.
2. N을 K둜 λ‚˜λˆˆλ‹€.

예λ₯Ό λ“€μ–΄ N이 17, Kκ°€ 4라고 κ°€μ •ν•˜μž. μ΄λ•Œ 1번의 κ³Όμ •을 ν•œ λ²ˆ μˆ˜ν–‰ν•˜λ©΄ N은 16이 λœλ‹€.
이후에 2번의 과정을 두 번 μˆ˜ν–‰ν•˜λ©΄ N은 1이 λœλ‹€.
결과적으둜 이 경우 전체 과정을 μ‹€ν–‰ν•œ νšŸμˆ˜λŠ” 3이 λœλ‹€. μ΄λŠ” N을 1둜 λ§Œλ“œλŠ” μ΅œμ†Œ νšŸμˆ˜μ΄λ‹€.
Nκ³Ό Kκ°€ μ£Όμ–΄μ§ˆ λ•Œ N이 1이 λ  λ•ŒκΉŒμ§€ 1번 ν˜Ήμ€ 2번의 κ³Όμ •을 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” μ΅œμ†Œ νšŸμˆ˜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 μ€„에 N(2 <= N <= 100.000)κ³Ό K(2 <= K <= 100.000)κ°€ κ³΅λ°±μœΌλ‘œ κ΅¬λΆ„λ˜λ©° κ°κ° μžμ—°μˆ˜λ‘œ μ£Όμ–΄μ§„λ‹€. 

μ΄λ•Œ μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” N은 ν•­μƒ K보닀 ν¬κ±°λ‚˜ κ°™λ‹€.

μž…λ ₯ μ˜ˆμ‹œ

25 5

 

좜λ ₯

첫째 μ€„에 N이 1 μ΄ λ  λ•ŒκΉŒμ§€ 1번 ν˜Ήμ€ 2번의 κ³Όμ •을 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” νšŸμˆ˜μ˜ μ΅œμ†Ÿκ°’을 μΆœλ ₯ν•œλ‹€.

좜λ ₯ μ˜ˆμ‹œ

2

문제 풀이 κ³Όμ •

λ¨Όμ € 2κ°€μ§€ 선택지λ₯Ό ν™•μΈν•œλ‹€.

1. Nμ—μ„œ 1을 λΊ€λ‹€.
2. N을 K둜 λ‚˜λˆˆλ‹€.

K의 λ²”μœ„λŠ” 2μ΄μƒμ΄λ―€λ‘œ 2κ°€ κ°€λŠ₯ν•œ 경우라면 λ°˜λ“œμ‹œ 2λ₯Ό 선택해야 더 적은 횟수둜 N을 1둜 λ§Œλ“€ 수 μžˆλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

 

ν•˜μ§€λ§Œ λͺ…심해야 ν•  쑰건이 μžˆλ‹€.

단, 두 번째 연산은 N이 K둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§ˆ λ•Œλ§Œ 선택할 수 μžˆλ‹€.

N이 K둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€μ§€ μ•ŠλŠ” κ²½μš°λŠ” 1을 반볡적으둜 μˆ˜ν–‰ν•˜μ—¬ N이 K둜 λ‚˜λˆ„μ–΄λ–¨μ–΄μ§ˆ 수 μžˆλ„λ‘ ν•΄μ•Ό ν•œλ‹€.

 

1. N이 K의 λ°°μˆ˜κ°€ 될 λ•ŒκΉŒμ§€ 1을 λΊ€λ‹€.
2. N을 K둜 λ‚˜λˆˆλ‹€.

λ¬Όλ‘  N이 K의 λ°°μˆ˜κ°€ 될 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•΄μ„œ 1을 빼도둝 κ΅¬ν˜„ν•  수 μžˆμ§€λ§Œ νš¨μœ¨μ μ΄μ§€ μ•Šλ‹€.

 

ν•œ λ²ˆμ— N의 K의 배수둜 λ§Œλ“€ 만큼 λΉΌκΈ°

μ˜ˆμ‹œλ₯Ό λ“€μ–΄μ„œ 쑰금 더 μžμ„Ένžˆ μ‚΄νŽ΄λ³΄μž.

μž…λ ₯ 값이 26 3인 경우
1. 26κ³Ό κ°€μž₯ κ°€κΉŒμš΄ 3의 λ°°μˆ˜λŠ” 24
2. 24둜 λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” 26μ—μ„œ 2(26-24)λ₯Ό λΉΌμ•Ό ν•œλ‹€.

λ¨Όμ € Nκ³Ό κ°€μž₯ κ°€κΉŒμš΄ K의 배수λ₯Ό ꡬ해야 ν•œλ‹€.

target = (N / K) * K;

κ·Έ ν›„ N - target만큼 μˆ˜ν–‰ νšŸμˆ˜μ— λ”ν•œλ‹€.

count += (N - target);
N = target;

이제 2λ₯Ό μˆ˜ν–‰ν•  수 μžˆλŠ” 쑰건을 λ§Œμ‘±ν–ˆλ‹€.

 

N을 K둜 λ‚˜λˆˆλ‹€.
N /= K;
count += 1;

N을 K둜 λ‚˜λˆˆ ν›„ μˆ˜ν–‰ 횟수λ₯Ό 1 λ”ν•œλ‹€.

 

반볡적으둜 1κ³Ό 2λ₯Ό μˆ˜ν–‰ν•˜λ©΄μ„œ N이 K보닀 μž‘μ•„μ§€λŠ” κ²½μš°μ—λŠ” μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ?

while (N >= K) {
          ...
}
count += (N - 1);

N이 K보닀 μž‘μ•„μ§„ 경우 N을 K둜 λ‚˜λˆŒ 수 μ—†μœΌλ―€λ‘œ N - 1만큼 μˆ˜ν–‰ 횟수λ₯Ό λ”ν•œλ‹€.


처음 μ½”λ“œ

public class TC_3_3 {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();
        int K = sc.nextInt();
        int count = 0;

        while (N != 1) {
            if (N % K == 0) {
                N /= K;
            } else {
                N -= 1;
            }
            count++;
        }
        System.out.println(count);
    }
}

맀번 λ°˜λ³΅λΆ„μ„ 돌며 N이 K의 λ°°μˆ˜κ°€ 될 λ•ŒκΉŒμ§€ 1을 λΉΌλŠ” 과정이 νš¨μœ¨μ μ΄μ§€ μ•Šλ‹€λŠ” 것을 κΉ¨λ‹«κ³  μˆ˜μ •ν–ˆλ‹€.

 

μˆ˜μ •ν•œ μ½”λ“œ

public class TC_3_3 {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();
        int K = sc.nextInt();
        int count = 0;

        while (N >= K) {
            int target = (N / K) * K;
            count += (N - target);
            N = target;

            N /= K;
            count += 1;
        }
        count += (N - 1);
        System.out.println(count);
    }
}

 

 

Reference

이것이 취업을 μœ„ν•œ μ½”λ”©ν…ŒμŠ€νŠΈλ‹€ - λ‚˜λ™λΉˆ

λŒ“κΈ€