[Kotlin/프로그래머스] 코딩테스트 연습 > 탐욕법(Greedy) > 체육복

👀 문제

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

👊 도전

1. 설계

  1. 문제 조건에 맞게 진행

2. 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
    fun solution(n: Int, lost: IntArray, reserve: IntArray): Int {
        val array = Array<Int>(n) { 1 }
        lost.forEach {
            array[it - 1]--
        }
        reserve.forEach {
            array[it - 1]++
        }
        array.forEachIndexed { index, i ->
            if (i > 1 && array.getOrNull(index - 1) == 0) {
                array[index - 1] = 1
                array[index]--
            } else if (i > 1 && array.getOrNull(index + 1) == 0) {
                array[index + 1] = 1
                array[index]--
            }
        }
        return array.count { it != 0 }
    }
}

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. 배열을 이용하여 학생의 체육복 개수를 세팅한다
    • 모두가 하나씩 가지고 있는 게 디폴트이므로 1로 초기화한다.
    • lost를 돌면서 잃어버린 학생(i)에게 array[i]–를 해준다.
    • reserve를 돌면서 여분을 가지고 있는 학생은 array[i]++를 해준다.
    • 위 for문을 통해 잃어버렸지만 여분을 가지고 있었던 학생도 커버가 가능하다.
  2. 여분을 가지고 있는 학생은 앞 또는 뒤로 줄 수 있다
    • 앞에서부터 채워야 한다고 생각하고 내가 여분을 가지고 있는데 이전 학생이 없다면 내 것을 준다. (나는 –, 이전학생은 ++)
    • else if를 통해 뒤에 학생이 없다면 다음 학생에게 준다.
    • array에 0이 아닌 개수를 카운트 하여 리턴한다.

👏 해결 완료!