πŸ”₯[99클럽 μ½”ν…Œ μŠ€ν„°λ””] 38일차 TIL - λ””νŽœμŠ€ κ²Œμž„

HOONSSACΒ·2024λ…„ 8μ›” 28일
1

99Club Coding Test Study

λͺ©λ‘ 보기
38/41
post-thumbnail

⏳문제

μ€€ν˜ΈλŠ” μš”μ¦˜ λ””νŽœμŠ€ κ²Œμž„μ— ν‘Ή λΉ μ Έ μžˆμŠ΅λ‹ˆλ‹€. λ””νŽœμŠ€ κ²Œμž„μ€ μ€€ν˜Έκ°€ λ³΄μœ ν•œ 병사 nλͺ…μœΌλ‘œ μ—°μ†λ˜λŠ” 적의 곡격을 μˆœμ„œλŒ€λ‘œ λ§‰λŠ” κ²Œμž„μž…λ‹ˆλ‹€. λ””νŽœμŠ€ κ²Œμž„μ€ λ‹€μŒκ³Ό 같은 κ·œμΉ™μœΌλ‘œ μ§„ν–‰λ©λ‹ˆλ‹€.

  • μ€€ν˜ΈλŠ” μ²˜μŒμ— 병사 nλͺ…을 가지고 μžˆμŠ΅λ‹ˆλ‹€.

  • 맀 λΌμš΄λ“œλ§ˆλ‹€ enemy[i]마리의 적이 λ“±μž₯ν•©λ‹ˆλ‹€.

  • 남은 병사 쀑 enemy[i]λͺ… 만큼 μ†Œλͺ¨ν•˜μ—¬ enemy[i]마리의 적을 막을 수 μžˆμŠ΅λ‹ˆλ‹€.

  • 예λ₯Ό λ“€μ–΄ 남은 병사가 7λͺ…이고, 적의 μˆ˜κ°€ 2마리인 경우, ν˜„μž¬ λΌμš΄λ“œλ₯Ό λ§‰μœΌλ©΄ 7 - 2 = 5λͺ…μ˜ 병사가 λ‚¨μŠ΅λ‹ˆλ‹€.

  • 남은 λ³‘μ‚¬μ˜ μˆ˜λ³΄λ‹€ ν˜„μž¬ λΌμš΄λ“œμ˜ 적의 μˆ˜κ°€ 더 많으면 κ²Œμž„μ΄ μ’…λ£Œλ©λ‹ˆλ‹€.

  • κ²Œμž„μ—λŠ” λ¬΄μ κΆŒμ΄λΌλŠ” μŠ€ν‚¬μ΄ 있으며, λ¬΄μ κΆŒμ„ μ‚¬μš©ν•˜λ©΄ λ³‘μ‚¬μ˜ μ†Œλͺ¨μ—†μ΄ ν•œ λΌμš΄λ“œμ˜ 곡격을 막을 수 μžˆμŠ΅λ‹ˆλ‹€.

  • λ¬΄μ κΆŒμ€ μ΅œλŒ€ k번 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ€€ν˜ΈλŠ” λ¬΄μ κΆŒμ„ μ μ ˆν•œ μ‹œκΈ°μ— μ‚¬μš©ν•˜μ—¬ μ΅œλŒ€ν•œ λ§Žμ€ λΌμš΄λ“œλ₯Ό μ§„ν–‰ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

μ€€ν˜Έκ°€ 처음 가지고 μžˆλŠ” λ³‘μ‚¬μ˜ 수 n, μ‚¬μš© κ°€λŠ₯ν•œ 무적ꢌ의 횟수 k, 맀 λΌμš΄λ“œλ§ˆλ‹€ κ³΅κ²©ν•΄μ˜€λŠ” 적의 μˆ˜κ°€ μˆœμ„œλŒ€λ‘œ λ‹΄κΈ΄ μ •μˆ˜ λ°°μ—΄ enemyκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€. μ€€ν˜Έκ°€ λͺ‡ λΌμš΄λ“œκΉŒμ§€ 막을 수 μžˆλŠ”μ§€ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

πŸš¨μ œν•œ 사항

  • 1 ≀ n ≀ 1,000,000,000
  • 1 ≀ k ≀ 500,000
  • 1 ≀ enemy의 길이 ≀ 1,000,000
  • 1 ≀ enemy[i] ≀ 1,000,000
  • enemy[i]μ—λŠ” i + 1 λΌμš΄λ“œμ—μ„œ κ³΅κ²©ν•΄μ˜€λŠ” 적의 μˆ˜κ°€ λ‹΄κ²¨μžˆμŠ΅λ‹ˆλ‹€.
  • λͺ¨λ“  λΌμš΄λ“œλ₯Ό 막을 수 μžˆλŠ” κ²½μš°μ—λŠ” enemy[i]의 길이λ₯Ό return ν•΄μ£Όμ„Έμš”.

