λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm

[Algoritm/Java][ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 체윑볡

λ°˜μ‘ν˜•

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 체윑볡

https://programmers.co.kr/learn/courses/30/lessons/42862?language=java

문제 μ„€λͺ…

μ μ‹¬μ‹œκ°„μ— 도둑이 λ“€μ–΄, 일뢀 학생이 μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν–ˆμŠ΅λ‹ˆλ‹€. λ‹€ν–‰νžˆ μ—¬λ²Œ 체윑볡이 μžˆλŠ” 학생이 μ΄λ“€μ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주렀 ν•©λ‹ˆλ‹€. ν•™μƒλ“€μ˜ λ²ˆν˜ΈλŠ” 체격 순으둜 맀겨져 μžˆμ–΄, λ°”λ‘œ μ•žλ²ˆν˜Έμ˜ ν•™μƒμ΄λ‚˜ λ°”λ‘œ λ’·λ²ˆν˜Έμ˜ ν•™μƒμ—κ²Œλ§Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 4번 학생은 3번 ν•™μƒμ΄λ‚˜ 5번 ν•™μƒμ—κ²Œλ§Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€. 체윑볡이 μ—†μœΌλ©΄ μˆ˜μ—…μ„ 듀을 수 μ—†κΈ° λ•Œλ¬Έμ— μ²΄μœ‘λ³΅μ„ 적절히 빌렀 μ΅œλŒ€ν•œ λ§Žμ€ 학생이 μ²΄μœ‘μˆ˜μ—…μ„ λ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€.

전체 ν•™μƒμ˜ 수 n, μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν•œ ν•™μƒλ“€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ lost, μ—¬λ²Œμ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ ν•™μƒλ“€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ reserveκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μ²΄μœ‘μˆ˜μ—…μ„ 듀을 수 μžˆλŠ” ν•™μƒμ˜ μ΅œλŒ“κ°’μ„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.

μ œν•œμ‚¬ν•­

  • 전체 ν•™μƒμ˜ μˆ˜λŠ” 2λͺ… 이상 30λͺ… μ΄ν•˜μž…λ‹ˆλ‹€.
  • μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν•œ ν•™μƒμ˜ μˆ˜λŠ” 1λͺ… 이상 nλͺ… μ΄ν•˜μ΄κ³  μ€‘λ³΅λ˜λŠ” λ²ˆν˜ΈλŠ” μ—†μŠ΅λ‹ˆλ‹€.
  • μ—¬λ²Œμ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ ν•™μƒμ˜ μˆ˜λŠ” 1λͺ… 이상 nλͺ… μ΄ν•˜μ΄κ³  μ€‘λ³΅λ˜λŠ” λ²ˆν˜ΈλŠ” μ—†μŠ΅λ‹ˆλ‹€.
  • μ—¬λ²Œ 체윑볡이 μžˆλŠ” ν•™μƒλ§Œ λ‹€λ₯Έ ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ—¬λ²Œ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생이 μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν–ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ 이 학생은 μ²΄μœ‘λ³΅μ„ ν•˜λ‚˜λ§Œ λ„λ‚œλ‹Ήν–ˆλ‹€κ³  κ°€μ •ν•˜λ©°, 남은 체윑볡이 ν•˜λ‚˜μ΄κΈ°μ— λ‹€λ₯Έ ν•™μƒμ—κ²ŒλŠ” μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μ—†μŠ΅λ‹ˆλ‹€.

Code

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = n-lost.length;
        for(int i=0; i<lost.length;i++){
            for(int j=0;j<reserve.length;j++){
                if(lost[i]==reserve[j]){
                    lost[i]=-4;
                    reserve[j]=-2;
                    answer++;
                }
            }
        } 
        for(int i = 0; i<lost.length; i++){
            for(int j=0;j<reserve.length; j++){
                if(reserve[j]==lost[i]-1 || reserve[j]==lost[i]+1){
                    reserve[j]=-2;
                    answer++;
                    break;
                }
            }
        }
        return answer;
    }
}

Code μ„€λͺ…

λ¨Όμ € μ²˜μŒμ— nλͺ…에 lost길이λ₯Ό λΉΌμ£Όκ³  κ·Έ λ‹€μŒμœΌλ‘œ
생각해야될 뢀뢄이 2가지 뢀뢄이 μžˆλ‹€.

  1. μžŠμ–΄λ²„λ¦° μ‚¬λžŒκ³Ό 여뢄이 μžˆλŠ” μ‚¬λžŒμ΄ 같을 λ•Œ (이 μ‚¬λžŒμ€ κ·Έλƒ₯ 1벌이 μžˆλŠ”μ‚¬λžŒμ΄ λœλ‹€.)
  2. μžŠμ–΄λ²„λ¦° μ‚¬λžŒκ³Ό 여뢄이 μžˆλŠ” μ‚¬λžŒμ˜ λ²ˆν˜Έκ°€ 1이 차이가 λ‚ λ•Œ
    λ§Œμ•½ μœ„ 2개의 쑰건을 λ§Œμ‘±ν•œλ‹€λ©΄ 번호λ₯Ό -2와 -4둜 각각 λ°”κΎΈκ³ (λ‘˜λ‹€ -2둜 바꿔도 상관없을듯) answer을 +1 ν•΄μ£Όμ—ˆλ‹€.

배운점

μ²˜μŒμ— 2번째만 μƒκ°ν•˜λ‹€κ°€ 계속 ν‹€λ €μ„œ μ•Œκ³ λ³΄λ‹ˆ 1번째 κ²½μš°κ°€ μžˆμ—ˆλ‹€.
Greedyλ¬Έμ œμ—¬μ„œ λ”±νžˆ 정해진 방법은 μ—†λŠ”κ±° κ°™λ‹€?

λ°˜μ‘ν˜•