[Programmers] Lv2. λ””νŽœμŠ€ κ²Œμž„ | C++

2023. 7. 1. 18:16ㆍCoding Test/Programmers

πŸ”—λ¬Έμ œ λ³΄λŸ¬κ°€κΈ°
 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr

 

πŸ‘¨‍πŸ’»ν’€μ΄ κ³Όμ •

 

μ²˜μŒμ—λŠ” DP둜 무적ꢌ μŠ€ν‚¬μ„ μ‚¬μš©ν–ˆμ„ κ²½μš°μ™€ μ•ˆ ν–ˆμ„ 경우의 데이터듀을 μ €μž₯ν•˜μ—¬ ν’€μ–΄λ‚˜κ°€λ €κ³  ν–ˆλŠ”λ°, 무적ꢌ μŠ€ν‚¬ 개수(k)와 병사듀 수(n)κ°€ 같은 게 μ•„λ‹ˆλΌμ„œ κ·Έλ ‡κ²Œ ν•  μˆ˜κ°€ μ—†λ”λΌκ΅¬μš”. κ·Έλž˜μ„œ μŠ€νƒ(Stack)을 μ΄μš©ν•΄μ„œ 큰 숫자λ₯Ό 무적ꢌ μŠ€ν‚¬λ‘œ μŠ€ν‚΅ν•˜λŠ” ν˜•μ‹μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν–ˆμ—ˆλŠ”λ°, 이것 μ—­μ‹œ μ΅œμ μ΄λΌλŠ” 보μž₯이 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

 

방법은 μš°μ„ μˆœμœ„ 큐(Priority Queue, heap)μ˜€λ„€μš”. μ™œ 이 생각을 λͺ» ν–ˆμ„κΉŒμš”. 방법은 κ°„λ‹¨ν•©λ‹ˆλ‹€.

 

  • ν˜„μž¬ 병사 수(n)κ°€ ν˜„μž¬ λΌμš΄λ“œμ˜ 적의 수(enemy[i])보닀 μž‘κ³ , 무적ꢌ μŠ€ν‚¬ 개수(k)κ°€ 0개라면 루프 μ’…λ£Œ
    • 그게 μ•„λ‹ˆλΌλ©΄, enemy[i]λ₯Ό μš°μ„  μˆœμœ„ 큐에 λ„£κ³ , n -= enemy[i]λ₯Ό ν•΄μ€λ‹ˆλ‹€.
    • λΌμš΄λ“œλ„ +1 ν•΄μ€λ‹ˆλ‹€.
  • μ‚¬μš© κ°€λŠ₯ν•œ 병사 μ΄μƒμœΌλ‘œ μ‚¬μš© ν–ˆλ‹€λ©΄(n < 0), μš°μ„  μˆœμœ„ νμ—μ„œ ν•˜λ‚˜μ”© popν•˜μ—¬ n에 λ”ν•΄μ€λ‹ˆλ‹€.
    • pop을 ν•  λ•Œλ§ˆλ‹€ kλ₯Ό 1κ°œμ”© μ€„μ—¬μ€λ‹ˆλ‹€.
    • k > 0이고, n >= 0이 λ˜μ—ˆλ‹€λ©΄ 루프λ₯Ό μ’…λ£Œ
    • k == 0이고,  n < 0이라면 ν˜„μž¬ λΌμš΄λ“œλŠ” λΉΌκ³  루프 μ’…λ£Œ
  • λͺ¨λ“  λΌμš΄λ“œλ₯Ό ν΄λ¦¬μ–΄ν–ˆλ‹€λ©΄ enemy λ°°μ—΄μ˜ 길이λ₯Ό λ¦¬ν„΄ν•˜κ³ , μ•„λ‹ˆλΌλ©΄ 카운트 ν•œ λΌμš΄λ“œ 수 리턴

 

βœοΈμ†ŒμŠ€ μ½”λ“œ 및 κ²°κ³Ό

#include <vector>
#include <queue>
using namespace std;

int solution(int n, int k, vector<int> enemy) {
	int answer = 0;
	priority_queue<int> enemies;
	int i = 0;

	for (; i < enemy.size(); i++) {
		if (n < enemy[i] and k == 0)
			break;

		enemies.emplace(enemy[i]);
		n -= enemy[i];
		answer++;

		while (!enemies.empty() and n < 0) {
			if ((k == 0 and n < 0)) {
				answer--;
				break;
			}

			n += enemies.top();
			enemies.pop();
			k--;
		}
	}

	return i == enemy.size() ? enemy.size() : answer;
}

 

 

728x90
λ°˜μ‘ν˜•