πŸ“ƒμž…μΆœλ ₯ 예

nkenemyresut
73[4, 2, 4, 5, 3, 3, 1]5
24[3, 3, 3, 3]4

μž…μΆœλ ₯ 예 #1

1, 3, 5 λΌμš΄λ“œμ˜ 곡격을 무적ꢌ으둜 막아내고, 2, 4 λΌμš΄λ“œμ— 각각 병사λ₯Ό 2λͺ…, 5λͺ… μ†Œλͺ¨ν•˜λ©΄ 5λΌμš΄λ“œκΉŒμ§€ 곡격을 막을 수 μžˆμŠ΅λ‹ˆλ‹€. 또, 1, 3, 4번째 곡격을 무적ꢌ으둜 막아내고, 2, 5 번째 곡격에 각각 병사λ₯Ό 2λͺ…, 3λͺ… μ†Œλͺ¨ν•˜μ—¬ 5λΌμš΄λ“œκΉŒμ§€ 곡격을 막을 수 μžˆμŠ΅λ‹ˆλ‹€. 그보닀 λ§Žμ€ λΌμš΄λ“œλ₯Ό λ§‰λŠ” 방법은 μ—†μœΌλ―€λ‘œ 5λ₯Ό return ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2

μ€€ν˜ΈλŠ” λͺ¨λ“  곡격에 λ¬΄μ κΆŒμ„ μ‚¬μš©ν•˜μ—¬ 4λΌμš΄λ“œκΉŒμ§€ 막을 수 μžˆμŠ΅λ‹ˆλ‹€.


βœοΈν’€μ΄

이 λ¬Έμ œλŠ” 그리디와 μš°μ„  μˆœμœ„ 큐λ₯Ό μ‚¬μš©ν•΄ ν•΄κ²°ν•  수 μžˆμ—ˆλ‹€.
λ¬΄μ κΆŒμ€ 적의 μˆ«μžκ°€ κ°€μž₯ λ§Žμ„ λ•Œ μ“°λŠ” 것이 효율적이기 λ•Œλ¬Έμ—, λ¬΄μ κΆŒμ„ μ“Έ 쑰건을 μ„Έμš°λŠ” 것이 이 문제의 μš”μ μ΄μ—ˆλ‹€κ³  μƒκ°ν•œλ‹€.

μš°μ„  μˆœμœ„ νλŠ” λ¬΄μ κΆŒμ„ 효율적으둜 μ‚¬μš©ν•  λΌμš΄λ“œλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜μ˜€λ‹€.
예λ₯Ό λ“€μ–΄, μš°μ„  μˆœμœ„ 큐에 μ €μž₯λ˜μ–΄ μžˆλŠ” λΌμš΄λ“œμ˜ μ΅œμ†Œ 적 μˆ«μžλ³΄λ‹€ 더 λ§Žμ€ 수의 적이 λ‚˜μ˜€λŠ” λΌμš΄λ“œλ₯Ό λ§Œλ‚˜λ©΄, ν•΄λ‹Ή λΌμš΄λ“œμ— λ¬΄μ κΆŒμ„ μ“°λŠ” 것이 더 νš¨μœ¨μ μ΄λ‹€.
λ”°λΌμ„œ 이 κ²½μš°μ—λŠ” κΈ°μ‘΄ λΌμš΄λ“œμ—μ„œ μ‚¬μš©ν–ˆλ˜ λ¬΄μ κΆŒμ„ μ·¨μ†Œ(μš°μ„  μˆœμœ„ νμ—μ„œ 제거)ν•˜κ³  μƒˆλ‘œ 마주친 λΌμš΄λ“œμ—μ„œ λ¬΄μ κΆŒμ„ μ‚¬μš©(μš°μ„  μˆœμœ„ 큐에 μΆ”κ°€)ν•˜κ²Œ λ˜λŠ” 것이닀.
λ¬Όλ‘ , 무적ꢌ μ‚¬μš©μ„ μ·¨μ†Œν•œ λΌμš΄λ“œλŠ” ν˜„μž¬ λ³‘μ‚¬λ‘œ μ „νˆ¬λ₯Ό ν•΄μ•Ό ν•œλ‹€.

πŸ‘Ύμ „μ²΄ μ½”λ“œ

import java.util.*;

