[Java]BOJ 16112 : 5μ°¨ 전직

2024. 12. 3. 21:54Β·Algorithm

https://www.acmicpc.net/problem/16112

🚩문제

πŸ”“λ¬Έμ œν•΄κ²°

1. ν™œμ„±ν™”λœ μŠ€ν†€μ€ κ²½ν—˜μΉ˜κ°€ 0이 되고 ν™œμ„±ν™”λ˜μ–΄μžˆλŠ” μŠ€ν†€μ— κ·Έ 값이 더해진닀.

2.μ΅œλŒ“κ°’μ„ κ΅¬ν•˜λ €λ©΄ μž‘μ€ κ²½ν—˜μΉ˜λΆ€ν„° ν™œμ„±ν™”λ˜μ–΄μ•Όν•œλ‹€.

=>ν™œμ„±ν™”λ λ•Œ κ²½ν—˜μΉ˜κ°€ 0μ΄λ˜λ‹ˆ λͺ¨λ‘ ν™œμ„±ν™”κ°€ λ˜μ—ˆμ„λ•Œ λ‚¨μ•„μžˆλŠ” μŠ€ν†€μ˜ κ²½ν—˜μΉ˜κ°€ 클수둝 μ’‹κΈ° λ•Œλ¬Έμ΄λ‹€.

=>ν™œμ„±ν™”κ°―μˆ˜κ°€ μ΅œλŒ€κ°€ 되면 κ·Έ μ΄ν›„λ‘œ 남은 μŠ€ν†€μ€ ν™œμ„±ν™”κ°―μˆ˜λ§ŒνΌ κ²½ν—˜μΉ˜κ°€ 더해진닀.


μ°Έκ³  λΈ”λ‘œκ·Έ : https://blog.naver.com/hoo3164/222718534082

예λ₯Ό λ“€μ–΄ μŠ€ν†€ 6개 , μ΅œλŒ€ ν™œμ„±ν™” μŠ€ν†€ 개수(3개)

1번째 ν™œμ„±ν™” ->영ν–₯λ°›λŠ” μŠ€ν†€x

2번째 ν™œμ„±ν™” ->영ν–₯λ°›λŠ” μŠ€ν†€1개

3번째 ν™œμ„±ν™” ->영ν–₯λ°›λŠ” μŠ€ν†€2개

4번째 ν™œμ„±ν™” -> 영ν–₯λ°›λŠ” μŠ€ν†€ 3개

5번째 ν™œμ„±ν™” -> (2,3,4)λ²ˆμ§Έν™œμ„±ν™” 된 μŠ€ν†€  =   영ν–₯λ°›λŠ” μŠ€ν†€ 3개

6번째 ν™œμ„±ν™” -> (3,4,5)번째 ν™œμ„±ν™” 된 μŠ€ν†€ = 영ν–₯λ°›λŠ” μŠ€ν†€ 3개


μš°μ„ μˆœμœ„ 큐 μ‹œκ°„ λ³΅μž‘λ„λŠ” μž…λ ₯: O(log n), peek: O(1), poll: O(log n) 의 μ‹œκ°„λ³΅μž‘λ„

3. μš°μ„ μˆœμœ„ν(A)에 κ²½ν—˜μΉ˜λ₯Ό μž…λ ₯ν•΄μ€€λ‹€

4.μ΅œλŒ€ ν™œμ„±ν™” μŠ€ν†€κ°œμˆ˜κ°€ 되기 μ „κΉŒμ§€λŠ” ν•΄λ‹Ή 값을 νμ—μ„œ λΉΌλ‚΄κ³  ν™œμ„±ν™” μŠ€ν†€ 개수+1 ν•΄μ€€λ‹€.

5.νμ—μ„œ λΉΌλ‚Έ κ²½ν—˜μΉ˜ * ν™œμ„±ν™”μŠ€ν†€ 개수λ₯Ό 결과값에 λ”ν•΄μ„œ λ‹€λ₯Έ 큐(B)에 λ„£μ–΄μ€€λ‹€.

6.μ΅œλŒ€ ν™œμ„±ν™” μŠ€ν†€ κ°œμˆ˜κ°€ 되면  큐에 남은 μŠ€ν†€μ˜ κ²½ν—˜μΉ˜ * μ΅œλŒ€ν™œμ„±ν™”μŠ€ν†€κ°œμˆ˜ ν›„ 결과값에 더해쀀닀

7.B에 μ €μž₯된 κ²½ν—˜μΉ˜λ“€μ„ 결과값에 더해쀀닀.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

/*
* μž…λ ₯
κ²½ν—˜μΉ˜κ°―μˆ˜n μ΅œλŒ€ν™œμ„±ν™”k
*
* 좜λ ₯
κ²½ν—˜μΉ˜ν•©μ˜ μ΅œλŒ“κ°’
* */

