일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 코로나19
- ChatGPT
- AI 경진대회
- 편스토랑
- hackerrank
- 맥북
- Docker
- 데이콘
- 더현대서울 맛집
- 백준
- 프로그래머스 파이썬
- ubuntu
- Kaggle
- programmers
- SW Expert Academy
- PYTHON
- 자연어처리
- github
- leetcode
- gs25
- 우분투
- 파이썬
- dacon
- 편스토랑 우승상품
- 프로그래머스
- 금융문자분석경진대회
- Real or Not? NLP with Disaster Tweets
- Baekjoon
- 캐치카페
- Git
- Today
- Total
솜씨좋은장씨
[Programmers] 2019 카카오 개발자 겨울 인턴십 - 크레인 인형뽑기 게임 (Python) 본문
[Programmers] 2019 카카오 개발자 겨울 인턴십 - 크레인 인형뽑기 게임 (Python)
솜씨좋은장씨 2022. 2. 14. 09:49
코딩 1일 1문제! 오늘의 문제는 2019 카카오 개발자 겨울 인턴십 문제였던! 크레인 인형뽑기 게임 입니다.
👨🏻💻 문제 풀이
인형이 들어있는 인형뽑기 게임이 있고 인형을 들어올리는 크레인이 움직이는 경로가 주어지고
각 경로에서 뽑은 인형을 하나의 바구니에 담을때 같은 인형끼리 붙을 경우 인형이 터지면서 사라진다고 할때
터져서 없어진 인형의 개수를 구하는 문제입니다.
딱 터져서 없어진다! 라는 것을 보았을 때 스택의 개념을 활용해서 풀면 되겠다! 라는 생각이 들었습니다.
그래서 바구니 ( basket ) 를 스택으로 하나 만들어주었습니다.
basket = [0]
0을 넣어준 이유는 -1로 접근하였을때 오류가 나지 않도록 하기 위해서 0을 하나 넣어주었습니다.
크레인으로 인형을 뽑는다고 한다면 각 위치의 가장 위쪽 인형을 뽑게 됩니다.
1 -> 5 -> 5 -> 3 순서로 뽑았을 경우 위와 같이 바구니에 쌓이고 같은 인형이 만났을때 터져 없어지는 것을 볼 수 있습니다.
그럼 크레인이 각 위치를 돌면서 뽑을 수 있는 인형은 어떻게 구하느냐!
위와 같이 인형이 있는 현재 상황 ( board )을 2차원 리스트로 제공합니다.
[[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 2 3 4 5
이를 인형 그림 처럼 배열해보면 위와 같습니다.
그럼 각 열의 값이 각 위치의 인형의 값인데 0이면 비어있고 0이 아니면 인형이 있는 것 입니다.
각 위치에 인형이 비어있다면 크레인이 해당 위치에 갔을때 아무것도 하지 않는 조건이 있습니다.
N = len(board)
idx_list = [0 for _ in range(N)]
for i in range(N):
for j in range(N):
if board[j][i] != 0:
continue
idx_list[i] += 1
먼저 각 위치에서 크레인이 인형을 집으려고 할때 가져갈 수 있는 인형의 위치를 구합니다.
각 열에서 0이 아닌 위치의 행 값을 저장했습니다.
for move in moves:
if idx_list[move-1] != N:
if board[idx_list[move-1]][move-1] != basket[-1]:
basket.append(board[idx_list[move-1]][move-1])
idx_list[move-1] += 1
else:
basket.pop()
idx_list[move-1] += 1
answer += 2
그 다음 크레인이 이동하는 경로를 하나씩 가져와서 해당 위치에 인형이 있을 경우에만
인형을 꺼내 바구니에 넣고
바구니의 맨 위에 해당 인형이 있으면 정답 +2 + 바구니에서 맨 위 인형꺼내기
바구니의 맨 위에 있는 인형이 크레인으로 집은 인형과 다를때는 그냥 꺼낸 인형을 바구니에 넣기만하기의
방식으로 진행합니다.
전체 코드는 아래를 참고해주세요.
👨🏻💻 코드 ( Solution )
def solution(board, moves):
answer = 0
basket = [0]
N = len(board)
idx_list = [0 for _ in range(N)]
for i in range(N):
for j in range(N):
if board[j][i] != 0:
continue
idx_list[i] += 1
for move in moves:
if idx_list[move-1] != N:
if board[idx_list[move-1]][move-1] != basket[-1]:
basket.append(board[idx_list[move-1]][move-1])
idx_list[move-1] += 1
else:
basket.pop()
idx_list[move-1] += 1
answer += 2
return answer
'Programming > 코딩 1일 1문제' 카테고리의 다른 글
[Programmers] 찾아라 프로그래밍 마에스터 - 폰켓몬 (Python) (0) | 2022.02.16 |
---|---|
[Programmers] 탐욕법(Greedy) - 체육복 (Python) (0) | 2022.02.15 |
[Programmers] 2017 팁스타운 - 짝지어 제거하기 (Python) (0) | 2022.02.13 |
[BaekJoon] 2747번 : 피보나치 수 (Python) (0) | 2022.02.12 |
[BaekJoon] 1834번 : 나머지와 몫이 같은 수 (Python) (0) | 2022.02.11 |