티스토리 뷰

728x90
반응형

 

 

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

 

코딩테스트 연습 - 크레인 인형뽑기 게임

[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] [1,5,3,5,1,2,1,4] 4

programmers.co.kr

 

 


 

<나의 풀이>

def solution(board, moves):

    answer = 0
    basket = []

    for i in moves:
        if len(basket) > 1:
                if basket[-1] == basket[-2] :
                    basket.pop()
                    basket.pop()
                    answer += 2
        
        for j in range(len(board)-1,-1,-1):
            if board[j][i-1] != 0:
                basket.append(board[j][i-1])
                board[j][i-1] = 0
                break

    return answer

 

쉬운 문제였지만 생각보다 오래 걸린 코드😢

로직을 빠르게 만들었지만, 자꾸 실패가 떴다..

계속 실패한 이유는 행과 열을 반대로 적었기 때문이다.

이거 알아내는데 굉장히 시간을 잡아먹었고,

성공 후에는 내가 이렇게 이해력이 낮았나 싶은 자괴감까지 들었다😭

 

 코드 해석

문제에 나온 예시로 설명을 하겠다.

1. 행과 열을 잘 구분하자!

처음 나는  세로 1열에 board[0]이 들어가는 줄 알았다.

알고 보니 board[0]은 맨 위층, 그러니까 크레인의 바로 밑에 부분의 행이 되는 것이었다.

 

2. 무브에 따라 뽑히는 인형(숫자)을 파악하자! 

무브에 따라 뽑히는 인형(숫자)을 적어보면 다음과 같다.

 

Moves 1 : 4

Moves 5 : 3

Moves 3 : 1

Moves 5 : 1

Moves 1 : 3

Moves 2 : 2

Moves 1 : X ( 앞에서 이미 다 뽑혔기 때문)

Moves 4 : 8

 

3.  사라지는 인형을 파악하자!

첫 번째 실행 - Moves 1 : 4

두 번째 실행 - Moves 5 : 3

세 번째 실행 - Moves 3 : 1

네 번째 실행 - Moves 5 : 1  👈🏻 같은 것이 2개 나왔으므로 사라짐! (answer +=2 )

 

첫 번째 실행 - Moves 1 : 4

두 번째 실행 - Moves 5 : 3

다섯 번째 실행 - Moves 1 : 3 👈🏻 같은 것이 2개 나왔으므로 사라짐! (answer +=2 )

 

첫 번째 실행 - Moves 1 : 4

여섯 번째 실행 - Moves 2 : 2

일곱 번째 실행 - Moves 1 : X 

여덟 번째 실행 - Moves 4 : 8

 

4.  코드로 작성해 보자!

def solution(board, moves):

    answer = 0  # 정답 변수
    basket = [] # 뽑힌 인형(숫자)을 담을 리스트

	# Moves 리스트에 담긴 수 만큼 반복
    for i in moves:
    
    	# 같은 것이 있다면 사라지게 하는 코드
        if len(basket) > 1: # 2개이상이면 동작
                if basket[-1] == basket[-2] : # 맨 뒤부터 2개를 가져와 비교
                    basket.pop() # pop() - 빈 괄호일 시, 맨 뒤부터 요소 삭제  
                    basket.pop()
                    answer += 2 # 2개가 사라졌으므로 2를 더해준다.
        
        # board의 길이 만큼 반복 (board는 n x n 이라 가로와 세로의 길이가 같음)
        for j in range(len(board)): 
            if board[j][i-1] != 0: # 빈칸(0) 이 아니면 실행
                basket.append(board[j][i-1]) # 뽑은 것을 basket에 추가
                board[j][i-1] = 0 # 뽑으면 빈칸이 되어야 하므로 0으로 바꿔줌 
                break # 뽑았으므로 j 반복 종료

    return answer

(실행 과정)

 

 


 

<다른 사람의 풀이>

 

윤응구님 풀이

def solution(board, moves):
    cols = list(map(lambda x: list(filter(lambda y: y > 0, x)), zip(*board)))
    a, s = 0, [0]

    for m in moves:
        if len(cols[m - 1]) > 0:
            if (d := cols[m - 1].pop(0)) == (l := s.pop()):
                a += 2
            else:
                s.extend([l, d])

    return a

 

728x90
반응형
댓글