* */
public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PriorityQueue<Long>pq = new PriorityQueue();
        PriorityQueue<Long>pq2 = new PriorityQueue();
        String [] str = br.readLine().split(" ");
        String [] str2 = br.readLine().split(" ");
        long n = Long.parseLong(str[0]); //κ²½ν—˜μΉ˜ 수
        long k = Long.parseLong(str[1]); // ν™œμ„±ν™” 갯수
        long result = 0L;
        int cnt =0;
        for (int i = 0; i < n; i++) {
            pq.offer(Long.parseLong(str2[i]));
        }
        while (cnt<=k && !pq.isEmpty()) { //ν™œμ„±ν™” ν• λ•Œ
            Long m = pq.poll();
            pq2.offer(m*cnt);
            cnt++;
        }

        while (!pq2.isEmpty()) { //ν™œμ„±ν™” λ˜μ—ˆλ˜ μŠ€ν†€
            result += pq2.poll();

        }
        while(!pq.isEmpty()){ //λ‚¨μ•„μžˆλŠ” μŠ€ν†€
            result += pq.poll()*k;
        }

        System.out.println(result);

    }

}

λ©”λͺ¨λ¦¬ : 72312KB, μ‹œκ°„ : 608ms

 

πŸ’Šλ˜ λ‹€λ₯Έ 풀이

1. μœ„μ—μ„œ 처럼 μš°μ„ μˆœμœ„ 큐둜 μ ‘κ·Όν•˜λŠ” 방법은 λ˜‘κ°™λ‹€.

2.ν•˜μ§€λ§Œ μš°μ„ μˆœμœ„ 큐 1개 +while+if문의 쑰합을 이용

3.while문을 돌며 큐의 값을 λ°”λ‘œ κ³„μ‚°ν•΄μ„œ 결과값에 더해쀀닀.

   3-1 λ§Œμ•½ ν™œμ„±ν™”μŠ€ν†€κ°―μˆ˜κ°€ μ΅œλŒ€ν™œμ„±ν™” μŠ€ν†€κ°œμˆ˜κ°€ λ˜μ§€μ•Šμ•˜λ‹€λ©΄ 결과값에 κΊΌλ‚Έ κ²½ν—˜μΉ˜ * ν™œμ„±ν™”μŠ€ν†€κ°―μˆ˜λ₯Ό λ”ν•˜κ³ 

          ν™œμ„±ν™”μŠ€ν†€κ°―μˆ˜ +1 ν•΄μ€€λ‹€.

   3-2 λ§Œμ•½ ν™œμ„±ν™” μŠ€ν†€κ°―μˆ˜μ™€ κ°™μœΌλ©΄ κΊΌλ‚Έ κ²½ν—˜μΉ˜ * ν™œμ„±ν™” μŠ€ν†€κ°―μˆ˜λ§Œ ν•΄μ€€λ‹€.

4.큐가 λΉˆμŠ€νƒμ΄ 되면 값을 좜λ ₯ν•œλ‹€.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

/*
* μž…λ ₯
κ²½ν—˜μΉ˜κ°―μˆ˜n μ΅œλŒ€ν™œμ„±ν™”k
*
* 좜λ ₯
κ²½ν—˜μΉ˜ν•©μ˜ μ΅œλŒ“κ°’
* */

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PriorityQueue<Long>pq = new PriorityQueue();

        String [] str = br.readLine().split(" ");
        String [] str2 = br.readLine().split(" ");

        long n = Long.parseLong(str[0]); //κ²½ν—˜μΉ˜ 수
        long k = Long.parseLong(str[1]); // ν™œμ„±ν™” 갯수
        long result = 0L; //κ²°κ³Όκ°’

        for (int i = 0; i < n; i++) {
            pq.offer(Long.parseLong(str2[i]));
        }

        pq.poll(); //μŠ€ν†€1개λ₯Ό ν™œμ„±ν™”
        int cnt =1; //ν˜„μž¬κΉŒμ§€ ν™œμ„±ν™”λœ μŠ€ν†€ 갯수
//1개λ₯Ό whileλ¬Έ λ°–μ—μ„œ ν™œμ„±ν™” ν•œ μ΄μœ λŠ” 1개만 λ½‘μ•˜μ„λ•ŒλŠ” 영ν–₯을 λ―ΈμΉ˜λŠ” μŠ€ν†€μ΄ μ—†κΈ°λ•Œλ¬Έμ΄λ‹€
        while (!pq.isEmpty()) {
            if(cnt<k){
                result += pq.poll() * cnt;
                cnt++;
            }else {
                result+=pq.poll()*k;
            }
        }

        System.out.println(result);

    }

}

λ©”λͺ¨λ¦¬ : 61216KB, μ‹œκ°„ : 556ms

'Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Java]BOJ 2776 : μ•”κΈ°μ™•  (0) 2025.01.13
[Java]BOJ 1388 : λ°”λ‹₯μž₯식  (0) 2024.12.07
[Java]BOJ 1026 : 보물  (0) 2024.12.06
BOJ 1863 : 슀카이라인 μ‰¬μš΄κ±°  (0) 2024.12.03
BOJ 11557 : Yangjojang of The Year -JAVA  (1) 2024.12.03
'Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Java]BOJ 1388 : λ°”λ‹₯μž₯식
  • [Java]BOJ 1026 : 보물
  • BOJ 1863 : 슀카이라인 μ‰¬μš΄κ±°
  • BOJ 11557 : Yangjojang of The Year -JAVA
m.<jj
m.<jj
  • m.<jj
    JJ
    m.<jj
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (24)
      • Study (14)
        • Python (7)
        • Java (4)
        • HTML-CSS (1)
        • error (1)
        • Redis (0)
      • Algorithm (9)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    python
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.1
m.<jj
[Java]BOJ 16112 : 5μ°¨ 전직
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”