cording test

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

JM Lee 2023. 12. 8. 17:45
728x90

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

 

프로그래머스

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

programmers.co.kr

 

카카오 문제들은 상당히 복잡했는데, 그림을 보면 알 수 있듯이 스택을 사용하라는 것을 강조했기 때문에 스택에 맞게 풀었다.

 

이중 for문을 통해서 문제를 어렵지 않게 풀었다.

def solution(board, moves):
    answer = 0
    stack = [] # 바구니
    # 순서대로 크레인의 움직임 위치를 받는다.
    # 이차원 배열이라 이중 for 문 사용
    for i in moves:
        for j in range(len(board)):
            if board[j][i-1] == 0:
                continue
            else:
                stack.append(board[j][i-1])
                board[j][i-1] = 0
                # 인형이 두 개 이상일 경우에만 조건문 사용 >> 나름 연산 줄이려는 노력
                if len(stack) > 1:
                    # 끝에 있는 두개가 동일하면 둘 다 제거
                    if stack[-1] == stack[-2]:
                        stack.pop(-1)
                        stack.pop(-1)
                        answer += 2
                break
    return answer
    
# 1.42ms

 

그치만 코드가 뭔가 아쉽다고 느낀 마음에 이중 for문을 없애는 것을 시도했다.

 

def solution(board, moves):
    answer = 0
    stack = []

    for move in moves:
        for row in board:
            doll = row[move - 1]
            if doll:
                if stack and stack[-1] == doll:
                    stack.pop()
                    answer += 2
                else:
                    stack.append(doll)
                row[move - 1] = 0
                break

    return answer
    
# 0.77ms

 

간소화 과정

  1. 인형이 2개 이상일 경우에만 제거하려는 것이 연산을 줄이고자 하는 노력이었는데, 다시 보니 그 과정 결국 연산이었기 때문에 그냥 없애버렸다.
  2. for row in board로 수정하여 range(len(board))로 인덱싱하는 과정을 없앴다.
  3. doll이 0인지 확인하는 로직이 겹쳐져 있어서 하나로 통합하였다.