알고리즘

프로그래머스 LV.1 크레인 인형뽑기 게임 스위프트

Thor_yeom 2023. 5. 9. 23:37

카카오 코테 문제라고 하면 ... 뭔가 떨리기도하고

어려울거 같기도 하고 맞추면 희열을 느낄거 같기도 하고...

그런건 저만 그런가요? ㅎㅎ

 

 

오늘은! 크레인 인형 뽑기 게임을 풀어봤습니다. 

제가 이해하고 푸는 방식이다보니...

조금 중구난방이 일 수 있습니다 ㅎㅎ

 

간단하게 지문을 보겠습니다.

 

위의 지문이 핵심입니다. 

충분히 이해하고 다음  지문을 읽어보면

뭔가... 애니팡 느낌이 나는거 같은...

이해가 쉽게 됩니다.

 

저는 문제를 풀때 노트에 끄적이면서 

생각을 하는 편입니다.

 

흠... 글씨를 원래 잘쓰는데 펜이 안좋아서 그런겁니다.. ㅠ

흠... 일단 moves 요소에 따라 크레이이 움직이니... 우리는

0번째부터 시작할것이기 때문에

moves의 요소들을 -1씩 해줍니다.

let crainIndex = moves.map { $0 - 1 }

 

자 이렇게 되면 

crainIndex = [0,4,2,4,0,1,0,3] 이렇게 담기게 됩니다.

 

여기까지는 참 쉽죠?

 

그 다음으로는 

crainIndex를 for문으로 돌려주면서 하나씩 빼주고

현재 board가 2차 배열로 되어있기때문에 

이중 for문을 사용합니다.

// crainIndex를 하나씩 뽑아준다.
for i in crainInex {
	// crainIndex에서 하나씩 뽑은거에서 2차 배열로 되어있는 board에서 차례대로 비교할수있도록 한다.
	for j in 0..<board.count {
    	// board[0][crainIndex에서 뽑은 i]
    	print(board[j][i]
    }
}

 

이렇게 하면 board의 0번째인덱스에 있는 배열에서 crainIndex의 i값을 비교할 수있다

예시)
ex) crainIndex[0]가 0 일때 

board[0][0]

board[1][0]

board[2][0]

board[3][0]

board[4][0]

 

나온 board[j][i] 값이 0보다 크다면 빈 배열에 담아준다. 

왜 0과 비교하냐면

 이 그림에서 처럼 

0은 단지 자리(칸)을 차지하기 위해서만 존재하기 때문에 0보다 클때만 골라내면 된다.

0보다 큰 숫자가 있을 경우 append시키고 해당 숫자를 0으로 만든다.

 

왜냐하면 

해당 숫자를 0으로 만들지 않으면 for문이 돌아가면서 계속 같은 숫자만 append시키기 때문이다.

// 0보다 클 경우 담길 배열을 만들어준다.
var resultArray: [Int] = []

// crainIndex를 하나씩 뽑아준다.
for i in crainInex {
	// crainIndex에서 하나씩 뽑은거에서 2차 배열로 되어있는 board에서 차례대로 비교할수있도록 한다.
	for j in 0..<board.count {
    	// board[0][crainIndex에서 뽑은 i]
    	print(board[j][i]
        if board[j][i] > 0 {
        	resultArray.append(board[j][i]
            // 그리고 해당 요소를 0으로 만들어준다. 왜?
            // 그렇지 않으면 해당 요소만 계속 append해주기 때문이다. 
            board[j][i] = 0
            // break를 걸어서 비교를 더이상 안하게끔 해준다.
            break
        }
    }
}
print("resultArray:",resultArray)

// resultArray: [4, 3, 1, 1, 3, 2, 4]

 

자 그럼 resultArray가 상징하는 것은 쌓인 인형이 담긴 바구니입니다.

해치웠나?...

...자 그럼 위의 지문대로 연속적으로 중복이 되었을 경우 삭제해주는 것만 해결하면 된다.

흠... 이렇게 생각해보았다.

 

빈 배열을 하나 만들고, append 하면서 

현재 마지막 인덱스 마지막 인데스 -1 즉, 이전 인덱스와 비교해서 중복 확인을 해보자 

// 최종으로 담기는 빈 배열 생성
var finalReuslt: [Int] = []

// 제거 count 
var count = 0 

for k in 0..<resultArray.count {
	// 배열을 하나씩 append해준다.
	finalResult.append[k]
    print("for 문:",finalResult)
    // ⭐️ finalResult에 쌓이는 마지막 인덱스와 마지막 -1 인덱스를 비교
    // 조건으로 finalResult.endIndex > 1를 사용하여 index가 1이상일때 설정 
    if finalResult.endIndex > 1 && finalResult[finalResult.endIndex-1] == finalResult[finalResult.endIndex-2] {
    	// 마지막 인덱스 삭제
        finalResult.removeLast()
        // 마지막 인덱스 삭제
        finalResult.removeLast()
        count += 1
    }
    print("조건 후:",finalResult)
}
return count * 2

/*
for문: [4]
조건 후: [4]
for문: [4, 3]
조건 후: [4, 3]
for문: [4, 3, 1]
조건 후: [4, 3, 1]
for문: [4, 3, 1, 1]
조건 후: [4, 3]
for문: [4, 3, 3]
조건 후: [4]
for문: [4, 2]
조건 후: [4, 2]
for문: [4, 2, 4]
조건 후: [4, 2, 4]
*/

자 인덱스의 마지막과 이전 을 비교하여 

같은 값이면 removeLast()를 두번 이용하여 해당 값을 삭제해주었습니다.

 

count가 중복 된 경우를 나타내기 때문에 

return 값이 count *2를 해줍니다.

 

 

한줄 평 : 역시 카카오 쉽지만 어려웠다.