728x90
def solution(board, moves):
answer = 0
stack = [0]
for m in moves:
for i in range(len(board)):
if (board[i][m-1] != 0):
stack.append(board[i][m-1])
board[i][m-1] = 0
if (stack[-1] == stack[-2]):
stack.pop()
stack.pop()
answer += 2
break
return answer
간결하다.
stack에 0을 넣어놓고 시작하여 stack[-2]가 없는 경우를 고려하지 않아도 되는 것도 참신한 방법인 것 같다.
굳이 -1을 빼서 비교해볼 필요도 없고 좋은 것 같다.
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
진짜 뭔 말인지 하나도 모르겠다. 근데 너무 짧고 간결한 것 같다. 파이썬을 조금 더 공부해야할 것 같다.
다른 사람이 풀이해준 것 적어두고 간다. 미래의 효림이가 알아서 해주겠지 화이팅
- 2번째 줄을 보면, zip(*board)를 함으로써, 원래 board의 각 원소들은 행을 나타내는 리스트들이었는데, *board를 하니까 각 행을 나타내는 리스트가 그 개수만큼 unpacking되었다.
- 그렇게 그 각 행을 나타내는 리스트들이 병렬?로 존재하고 있는데 거기에 zip을 하니까, 각 행을 나타내고 있던 리스트들의 앞부분부터 끝부분까지를 하나씩 뱉어낸 걸 모아서 새로운 리스트를 만든다.
- 한 행의 입장에서 앞부분부터 끝부분까지라는 말은, 1열부터 마지막열까지를 의미한다. 그러므로 각 행들의 1열부터 마지막열까지를 받은 것이므로 zip(*board)는 결국 각 열을 나타내는 리스트들을 가지고 있는 셈이다.
- 그런데 여기에 map을 통해서 각 열에 대해 lambda를 두 번 사용한 함수를 적용시켜준다. lambda x에서는 열을 나타내는 리스트를 x로 받겠다는 것이고, 열을 나타내는 리스트를 받아서 그 리스트 안에 있는 각각의 값(인형)들을 y로 받아서 0보다 큰 값들만 살려준다.
- 이 문제에서 0은 인형이 없는 경우이므로 결국에는 2번째 cols = (...)줄을 마치고 나면 cols에는 0번째 원소에는 첫번째 열에 위치한 실재하는 인형들을 나타내는 리스트, 1번째 원소에는 두번째 열을=에 위치한 실재하는 인형들을 나타내는 리스트 이런식으로 넣어지게 된다.
- 그리고 s는 bucket의 역할을 하고, a는 터뜨려진 인형의 수를 의미한다. s에 처음에 [0]을 넣어주는 이유는 빈 리스트에서 s.pop()을 하면 에러가 발생하므로 그걸 방지하기 위해서 0에 해당하는 인형은 없기 때문에 넣어준 것으로, 에러 발생 방지 이외의 목적은 없다.
- for m in moves: 안을 살펴보면, cols안의 1번째 열을 나타내는 리스트의 첫번째 원소는 그림 상으로 맨 위에 위치해있던 인형이 있고, 마지막 원소는 가장 바닥에 있어야 할 인형이 있다. 그러므로 cols[m - 1].pop(0)을 하여 위에 있는 것을 빼주는 것이다. s.pop()은 기존의 버킷에서 맨 위에 담겨있던 인형을 꺼내는 것이다. 결국, moves에서 이번에 격자 상에서 가져오는 인형과 버킷의 맨 위에 있던 인형의 값을 비교해준다. 그래서 그 둘이 같으면 인형이 터지는 것이므로 a에 2를 더해주는 것이다.
- 그런데 그 둘이 다르면, 현재 버킷의 맨 위에 있던 것을 빼왔기 때문에 그 인형이 버킷의 더 깊숙한 곳에 있어야 하므로 l을 앞에 해주고, 이번에 뽑은 인형 d가 뒤에 있어야 하니까 [l, d]로 만들어서 기존의 버킷에 다시 추가해주는 것이다.
+) python은 c언어처럼 0을 false와 같은 것으로 취급한다. if 0: 이 가능하다. 자바랑 차이가 있당
728x90
'알고리즘 > programmers[1]' 카테고리의 다른 글
[프로그래머스] 음양 더하기 (0) | 2022.01.10 |
---|---|
[프로그래머스] 없는 숫자 더하기 다른 풀이 (0) | 2022.01.10 |
[프로그래머스] 없는 숫자 더하기 (0) | 2022.01.09 |
[프로그래머스]크레인 인형뽑기 게임 (0) | 2022.01.09 |
로또 최고, 최악 순위 문제 (0) | 2022.01.03 |