알고리즘

시뮬레이션 - 13335 트럭 / 14499 주사위굴리기

ghtis1798 2021. 9. 6. 16:57

5. 13335 트럭

image

5.1. 문제유형

  • 시뮬레이션

5.2. 풀이과정

  • 주어진 로직을 따라가며 그대로 구현하였다.
  • 두 가지 조건을 체크하며, 트럭을 통과시켰다.
  1. 다리가 꽉 차 있는가?
  2. 다리의 무게가 버틸 수 있는가?
  • 다리가 꽉 차 있지 않고, 트럭 무게를 감당할 수 있으면 트럭을 통과시킨다.
  • 다리 위의 트럭 초를 증가시키며 1칸씩 전진시킨다.
  • ⭐ 주의할 점은 다리를 완전히 통과할 때, 동시에 다음 트럭이 들어와야 하는 경우를 고려해야한다.
  • 따라서 미리 트럭을 제거해주었으므로, 마지막 소스코드에 1초를 추가해주었다.

5.3. 소스코드

from collections import deque

n, w, l = map(int, input().split())
trucks = deque(list(map(int, input().split())))
bridge = deque()
sec = 0
while trucks:
    sec += 1
    total = sum([weight for weight, _ in bridge])

    if total+trucks[0] <= l and len(bridge) < w:
        go = trucks.popleft()
        bridge.append([go, 1])
    for i in range(len(bridge)):
        bridge[i][1] += 1
    if bridge[0][1] == w+1:
        bridge.popleft()

while bridge:
    sec += 1
    for i in range(len(bridge)):
        bridge[i][1] += 1
    if bridge[0][1] == w+1:
        bridge.popleft()
# 1초를 추가하는 이유
# 맨 앞 트럭이 다음 트럭이 들어 올 수 있도록 미리 빠져나가므로, 1초 일찍 종료됨
print(sec+1)

6. 14499 주사위 굴리기

image

6.1. 문제유형

  • 시뮬레이션

6.2. 풀이과정

  • 이 문제는 크게 3가지를 고려해야 해결할 수 있었다.
  1. 뒤집어진 좌표계 (r,c)로 이동한다. r은 북쪽으로부터 떨어진 수, c는 서쪽으로부터 떨어진 수
    • 따라서 동,서,북,남 이동 시 반대로 좌표계를 설정해주어야한다.
  2. 두 번째는 동서남북 이동 시, 변하는 주사위 모양대로 변형시켜 주어야한다.
    • 실제 전개도를 그려보며, 어떤 특징이 있는지 파악했다.
  3. 현재 좌표값이 0이면 현재 좌표에 주사위 밑면 값을 저장한다.
    • 현재 좌표값이 0이 아니라면, 주사위 밑면에 좌표값을 저장하고 좌표값을 0으로 바꾼다.

6.3. 소스코드

n, m, x, y, k = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]
commands = list(map(int, input().split()))

# dx=[1,-1,0,0]
# dy=[0,0,-1,1]
dx=[0,0,-1,1] # x좌표가 북쪽으로부터 떨어진 개수. 위아래. 
dy=[1,-1,0,0] # y좌표가 서쪽으로부터 떨어진 개수. 좌우
dice=[0,0,0,0,0,0]

for dir in commands:
    nx = x + dx[dir-1]
    ny = y + dy[dir-1]

    if not (0<=nx<n and 0<=ny<m):
        continue

    if dir == 1:
        dice[0],dice[1],dice[2],dice[5] = dice[5],dice[0],dice[1],dice[2]
    elif dir == 2:
        dice[0],dice[1],dice[2],dice[5] = dice[1],dice[2],dice[5],dice[0]
    elif dir == 3:
        dice[1],dice[3],dice[4],dice[5] = dice[4],dice[1],dice[5],dice[3]
    else:
        dice[1],dice[3],dice[4],dice[5] = dice[3],dice[5],dice[1],dice[4]

    if graph[nx][ny] == 0:
        graph[nx][ny] = dice[1]
    else:
        dice[1] = graph[nx][ny]
        graph[nx][ny] = 0

    x, y = nx, ny
    print(dice[5])