Back-end/Algorithm

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 체윑볡 (java) - 그리디

Nellie Kim 2023. 8. 17. 11:53
728x90

πŸ’‍♀️  문제 μ„€λͺ…

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

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


❌ μ œν•œμ‚¬ν•­

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

 

 

πŸ’‘  μž…μΆœλ ₯ 예

 

 

μž…μΆœλ ₯ 예 #1

1번 학생이 2번 ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주고, 3번 ν•™μƒμ΄λ‚˜ 5번 학생이 4번 ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주면 학생 5λͺ…이 μ²΄μœ‘μˆ˜μ—…μ„ 듀을 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μž…μΆœλ ₯ 예 #2

3번 학생이 2번 ν•™μƒμ΄λ‚˜ 4번 ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주면 학생 4λͺ…이 μ²΄μœ‘μˆ˜μ—…μ„ 듀을 수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ‘© λ‚΄ 풀이

class Solution_체윑볡2 {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = n; // 초기 κ°€λŠ₯ν•œ 학생 μˆ˜λŠ” 전체 학생 수둜 μ΄ˆκΈ°ν™”

        int[] people = new int[n]; // ν•™μƒλ“€μ˜ μƒνƒœλ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄ (0: 체윑볡 μžˆλŠ” μƒνƒœ, -1: 체윑볡 μ—†λŠ” μƒνƒœ, 1: μ—¬λΆ„ 체윑볡 μžˆλŠ” μƒνƒœ)

        // people λ°°μ—΄ μ΄ˆκΈ°ν™”: λͺ¨λ“  ν•™μƒλ“€μ˜ 체윑볡 μƒνƒœλ₯Ό 0으둜 μ„€μ • (체윑볡 μžˆλŠ” μƒνƒœ)
        for (int i = 0; i < n; i++) {
            people[i] = 0;
        }

        // μ²΄μœ‘λ³΅μ„ μžƒμ–΄λ²„λ¦° 학생듀에 λŒ€ν•œ 처리
        for (int l : lost) {
            people[l - 1]--; // μ²΄μœ‘λ³΅μ„ μžƒμ–΄λ²„λ¦° 학생 μœ„μΉ˜λ₯Ό 인덱슀둜 λ³€ν™˜ν•˜μ—¬ ν•΄λ‹Ή μœ„μΉ˜μ˜ 값을 1 κ°μ†Œμ‹œν‚΄
        }

        // μ—¬λΆ„μ˜ μ²΄μœ‘λ³΅μ„ 가진 학생듀에 λŒ€ν•œ 처리
        for (int r : reserve) {
            people[r - 1]++; // μ—¬λΆ„μ˜ μ²΄μœ‘λ³΅μ„ 가진 학생 μœ„μΉ˜λ₯Ό 인덱슀둜 λ³€ν™˜ν•˜μ—¬ ν•΄λ‹Ή μœ„μΉ˜μ˜ 값을 1 μ¦κ°€μ‹œν‚΄
        }

        // μ²΄μœ‘λ³΅μ„ λΉŒλ €μ£ΌλŠ” 처리
        for (int i = 0; i < people.length; i++) {
            if (people[i] == -1) { // μ²΄μœ‘λ³΅μ„ μžƒμ–΄λ²„λ¦° 학생을 찾음
                if (i - 1 >= 0 && people[i - 1] == 1) { // μ™Όμͺ½ 학생이 μ—¬λΆ„μ˜ μ²΄μœ‘λ³΅μ„ 가진 경우
                    people[i]++; // ν˜„μž¬ ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀쀌
                    people[i - 1]--; // μ™Όμͺ½ ν•™μƒμ˜ μ—¬λΆ„ 체윑볡 개수 κ°μ†Œ
                } else if (i + 1 < people.length && people[i + 1] == 1) { // 였λ₯Έμͺ½ 학생이 μ—¬λΆ„μ˜ μ²΄μœ‘λ³΅μ„ 가진 경우
                    people[i]++; // ν˜„μž¬ ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀쀌
                    people[i + 1]--; // 였λ₯Έμͺ½ ν•™μƒμ˜ μ—¬λΆ„ 체윑볡 개수 κ°μ†Œ
                } else {
                    answer--; // μ£Όμœ„ 학생 쀑 μ—¬λΆ„ μ²΄μœ‘λ³΅μ„ 가진 학생이 μ—†λŠ” 경우, ν˜„μž¬ 학생은 μ²΄μœ‘λ³΅μ„ μž…μ§€ λͺ»ν•˜λ―€λ‘œ 전체 κ°€λŠ₯ν•œ 학생 μˆ˜μ—μ„œ κ°μ†Œ
                }
            }
        }

        return answer; // μ΅œμ’…μ μœΌλ‘œ κ°€λŠ₯ν•œ 학생 수λ₯Ό λ°˜ν™˜
    }
}

public class codingTest_체윑볡2 {
    public static void main(String[] args) {
        Solution_체윑볡2 T = new Solution_체윑볡2();
        int[] lost = {2,4};
        int[] reserve = {1,3,5};

        System.out.println(T.solution(5,lost,reserve));
    }
}

ν•™μƒλ“€μ˜ μƒνƒœλ₯Ό people λ°°μ—΄λ‘œ μ§€μ •ν•˜κ³ ,  

0: 체윑볡 μžˆλŠ” μƒνƒœ, -1: 체윑볡 μ—†λŠ” μƒνƒœ, 1: μ—¬λΆ„ 체윑볡 μžˆλŠ” μƒνƒœ 둜 λ§Œλ“  후에,

인접 ν•™μƒμ˜ 체윑볡 여뢀에 따라 λ”ν•˜κ³  λΉΌκ³ λ₯Ό λ°˜λ³΅ν•˜μ—¬ answerλ₯Ό λ„μΆœν•΄ λ‚΄λŠ” λ°©μ‹μœΌλ‘œ ν’€μ—ˆλ‹€.