class Solution {
    public int solution(int n, int k, int[] enemy) {
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        int answer = 0;
        
        if (k >= enemy.length) {
            return enemy.length;
        }
        
        // μ΄ˆλ°˜μ— 무적ꢌ λ‹€ μ‚¬μš©
        for (int i = 0; i < k; i++) {
            pq.add(enemy[i]); // 무적ꢌ μ‚¬μš©
            answer++; // 막아낸 λΌμš΄λ“œ 증가
        }

        for (int i = k; i < enemy.length; i++) {
            if (pq.peek() < enemy[i] && pq.peek() <= n) {
                n -= pq.poll(); // 남은 λ³‘μ‚¬λ‘œ 막아내기
                pq.add(enemy[i]); // i번째 λΌμš΄λ“œμ— λŒ€ν•œ 무적ꢌ μ‚¬μš©
                answer++; // 막아낸 λΌμš΄λ“œ 개수 증가
            }
            else {
                if (enemy[i] > n) {
                    return answer; // 더 이상 진행 λΆˆκ°€
                }
                else {
                    n -= enemy[i]; // 남은 병사 수 μ—…λ°μ΄νŠΈ
                    answer++; // 막아낸 λΌμš΄λ“œ 개수 증가
                }

            }
        }
        return answer;
    }
}

πŸ‘Ύμ½”λ“œ μ„€λͺ…

  1. 무적ꢌ의 κ°œμˆ˜κ°€ λͺ¨λ“  λΌμš΄λ“œμ˜ 길이 이상이면, λͺ¨λ“  λΌμš΄λ“œλ₯Ό 무쑰건 클리어 ν•  수 있기 λ•Œλ¬Έμ— λΌμš΄λ“œμ˜ 길이λ₯Ό κ·ΈλŒ€λ‘œ λ¦¬ν„΄ν•œλ‹€.

  2. 일단 μ΄ˆλ°˜μ— λ¬΄μ κΆŒμ„ λͺ¨λ‘ μ‚¬μš©(μš°μ„  μˆœμœ„ 큐에 λͺ¨λ‘ μΆ”κ°€)ν•˜κ³ , 막아낸 λΌμš΄λ“œμ˜ 개수 answer도 μ¦κ°€μ‹œμΌœ μ€€λ‹€.

  3. λ¬΄μ κΆŒμ„ μ‚¬μš©ν•œ λΌμš΄λ“œ 쀑 μ΅œμ†Œκ°’(pqμ—μ„œ peek()ν•œ κ°’)보닀 ν˜„μž¬ i번째 λΌμš΄λ“œμ˜ 적의 μˆ˜κ°€ 더 많고, peek()ν•œ λΌμš΄λ“œλ₯Ό ν˜„μž¬ λ³‘μ‚¬μ˜ 수둜 클리어할 수 μžˆλ‹€λ©΄, ν•΄λ‹Ή λΌμš΄λ“œλ₯Ό pqμ—μ„œ poll()ν•΄ 남은 병사 n으둜 막아내고, ν˜„μž¬ i번째 λΌμš΄λ“œμ— λŒ€ν•œ λ¬΄μ κΆŒμ„ μ‚¬μš©ν•œλ‹€. (answer 증가)

  4. 3번 쑰건에 λΆ€ν•©ν•˜μ§€ μ•Šμ•„ λ¬΄μ κΆŒμ„ 더 이상 μ‚¬μš©ν•  수 μ—†κ³ , ν˜„μž¬ i번째 λΌμš΄λ“œμ˜ 적의 μˆ˜κ°€ 남은 병사보닀 λ§Žλ‹€λ©΄, 더 이상 λΌμš΄λ“œλ₯Ό 진행할 수 μžˆλŠ” 방법이 μ—†κΈ° λ•Œλ¬Έμ— ν˜„μž¬κΉŒμ§€ 막아낸 λΌμš΄λ“œμ˜ 개수 answerλ₯Ό λ°˜ν™˜ν•œλ‹€.

  5. 3번 쑰건에 λΆ€ν•©ν•˜μ§€ μ•Šμ•„ λ¬΄μ κΆŒμ„ 더 이상 μ‚¬μš©ν•  순 μ—†μ§€λ§Œ, ν˜„μž¬ i번째 λΌμš΄λ“œμ˜ 적의 μˆ˜κ°€ 남은 병사보닀 적닀면, 남은 λ³‘μ‚¬λ‘œ λΌμš΄λ“œλ₯Ό 더 진행할 수 있기 λ•Œλ¬Έμ— n의 값을 enemy[i]만큼 κ°μ†Œμ‹œμΌœ μ€€λ‹€. (answer 증가)


πŸ”—λ¬Έμ œ 링크
πŸ’»Repository

profile
ν›ˆμ‹Ήμ˜ κ°œλ°œμ—¬ν–‰

2개의 λŒ“κΈ€

comment-user-thumbnail
2024λ…„ 8μ›” 28일

무적ꢌ~ λ¬΄μ κΆŒμ΄μ•Ό~ 짜짜라짜라짜라 μ§ μ§ μ§ 

1개의 λ‹΅κΈ€