문제: https://www.acmicpc.net/problem/20055
구현 문제였기 때문에 문제에서 요구하는 순서대로, 잘 구현해주었다.
문제를 풀면서 주의해야할 점들이 몇가지 보였는데 다음과 같다.
주의할 점
1. 벨트 순서 사진을 보면 N+1번째 칸이 N번째 칸 밑에 존재한다.
처음에는 1~N, N+1~2N 순서로 배열을 만들었는데 1~N, 2N~N+1 순서로 배열을 만들어 주어야 한다.
(예제 1, 2, 3은 맞는데 예제 4번만 틀리는 경우 고려해보면 좋음)
2. 로봇박스는 N번째 칸에 도착하는 순간 내려진다.
순서 1에서 한바퀴 돌릴때, 순서 2에서 로봇을 옮길 때 모두 마지막 칸의 로봇은 즉시 내려주어야 한다.
def check_durability():
cnt = 0
for i in range(2):
for j in range(n):
if q[i][j][0] == 0:
cnt += 1
return cnt
def rotate():
temp = q[1][0]
# 밑 줄 왼쪽으로 한칸씩 이동
for i in range(1, n):
q[1][i-1] = q[1][i]
# 밑줄 오른쪽칸 윗줄 오른쪽 칸에서 받아오기
q[1][n-1] = q[0][n-1]
# 윗 줄 오른쪽으로 한칸씩 이동
for i in range(n-1, 0, -1):
q[0][i] = q[0][i-1]
# 윗 줄 첫번째 칸 채우기
q[0][0] = temp
n, k = map(int, input().split())
q = []
q.append([])
q.append([])
cnt = 0
for i in map(int, input().split()):
if cnt >= n:
# q[1].append([i, 0])
q[1].insert(0, [i, 0])
else:
q[0].append([i, 0])
cnt += 1
turn = 0
while True:
turn += 1
# step 1
rotate() # 한바퀴 돌리기
if q[0][n-1][1] == 1: # 로봇이 있으면 내리기
q[0][n-1][1] = 0
# step 2
for i in range(n-2, 0, -1):
if q[0][i][1] == 1 and q[0][i+1][1] == 0 and q[0][i+1][0] > 0: # 로봇이 있을 때 이동하려는 칸에 로봇이 없고 내구도가 1 이상이면
# 로봇 옮기기
if i+1 != n-1:
q[0][i+1][1] = 1
q[0][i][1] = 0
# 내구도 감소
q[0][i+1][0] -= 1
# step 3
if q[0][0][0] > 0: # 내구도가 1 이상이라면
q[0][0][1] = 1 # 로봇 두기
q[0][0][0] -= 1 # 내구성 감소
# step 4
if check_durability() >= k:
print(turn)
break
'코딩테스트' 카테고리의 다른 글
[Python] 프로그래머스 - 카펫 (0) | 2023.08.31 |
---|---|
[Python] 프로그래머스 - 전화번호 목록 (0) | 2023.08.25 |
[Python] 백준 15684번 - 사다리 조작 (0) | 2023.08.23 |
[Python] 백준 2146번 - 다리 만들기 (bfs, dfs 풀이) (0) | 2023.08.23 |
[Python] 백준 16234번 - 인구 이동 (0) | 2023.08.07 |