[Algorithm] 프로그래머스 : 체육복

1Consumption·2020년 2월 28일
0

Algorithm

목록 보기
2/8

프로그래머스 lv1 체육복

코드

import Foundation

func solution(_ n:Int, _ lost:[Int], _ reserve:[Int]) -> Int {
    var hasClothes = [Int](repeating: 0, count: n)
    
    lost.forEach {
        hasClothes[$0 - 1] -= 1
    }
    
    reserve.forEach {
        hasClothes[$0 - 1] += 1
    }
    
    for (clothesIndex, cloth) in hasClothes.enumerated() {
        if cloth == -1 {
            if clothesIndex > 0 && hasClothes[clothesIndex - 1] == 1 {
                hasClothes[clothesIndex] = 0
                hasClothes[clothesIndex - 1] = 0
            } else if clothesIndex < hasClothes.count - 1 && hasClothes[clothesIndex + 1] == 1 {
                hasClothes[clothesIndex] = 0
                hasClothes[clothesIndex + 1] = 0
            }
        }
    }
    
    return hasClothes.filter{$0 > -1}.count
}

풀이과정

전체 학생 수 n, 체육복을 도난당한 학생의 배열 lost, 여분의 체육복이 있는 학생의 배열 reserve가 주어진다. 여분의 체육복이 있는 학생은 도난당한 학생에게 체육복을 빌려줄 수 있지만, 본인의 인텍스 +-1 까지만 빌려 줄 수있다. 2번 학생은 1번 3번 학생에게만 빌려줄수 있다는 말이다. 또한 여분의 체육복이 있는 학생도 체육복을 도난당할 수 있는데, 이 경우는 본인에게 여분의 체육복이 돌아가기 때문에 다른 학생에게 빌려줄 수 없다.

먼저 학생들이 체육복을 얼마나 가지고 있는지를 hasClothes로 표현하였다. 체육복이 없으면 -1, 있으면 0, 여분이 있으면 1의 값을 주었다. 그리고 lost와 reserve 배열을 돌며 체육복 여부를 갱신해준다.

가장 중요한 포인트 : 여분의 체육복이 있는 학생도 체육복을 도난당할 수 있다.

이 경우 hasClothes 값이 1이었을지라도 다시 0이 된다.

hasClothes 배열의 최신화를 완료하고 hasClothes 배열을 forEach문을 돌린다.
본인이 체육복이 없는 경우에 양옆의 친구들이 체육복이 있는지 여부를 검사하고, 있으면 hasClothes 배열의 값을 다시 최신화 한다.

마지막으로 hashClothes 배열에서 -1보다 큰 값을 찾아서 그 수를 리턴하면 끝.

아쉬운 점

처음 시도할 때는 단방향으로 체육복을 빌려주는 경우만 생각했다. lost가 [2, 4] 이고 reserve가 [1, 3, 5] 인 경우 2번 학생은 1번과 3번 모두에게 체육복을 빌릴 수 있지만 1번에게만 빌리는 경우만 고려했다. 위 예시에서는 문제가 되지 않지만, 계속 다른 테스트 케이스에서 실패가 나더라(아마 양방향을 고려하지 않을 탓인 듯 하다). 결국 다른 블로거들의 힌트를 조금 참고했고, 결과적으로는 해결할 수 있었다. 나는 어떤 생각이 들면 그 생각을 잘 깨지를 못하는 편인데, 알고리즘을 풀 때는 여러가지 사고를 해야하기 때문에 이 부분이 조금 아쉽다.

profile
개발자가되고싶어요

0개의 댓글