https://programmers.co.kr/learn/courses/30/lessons/64061
로직 설명
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 |