[programmers] μ•Όκ·Ό μ§€μˆ˜ - Java

νšŒμ‚¬μ› Demi의 μ•Όκ·Ό ν”Όλ‘œλ„λ₯Ό μ΅œμ†Œν™”ν•˜λŠ” λ¬Έμ œμ—μ„œ, 초기 μ½”λ“œλŠ” 배열을 μ •λ ¬ν•˜μ—¬ μ΅œλŒ€ μž‘μ—…λŸ‰μ—μ„œ 1을 λΉΌλŠ” λ°©μ‹μœΌλ‘œ μ ‘κ·Όν•˜μ˜€μœΌλ‚˜, νš¨μœ¨μ„± ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν•˜μ§€ λͺ»ν–ˆλ‹€. 이λ₯Ό κ°œμ„ ν•˜κΈ° μœ„ν•΄ μš°μ„ μˆœμœ„ 큐λ₯Ό μ‚¬μš©ν•˜μ—¬ μž‘μ—…λŸ‰μ„ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜κ³ , κ°€μž₯ λ§Žμ€ μž‘μ—…λŸ‰μ„ κ°€μ Έμ™€μ„œ 1을 λΉΌλŠ” λ°©μ‹μœΌλ‘œ μ ‘κ·Όν•˜μ˜€λ‹€. 이 방법은 νž™ ꡬ쑰λ₯Ό ν™œμš©ν•˜μ—¬ O(log n)의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό 가진닀.
DriedPollack's avatar
Apr 22, 2024
[programmers] μ•Όκ·Ό μ§€μˆ˜ - Java

μ•Όκ·Ό μ§€μˆ˜

문제 μ„€λͺ…

νšŒμ‚¬μ› DemiλŠ” 가끔은 야근을 ν•˜λŠ”λ°μš”, 야근을 ν•˜λ©΄ μ•Όκ·Ό ν”Όλ‘œλ„κ°€ μŒ“μž…λ‹ˆλ‹€. μ•Όκ·Ό ν”Όλ‘œλ„λŠ” 야근을 μ‹œμž‘ν•œ μ‹œμ μ—μ„œ 남은 일의 μž‘μ—…λŸ‰μ„ μ œκ³±ν•˜μ—¬ λ”ν•œ κ°’μž…λ‹ˆλ‹€. DemiλŠ” Nμ‹œκ°„ λ™μ•ˆ μ•Όκ·Ό ν”Όλ‘œλ„λ₯Ό μ΅œμ†Œν™”ν•˜λ„λ‘ 일할 κ²λ‹ˆλ‹€.Demiκ°€ 1μ‹œκ°„ λ™μ•ˆ μž‘μ—…λŸ‰ 1λ§ŒνΌμ„ μ²˜λ¦¬ν•  수 μžˆλ‹€κ³  ν•  λ•Œ, ν‡΄κ·ΌκΉŒμ§€ 남은 N μ‹œκ°„κ³Ό 각 일에 λŒ€ν•œ μž‘μ—…λŸ‰ works에 λŒ€ν•΄ μ•Όκ·Ό ν”Όλ‘œλ„λ₯Ό μ΅œμ†Œν™”ν•œ 값을 λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ solution을 μ™„μ„±ν•΄μ£Όμ„Έμš”.

μ œν•œ 사항

  • worksλŠ” 길이 1 이상, 20,000 μ΄ν•˜μΈ λ°°μ—΄μž…λ‹ˆλ‹€.
  • works의 μ›μ†ŒλŠ” 50000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • n은 1,000,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

works
n
result
[4, 3, 3]
4
12
[2, 1, 2]
1
6
[1,1]
3
0

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1
n=4 일 λ•Œ, 남은 일의 μž‘μ—…λŸ‰μ΄ [4, 3, 3] 이라면 μ•Όκ·Ό μ§€μˆ˜λ₯Ό μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ 4μ‹œκ°„λ™μ•ˆ 일을 ν•œ κ²°κ³ΌλŠ” [2, 2, 2]μž…λ‹ˆλ‹€. 이 λ•Œ μ•Όκ·Ό μ§€μˆ˜λŠ” 22 + 22 + 22 = 12 μž…λ‹ˆλ‹€.
μž…μΆœλ ₯ 예 #2
n=1일 λ•Œ, 남은 일의 μž‘μ—…λŸ‰μ΄ [2,1,2]라면 μ•Όκ·Ό μ§€μˆ˜λ₯Ό μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ 1μ‹œκ°„λ™μ•ˆ 일을 ν•œ κ²°κ³ΌλŠ” [1,1,2]μž…λ‹ˆλ‹€. μ•Όκ·Όμ§€μˆ˜λŠ” 12 + 12 + 22 = 6μž…λ‹ˆλ‹€.
μž…μΆœλ ₯ 예 #3
남은 μž‘μ—…λŸ‰μ΄ μ—†μœΌλ―€λ‘œ ν”Όλ‘œλ„λŠ” 0μž…λ‹ˆλ‹€.

