본문 바로가기

알고리즘

[programmers] 크레인 인형뽑기 게임

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

로직 설명

1. board가 가로로 맨 윗줄부터 나와있는것이기 때문에 세로로 돌린다
   board = [ [0,0,0,4,3],
                 [0,0,2,2,5].

                 [0,1,5,4,1],
                 [0,0,0,4,3],
                 [0,3,1,2,1] ]
2. for i in moves: moves 돌면서 해당 board[i-1]중에 0이 아닌 첫번째값이 나오면 result 리스트에 추가하고 0으로 바꿈
   - 이때, board판에 다 0이면 아무것도 일어나지 않음

3. result 리스트에 값을 넣을 때 result의 마지막 값이랑 비교해서 같으면 result[-1]을 제거하고, 다르면 result 리스트에

   넣기 + answer += 2

 

코드

def solution(board, moves):
    B = len(board)
    bd = [[0 for _ in range(B)] for _ in range(B)]
    for i in range(B):
        for j in range(B):
            bd[i][j] = board[j][i]

    result = [0]
    answer = 0
    for m in moves:
        cnt = 0  # bd[m-1]이 다 0으로 되어있는지 확인하기 위해서
        for k in range(len(bd[m - 1])):
            if bd[m - 1][k] != 0:
                if result[-1] == bd[m - 1][k]:
                    result.pop()
                    answer += 2
                else:
                    result.append(bd[m - 1][k])
                bd[m - 1][k] = 0
                break

            cnt += 1

            if cnt == len(bd[m - 1]):
                break

    return answer

 

코드 수정

def solution(board, moves):
	# board 세로로 돌리기 
    B = len(board)
    bd = [[0 for _ in range(B)] for _ in range(B)]
    for i in range(B):
        for j in range(B):
            bd[i][j] = board[j][i]

	# cnt없어도 어차피 0이면 아무것도 안함
    result = [0]
    answer = 0
    for m in moves:
        for k in range(len(bd[m - 1])):
            if bd[m - 1][k] != 0:
                if result[-1] == bd[m - 1][k]:
                    result.pop()
                    answer += 2
                else:
                    result.append(bd[m - 1][k])
                bd[m - 1][k] = 0
                break

    return answer

 

주의할 점

1.  for k in bd[m-1]:해서 if k !=0 일 때 계산을 하면, k=0으로 하면 bd값에는 바뀌지 않음,,

  -> k=0으로 바뀌지만, 이 k가 bd의 어느자리인지는 알 수 없음(bd로 연동되지는 않음)

  -> 그래서 bd[m-1][k]의 자리 값으로 나타내고 bd[m-1][k]의 값을 바꾼다.

 

2. 처음에는 result에 다 넣고 중복되는 값을 삭제했는데

answer = 0
while True:
    if len(result) <= 1:
        break

    for r in range(1, len(result)):
        if result[r-1] == result[r]:
            del result
            answer += 2
            print(result)
            break

print(answer)

이렇게 하니까 무한루프만 돌고 answer이 나오지 않음. -> 지나온 길을 표시(result[r-1]을 0으로 바꾸고 0아닌것들만 비교)

 

추가

check = []에 board에서 0이 아닌 자리의 행을 넣고, 그 행부터 시작하면, 조금 계산을 줄일 수 있음

'알고리즘' 카테고리의 다른 글

[baekjoon] 7569. 토마토  (0) 2020.06.29
[baekjoon] 7576. 토마토  (0) 2020.06.29
[baekjoon] 2468. 안전 영역  (0) 2020.06.25
[baekjoon] 2667. 단지 내 수 세기  (0) 2020.06.25
[programmers] 괄호 변환  (0) 2020.06.25