생각보다 난잡한 문제였다. 2019년 카카오 개발자 겨울 인턴십에서 인턴들을 뽑을 때 사용했던 문제인 것 같은데, 나는 이것을 푸는데 꽤 오래 걸렸다. (이게 인턴십 문제라니...)
list 슬라이싱, 인덱스, if문, for문, range, length, list 등에 대한 거의 완벽한 수준의 이해도가 요구되었던 문제이다.
첫번째 시도:
일단 첫번째 시도는 다음과 같았다:
def solution(board, moves):
bag = []
for i in range(len(moves)):
for j in range(len(board)):
if board[j][moves[i]-1] != 0:
bag.append(board[j][moves[i]-1])
board[j][moves[i]-1] = 0
break
for k in range(len(bag)-1):
if bag[k] == bag[k+1]:
if bag[k] != 0 and bag[k+1] != 0:
bag[k] = 0
bag[k+1] = 0
answer += 2
else:
pass
else:
pass
return answer
분명히 잘 한것 같았는데 뭔가 틀렸나 보다. 첫번째 for문을 보면 확실히 이상한 것이 없다. 칸을 체크하고 하나씩 인형을 빼낼때 마다 그 칸을 다시 0으로 바꿔주는 것도 확인했다. 그렇다면 두번째 for문이 틀렸다는 것이다.
생각해보니 다음과 같은 상황이 일어날 수 있다:
bag = [1, 3, 3, 1, 5] 이렇게 있는데, 2번째 for문에 따르면 bag[0] 와 bag[1]이 같지 않으므로 pass. bag[1] == bag[2] 이므로 bag[1]과 bag[2]는 둘다 0으로 만든다.
하지만 원래는 터져서 없어지는 것이므로, bag = [1, 1, 5] 처럼 되어 1도 터져서 없어져서 bag = [5]만 남아야 한다. 하지만 2번째 for문 처럼 앞에서부터 체킹을 하면 이런 문제가 생긴다. 따라서 뒤에서부터 체킹을 해야된다.
두번째 시도:
def solution(board, moves):
bag = []
answer = 0
for i in range(len(moves)):
for j in range(len(board)):
if board[j][moves[i]-1] != 0:
bag.append(board[j][moves[i]-1])
board[j][moves[i]-1] = 0
if bag[-1:] == bag[-2:-1]:
answer += 2
bag = bag[:-2]
break
break
return answer
뒤에서 부터 이어지는 숫자가 있는지 checking을 하는 방식으로 바꾸고, checking이 맞다면 다음 숫자로 넘어가는 방식을 적용했더니 맞았다. (정확히 말하자면 숫자 하나를 넣을때마다 checking을 해주는것이다. Checking을 통해 숫자가 같다는 결과가 나온다면 그 두 숫자는 바로 없앤다.)
프로그래머스 문제 Level1 짜리가 이렇게 어렵다는게 말이 되는것인가;; 아니면 내가 실력이 아직 부족한 것일까. 아마도 내 실력이 부족한 것이라고 생각하고 열심히 공부하고 발전할 수 있어야겠다. (개인적으로 프로그래머스에서 내가 실행한 코드가 특정 테스트에서 틀리면 왜 틀렸는지 볼 수 있었으면 좋겠다... 너무 큰 바램인가...?)
'알고리즘 테스트 > 프로그래머스 문제풀이 및 해설' 카테고리의 다른 글
<프로그래머스 문제풀이: 2016년> Level1 - 파이썬 (0) | 2020.10.22 |
---|---|
<프로그래머스 문제풀이: K번째 수> Level 1 - 파이썬 (0) | 2020.10.21 |
<프로그래머스 문제풀이: 모의고사> Level 1 - 파이썬 (0) | 2020.10.21 |
<프로그래머스 문제풀이: 완주하지 못한 선수> Level 1 - 파이썬 (0) | 2020.10.21 |
<프로그래머스 문제풀이: 두 개 뽑아서 더하기> Level 1 - 파이썬 (0) | 2020.10.18 |