처음 μ‹œλ„ν•œ μ½”λ“œ

import java.util.*; class Solution { public long solution(int n, int[] works) { long answer = 0; for(int i=n; i>0; i--){ Arrays.sort(works); if(works[works.length-1]>0){ works[works.length-1]--; } } for(int i=0; i<works.length; i++){ answer += Math.pow(works[i], 2); } return answer; } }

κ°œμ„ ν•œ μ½”λ“œ

import java.util.PriorityQueue; import java.util.Collections; class Solution { public long solution(int n, int[] works) { PriorityQueue<Integer> overtime = new PriorityQueue<>(Collections.reverseOrder()); for (int work : works) { overtime.offer(work); } for (int i = 0; i < n; i++) { int max = (int)overtime.poll(); if (max <= 0) break; overtime.offer(max - 1); } return sumPow(overtime); } long sumPow(PriorityQueue<Integer> works) { long sum = 0; while (!works.isEmpty()) { sum += Math.pow(works.poll(), 2); } return sum; } }
 

핡심 ν‚€μ›Œλ“œ

  • 처음 μ‹œλ„ν•œ μ½”λ“œλŠ” n만큼 λ°˜λ³΅ν•  λ•Œλ§ˆλ‹€ 배열을 μ •λ ¬ν•΄μ„œ λ°°μ—΄μ˜ μ΅œλŒ“κ°’μ—μ„œ 1을 λΉΌλŠ” λ°©μ‹μœΌλ‘œ μ ‘κ·Όν–ˆλ‹€.
    • 이 경우 μ‹œκ°„ λ³΅μž‘λ„λŠ” O(nlogn)이고, νš¨μœ¨μ„± ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν•˜μ§€ λͺ»ν–ˆλ‹€.
  • 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μš°μ„ μˆœμœ„ 큐λ₯Ό μ‚¬μš©ν•΄μ„œ μž‘μ—…λŸ‰μ„ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•΄μ„œ μ €μž₯ν–ˆλ‹€.
    • 주어진 배열을 μˆœνšŒν•˜λ©΄μ„œ 각 μž‘μ—…λŸ‰μ„ μš°μ„ μˆœμœ„ 큐에 μ €μž₯ν•˜κ³ , n만큼 λ°˜λ³΅λ¬Έμ„ μˆ˜ν–‰ν•œλ‹€.
    • μš°μ„ μˆœμœ„ νμ—μ„œ κ°€μž₯ λ§Žμ€ μž‘μ—…λŸ‰μ„ κ°€μ Έμ˜€κ³  max λ³€μˆ˜μ— μ €μž₯ν•œλ‹€.
    • λ§Œμ•½ maxκ°€ 0 μ΄ν•˜λΌλ©΄ 더 이상 μž‘μ—…μ„ ν•  수 μ—†μœΌλ―€λ‘œ λ°˜λ³΅μ„ μ’…λ£Œν•œλ‹€.
    • μž‘μ—…μ„ ν•  수 μžˆλ‹€λ©΄ maxμ—μ„œ 1을 λΉΌκ³  λ‹€μ‹œ μš°μ„ μˆœμœ„ 큐에 λ„£μ–΄μ€€λ‹€.
    • κ·Έ ν›„ μš°μ„ μˆœμœ„ 큐에 μžˆλŠ” κ°’λ“€μ˜ 제곱의 합을 λ°˜ν™˜ν•œλ‹€.
 

κ²°λ‘ !

ν•΄λ‹Ή 문제λ₯Ό ν’€λ©΄μ„œ μš°μ„ μˆœμœ„ 큐λ₯Ό ν™œμš©ν•˜μ—¬ 문제λ₯Ό ν’€ 수 μžˆλ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆκ³ , νž™ ꡬ쑰둜 인해 O(log n) μ‹œκ°„μ΄ κ±Έλ¦°λ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆλ‹€.
 
Share article

More articles

See more posts

πŸ‘¨πŸ»β€πŸ’»DriedPollack's Blog