Swift랑 친해지기/programmers 풀기

[프로그래머스] 귤 고르기 (Swift)

데브킹덕 2022. 12. 9. 21:25

https://school.programmers.co.kr/learn/courses/30/lessons/138476

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

변수 설정

  • result: 빼야할 귤의 종류의 수
  • needDelete: tangerine배열에 담긴 귤의 총 개수 - 상자에 넣을 귤의 개수
  • array : 요소가 0을 tangerine의 최댓값만큼의 개수로 가지고있는 배열
  • setK: 귤의 크기의 종류를 담은 중복이 없는 Set
  • delete:  실제로 뺀 귤의 개수 

 

나만의 풀이

1. 0을 요소를 tangerine의 최댓값만큼 개수로 가지는  array 배열을 만들었음

ex) tangerine이 [1,2,2,3,5] 면 최대값 5,  0이 5개 ,array = [0,0,0,0,0]

 

2. tangerine의 요소에 따라서 array index에 맞게 1씩 증가시킴

*이때 인덱스는 0부터니 array[tangerine[i] - 1]을 해줌

ex) tangerine이 [1,2,2,3,5] 면 array = [1,2,1,0,1]

 

3. 귤의 종류를 최소한으로 만드는 것이므로 어떤 종류를 삭제하는지 순서는 상관이 없음

무조건 최솟값의 종류로 만들고 싶은 것이기 때문에 array를 .sorted를 이용해 오름차순으로 정렬함

작은것 부터 최대한 지우기 위함

ex) array = [0,1,1,1,2]

 

4. array를 차례로 반복문을 이용해 돌면서 가장 적은 종류의 귤을 차례로 제거해 나아가면 됨 

이때 array의 요소 중 0은 없는 종류의 귤이기 때문에 조건에 추가해야함

적은 종류의 귤을 필요한만큼 제거하면 result가 증가

 

더 이상 제거할 수 없을때는 else문을 통래해 return하게 됨

 

return Set을 이용해 귤의 총 종류  - 적은 귤을 가지는 종류들의 개수

 

-> 크기가 다른 종류의 최솟값을 얻을 수 있다.   

 

import Foundation

func solution(_ k:Int, _ tangerine:[Int]) -> Int {
    
    var result = 0
    var needDelete = tangerine.count - k
    var array = Array(repeating: 0, count: tangerine.max()!)
    
    for i in 0..<tangerine.count{
        array[tangerine[i] - 1] = array[tangerine[i] - 1] + 1
    }
    
    array = array.sorted(by: <)
    
    var setK = Set<Int>()
    for i in tangerine{
        setK.insert(i)
    }
    
    var delete = 0
    for i in 0..<array.count{
        if array[i] != 0{
            if array[i] + delete <= needDelete{
                delete += array[i]
                result += 1
            }
            else{
                return setK.count - result
            }
        }
    }
    
    return 0
}