Swift랑 친해지기/programmers 풀기

[프로그래머스] 크레인 인형뽑기 게임 (Swift)

데브킹덕 2022. 12. 30. 17:21

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

 

프로그래머스

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

programmers.co.kr

 

변수 설정

  • array: board에서 0을 제외한 요소들을 각 크레인 칸과 캐릭터별로 위치하도록 한 배열
  • basket: 크레인에서 인형들을 뽑아서 담은 배열 (터트리기 전)
  • basketArray: basket을 하단(인덱스 0)부터 접근하여 다음 요소와 비교할 수 있게 만든 배열
  • count: 터진 인형의 개수

문제 예시

풀이 방법

1. board에서 각 인덱스 별로 묶어 array를 만들었음(0은 추가하지 않도록 함)

(이때 reversed를 이용하여 먼저 접근한 요소가 배열 인덱스 0에 가깝도록함)

 

2. moves에서 크레인라인에 맞게 뽑은 인형들을 basket에 추가해주고 array는 마지막 요소인 뽑힌 인형을 삭제해 줌

옵셔널 바인딩 if let 사용하여 array의 마지막 요소가 있는지 파악하였음

 

3.basket에서 같은 모양의 인형이 두개가 쌓이면 두인형이 터지고 count가 2 증가해야함

basketArray를 만들어서 basket의 첫 요소를 basketArray에 추가하도록함

basketArray의 마지막요소와 bakset의 요소가 같다면 count를 2증가시키고 basketArray의 마지막 요소는 인형이 터졌으니 제거를 해주었음

 

import Foundation

func solution(_ board:[[Int]], _ moves:[Int]) -> Int {
    
    var array = Array(repeating: [Int](), count: board.count)
    var basket = [Int]()
    
    for i in board.reversed(){
        for j in 0..<board.count{
            if i[j] != 0 {
                array[j].append(i[j])
            }
        }
    }
    for i in 0..<moves.count{
        if let arrayLast = array[moves[i]-1].last{
            basket.append(arrayLast)
            array[moves[i]-1].removeLast()
        }
    }
    
    var count = 0
    var basketArray = [Int]()
    
    for i in 0..<basket.count{
        if basketArray.isEmpty || basketArray.last != basket[i]{
            basketArray.append(basket[i])
        }
        else if basketArray.last == basket[i]{
            basketArray.removeLast()
            count += 2
        }
    }
        
    return count
}