Swift랑 친해지기/programmers 풀기

[프로그래머스] 롤케이크 (Swift)

데브킹덕 2022. 11. 23. 19:00

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

 

프로그래머스

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

programmers.co.kr

변수 선언)

  • result = 철수와 동생이 가지는 토핑의 개수가 같을때 증가하는 공평하게 자르는 수
  • chulsu = 철수가 가지는 토핑의 종류를 담은 Set형 리스트 (중복x)
  • brother = 동생가 가지는 토핑의 종류를 담은 Set형 리스트 (중복x)
  • toppingMaxNum = 매개변수 topping배열의 최댓값
  • eachToppingArray = 0으로 toppingMaxNum개수 만큼 이루어진 Int 형 배열

 

내 풀이)

for in 반복문으로 topping 요소에 차례로 접근하여 Set형 철수리스트에 추가하고 

반복문 안에 반복문을 구성하여 이후에 Index는 Set형 동생리스트에 추가하도록 하니 모두 실행초과가 떴다.

 

반복문 안에 반복문을 사용하지 않는데 중점을 두었다.

1. topping 매개변수에 최대값을 찾아 그 최댓값만큼 0을 갖는 Int형 배열 eachToppingArray를 만듬

ex) topping.max()! = 4 = [0,0,0,0]

 

2. for in 반복문을 통해 topping 요소들에 차례로 접근하여

eachToppingArray 배열에 topping의 요소의 값 - 1에 위치한 값에 1을 추가하도록 하였다. 

* -1 한 이유는 eachToppingArray의 Index가 0부터 시작하기 때문

ex) topping의 값이 1일때 eachToppingArray[1] - x eachToppingArray[0] - 0

 

3. eachToppingArray를 알맞게 개수를 설정하였다면

for in 반복문을 통해 topping의 요소에 접근해 철수Set에 차례로 추가하였고,

tapping[i]의 값의 개수가 들어있는 eachToppingArray 배열에 알맞은 수를 -1하였다.

* 케익을 자르면 무조건 한명은 1개이상의 케익을 가지기 때문에 0..<tapping.count -1 의 범위를 줌

(-1을 하지 않아도 결과는 동일, 속도는 -1을 하지 않은게 더 빠름... )

 

 

이때 eachTappingArray[tapping[i]-1]이 0이라면 동생 Set의 tapping[i]를 빼도록 했다.

*전에 eachTappingArray에 1씩 추가했던 요소들중에서만 확인함

 

4. Set철수의 개수와 Set동생의 개수가 같으면 result에 1을 올려주어 반환하도록 하였음

 

 

 

import Foundation

func solution(_ topping:[Int]) -> Int {
   
    var result = 0
    
    var chulsu: Set = Set<Int>()
    var brother: Set<Int> = Set(topping)
    
    let toppingMaxNum = topping.max()!
    
    var eachToppingArray = Array(repeating: 0, count: toppingMaxNum)
    
    for i in 0..<topping.count{
        eachToppingArray[topping[i]-1] = eachToppingArray[topping[i]-1] + 1
    }
    
    for i in 0..<topping.count-1{
        chulsu.insert(topping[i])
        eachToppingArray[topping[i]-1] = eachToppingArray[topping[i]-1] - 1
        if eachToppingArray[topping[i]-1] == 0 {
            brother.remove(topping[i])
        }
        if chulsu.count == brother.count{
            result += 1
        }
    }


    return result
}