https://www.acmicpc.net/problem/20055
입력
첫 번째 줄 : n k
n : 컨베이어 벨트 길이
k : 내구도가 0인 위치의 한계값
두 번째 줄 : 벨트 내구도
출력 : 종료 시 단계, 1단계부터 시작함
문제에서 참고할 설명
1번칸 : 컨베이어 벨트에 올리는 위치
N번칸 : 컨베이어 벨트에서 내리는 위치
내구도 깎이는 기준
1) 로봇을 올리는 위치에 올림
2) 로봇이 칸 이동을 진행함
시뮬레이션 순서
1) 벨트 한 칸 회전 (로봇이 같이 움직임)
2) 올라탄 로봇 순서대로 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동
이동하려면 해당 칸에 로봇이 없으며, 내구도가 1이상이어야 함
3) 올리는 위치의 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올림
4) 내구도가 0인 칸의 개수가 k개 이상이면 종료
시뮬레이션이므로 문제의 요구사항을 정확히 이해한 후 그에 맞춰서 구현하는 것이 중요합니다.
def rotate():
global n
# 벨트 돌리기
temp = belt[0][n - 1]
for i in range(n - 1, 0, -1):
belt[0][i] = belt[0][i - 1]
belt[0][0] = belt[1][0]
for i in range(0, n - 1):
belt[1][i] = belt[1][i + 1]
belt[1][n - 1] = temp
# 로봇 돌리기
for i in range(n - 1, 0, -1):
robot[i] = robot[i - 1]
robot[0] = False
def drop():
global n
if robot[n - 1] == True:
robot[n - 1] = False
def move():
global n, dur_cnt
for i in range(n - 2, -1, -1):
if robot[i + 1] == True or belt[0][i + 1] == 0:
continue
if robot[i] == True:
robot[i + 1] = True
belt[0][i + 1] -= 1
robot[i] = False
if belt[0][i + 1] == 0:
dur_cnt += 1
def up():
global dur_cnt
if robot[0] == True or belt[0][0] == 0:
return
robot[0] = True
belt[0][0] -= 1
if belt[0][0] == 0:
dur_cnt += 1
n, k = list(map(int, input().split()))
durability = list(map(int, input().split()))
belt = [[0] * n for _ in range(2)]
robot = [False] * n
cnt = 0
for i in range(n):
belt[0][i] = durability[cnt]
cnt += 1
for i in range(n - 1, -1, -1):
belt[1][i] = durability[cnt]
cnt += 1
dur_cnt = 0 # 내구도가 0인 벨트 개수
ans = 1
while 1:
# print("+++++++++: ", ans)
# 벨트 회전 & 로봇 회전
rotate()
# 내리는 칸에 로봇 있는지 체크
drop()
# print("rotate")
# print(belt)
# print(robot)
# 모든 로봇 한 칸 이동
move()
# 내리는 칸에 로봇 있는지 체크
drop()
# print("move")
# print(belt)
# print(robot)
# 로봇 올리기
up()
# print("up")
# print(belt)
# print(robot)
dc = 0
# for i in range(2):
# for j in range(n):
# if belt[i][j] == 0:
# dc += 1
# 내구도 0인 벨트 개수가 k개 이상이면 break
if dur_cnt >= k:
break
ans += 1
print(ans)
사용하는 배열이 많아서 중간에 값이 제대로 나오지 않아 엉키는 문제가 있었다.
매 함수를 완성하고 코드가 정확히 동작하는지 확인하자.
해당 코드는 에디터가 코드 연습을 위해 직접 작성하였습니다.
혹시 오류가 있거나 더 좋은 코드 방향성을 아시는 분은 댓글로 남겨주시면 감사하겠습니다!
python source : https://github.com/ssh5212/conding-test-practice
java source : https://github.com/ssh5212/coding-test-java
[BOJ / 백준] 10815 숫자 카드 (S5^ / 이분탐색) - Python (0) | 2024.06.19 |
---|---|
[BOJ / 백준] 2805 나무 자르기 (S2^ / 이분탐색) - Python (1) | 2024.06.18 |
[코드트리] 고대 문명 유적 탐사 (G4^ / 시뮬레이션) - Python (0) | 2024.06.15 |
[BOJ / 백준] 11559 Puyo Pyuo (G4 / 시뮬레이션, BFS) - Python (0) | 2024.06.14 |
[BOJ / 백준] 20056 마법사 상어와 파이어볼 (G4^ / 시뮬레이션) - Python (0) | 2024.06.12 |