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

[이것이 μ½”λ”© ν…ŒμŠ€νŠΈλ‹€] 큰 수의 법칙 (Java)

by hyeon-z 2023. 2. 3.

μ‹œκ°„μ œν•œ

1초

문제

‘큰 μˆ˜μ˜ λ²•μΉ™’은 μΌλ°˜μ μœΌλ‘œ ν†΅κ³„ λΆ„μ•Όμ—μ„œ λ‹€λ£¨μ–΄μ§€λŠ” λ‚΄μš©μ΄μ§€λ§Œ λ™λΉˆμ΄λŠ” λ³ΈμΈλ§Œμ˜ λ°©μ‹μœΌλ‘œ λ‹€λ₯΄κ²Œ μ‚¬μš©ν•˜κ³  μžˆλ‹€.
λ™λΉˆμ΄μ˜ ν° μˆ˜μ˜ λ²•칙은 λ‹€μ–‘ν•œ μˆ˜λ‘œ μ΄λ£¨μ–΄μ§„ λ°°μ—΄μ΄ μžˆμ„ λ•Œ μ£Όμ–΄μ§„ μˆ˜λ“€μ„ M번 λ”ν•˜μ—¬ κ°€μž₯ ν° μˆ˜λ₯Ό λ§Œλ“œλŠ” λ²•칙이닀.
λ‹¨οΌŒλ°°μ—΄μ˜ νŠΉμ •ν•œ μΈλ±μŠ€(번호)에 ν•΄λ‹Ήν•˜λŠ” μˆ˜κ°€ μ—°μ†ν•΄μ„œ Kλ²ˆμ„ μ΄ˆκ³Όν•˜μ—¬ λ”ν•΄μ§ˆ μˆ˜ μ—†λŠ” κ²ƒμ΄ μ΄ λ²•μΉ™μ˜ νŠΉμ§•μ΄λ‹€.

 

예λ₯Ό λ“€μ–΄ μˆœμ„œλŒ€λ‘œ 2, 4, 5, 4, 6으둜 이루어진 배열이 μžˆμ„ λ•Œ M이 8이고, Kκ°€ 3이라고 κ°€μ •ν•˜μž.

이 경우 νŠΉμ •ν•œ 인덱슀의 μˆ˜κ°€ μ—°μ†ν•΄μ„œ μ„Έ λ²ˆκΉŒμ§€λ§Œ λ”ν•΄μ§ˆ 수 μžˆμœΌλ―€λ‘œ 큰 수의 법칙에 λ”°λ₯Έ κ²°κ³ΌλŠ” 6 + 6 + 6 + 5+ 6 + 6 + 6 + 5인 46이 λœλ‹€.

 

λ‹¨οΌŒμ„œλ‘œ λ‹€λ₯Έ μΈλ±μŠ€μ— ν•΄λ‹Ήν•˜λŠ” μˆ˜κ°€ 같은 κ²½μš°μ—λ„ μ„œλ‘œ λ‹€λ₯Έ κ²ƒμœΌλ‘œ κ°„μ£Όν•œλ‹€.

예λ₯Ό λ“€μ–΄ μˆœμ„œλŒ€λ‘œ 3, 4, 3, 4, 3으둜 이루어진 배열이 μžˆμ„ λ•Œ M이 7이고,Kκ°€ 2라고 κ°€μ •ν•˜μž.

이 경우 두 번째 μ›μ†Œμ— ν•΄λ‹Ήν•˜λŠ” 4와 λ„€ 번째 μ›μ†Œμ— ν•΄λ‹Ήν•˜λŠ” 4λ₯Ό λ²ˆκ°ˆμ•„ 두 λ²ˆμ”© λ”ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

결과적으둜 4 + 4 + 4 + 4 + 4 + 4 + 4인 28이 λ„μΆœλœλ‹€.

 

λ°°μ—΄μ˜ 크기 N, μˆ«μžκ°€ λ”ν•΄μ§€λŠ” 횟수 M, 그리고 Kκ°€ μ£Όμ–΄μ§ˆ λ•Œ λ™λΉˆμ΄μ˜ 큰 수의 법칙에 λ”°λ₯Έ κ²°κ³Όλ₯Ό 좜λ ₯ν•˜μ‹œμ˜€.

 

μž…λ ₯

- 첫째 쀄에 N(2 < N < 1,000), M(1 <  M < 10,000), K(1  <  K < 10,000)의 μžμ—°μˆ˜κ°€ μ£Όμ–΄μ§€λ©°, 각 μžμ—°μˆ˜λŠ” 곡백으둜 κ΅¬λΆ„ν•œλ‹€.
- λ‘˜μ§Έ μ€„에 N개의 μžμ—°μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. κ° μžμ—°μˆ˜λŠ” κ³΅λ°±μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. λ‹¨, κ°κ°μ˜ μžμ—°μˆ˜λŠ” 1 μ΄μƒ 10,000 μ΄ν•˜μ˜ μˆ˜λ‘œ μ£Όμ–΄μ§„λ‹€.
- μž…λ ₯으둜 μ£Όμ–΄μžλŠ” KλŠ” ν•­μƒ M보닀 μž‘κ±°λ‚˜ κ°™λ‹€.

μž…λ ₯ μ˜ˆμ‹œ

5 8 3
2 4 5 4 6

 

좜λ ₯

첫째 μ€„에 λ™λΉˆμ΄μ˜ ν° μˆ˜μ˜ λ²•칙에 λ”°λΌ λ”ν•΄μ§„ λ‹΅μ„ μΆœλ ₯ν•œλ‹€.

좜λ ₯ μ˜ˆμ‹œ

46

문제 풀이 κ³Όμ •

첫 쀄에 총 3개의 μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€.

N: λ°°μ—΄μ˜ 크기
M: μˆ«μžκ°€ λ”ν•΄μ§€λŠ” 횟수
K: λ°°μ—΄μ˜ νŠΉμ •ν•œ μΈλ±μŠ€μ— ν•΄λ‹Ήν•˜λŠ” μˆ˜κ°€ μ—°μ†ν•΄μ„œ λ”ν•΄μ§ˆ 수 μžˆλŠ” 횟수

 

κ·Έ ν›„ N개의 μˆ˜κ°€ 정렬이 λ˜μ–΄ μžˆμ§€ μ•Šμ€ μƒνƒœλ‘œ μ£Όμ–΄μ§„λ‹€.

κ°€μž₯ 큰 수λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄μ„œ 정렬은 ν•„μˆ˜μ΄λ‹€.

 Arrays.sort() μ‚¬μš©

 

κ°€μž₯ 큰 수λ₯Ό M번 κ³±ν•˜λ©΄ μ£Όμ–΄μ§„ μˆ˜λ“€μ„ M번 λ”ν•˜μ—¬ κ°€μž₯ 큰 수λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

ν•˜μ§€λ§Œ, λ¬Έμ œμ—λŠ” ν•˜λ‚˜μ˜ 쑰건이 μ‘΄μž¬ν•œλ‹€.

"λ°°μ—΄μ˜ νŠΉμ •ν•œ 인덱슀(번호)에 ν•΄λ‹Ήν•˜λŠ” μˆ˜κ°€ μ—°μ†ν•΄μ„œ Kλ²ˆμ„ μ΄ˆκ³Όν•˜μ—¬ λ”ν•΄μ§ˆ 수 μ—†λ‹€." 
κ°€μž₯ 큰 수 K번 λ”ν•˜κΈ°

 

μ—°μ†μ μœΌλ‘œ Kλ²ˆμ€ 더 이상 더할 수 μ—†λ‹€.

두 번째둜 큰 수 1번 λ”ν•˜κΈ°

 

λ‹€μ‹œ κ°€μž₯ 큰 수λ₯Ό λ”ν•˜λŠ” 것이 κ°€λŠ₯ν•΄μ‘Œλ‹€.

κ°€μž₯ 큰 수 K번 λ”ν•˜κΈ°
두 번째둜 큰 수 1번 λ”ν•˜κΈ°

μœ„ 과정을 λ°˜λ³΅ν•˜λ©° 계산이 진행될 κ²ƒμž„μ„ 예츑!

 

μ˜ˆμ‹œλ₯Ό 톡해 μžμ„Ένžˆ μ‚΄νŽ΄λ³΄λ©΄

κ°€μž₯ 큰 수λ₯Ό K번, κ·Έλ‹€μŒμœΌλ‘œ 큰 수λ₯Ό 1번 λ”ν•¨μœΌλ‘œμ¨ K+1μ”© κ·œμΉ™μ μœΌλ‘œ 더해지고 μžˆμŒμ„ μ•Œ 수 μžˆλ‹€.

였λ₯Έμͺ½μ˜ μ˜ˆμ‹œμ²˜λŸΌ K+1만큼 λ”ν–ˆμ§€λ§Œ 2번의 λ§μ…ˆμ΄ λ‚¨μ•„μžˆλŠ” κ²½μš°λŠ” κ°€μž₯ 큰 수λ₯Ό λ‚˜λ¨Έμ§€λ§ŒνΌ 더해쀀닀.

M / (K + 1) 만큼 κ°€μž₯ 큰 수(K번)와 두 번째둜 ν° 수(1번)의 λ§μ…ˆμ΄ 반볡
M % (K + 1) 만큼 κ°€μž₯ 큰 수 λ”ν•˜κΈ°

=> ( M / (K + 1) ) (κ°€μž₯ 큰 수 * K + 두 번째둜 ν° 수) + ( M % (K + 1) ) * κ°€μž₯ 큰 수

 


μ½”λ“œ

public class TC_3_1 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine());
        int[] number = new int[n];

        for (int i = 0; i < n; i++) {
            number[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(number);

        int first = number[n - 1];  // κ°€μž₯ 큰 수
        int second = number[n - 2];  // 두 번째둜 큰 수

        int quotient = m / (k + 1);
        int remainder = m % (k + 1);
        int result = 0;

        result += quotient * (first * k + second) + remainder * first;

        System.out.println(result);
    }
}

 

+) μ±… 풀이 방식

M / (K + 1) λ§ŒνΌ κ°€μž₯ 큰 수(K번)와 κ·Έλ‹€μŒ 큰 수(1번)의 λ§μ…ˆμ΄ 반볡
M % (K + 1) λ§ŒνΌ κ°€μž₯ 큰 수 λ”ν•˜κΈ°

이 식을 톡해 μ•„λž˜μ˜ 각각 λ”ν•΄μ§€λŠ” 횟수λ₯Ό ꡬ할 수 μžˆλ‹€.

 

κ°€μž₯ 큰 μˆ˜κ°€ λ”ν•΄μ§€λŠ” 횟수: M / (K + 1) * K + M % (K + 1)

두 번째둜 큰 μˆ˜κ°€ λ”ν•΄μ§€λŠ” 횟수: M / (K + 1)  or ( M - κ°€μž₯ 큰 μˆ˜κ°€ λ”ν•΄μ§€λŠ” 횟수 )

int cnt = quotient * k + remainder;
 
result += cnt * first;
result += (m - cnt) * second;

 

Reference

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

λŒ“κΈ€