https://www.acmicpc.net/problem/20057
20057번: 마법사 상어와 토네이도
마법사 상어가 토네이도를 배웠고, 오늘은 토네이도를 크기가 N×N인 격자로 나누어진 모래밭에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c열을 의미하고, A[r][c]는 (r, c)에 있는 모래의 양을
www.acmicpc.net
문제를 이해하는데도 시간이 꽤 걸렸던 문제.
풀이 순서: 토네이도의 위치 획득 -> 각 토네이도에 의해 이동한 모래의 양을 구해 범위 밖이면 결과 값 result에 추가
1. 좌표 설정
- 왼쪽 방향으로 이동할 때 모래가 흩어지는 좌표를 구할 수 있는 left 리스트 구성 -> 여기서 좌표는 모래바람이 이동한 후 인 y 위치를 기준으로 작성 -> 마지막 리스트의 원소는 알파 위치이기 때문에 per = 0 (dummy)으로 설정
- left 리스트를 이용하여 list comprehension 을 통해 right, up, down 리스트 구성
- 순서대로 left, down, right, up 으로 이동하는 dx, dy 리스트 생성
- 4가지 방향을 기준으로 반복하므로 나머지(%)를 이용한 count와 숫자에 따른 방향을 담은 dict 생성
- 좌표의 정 중앙 부터 시작하므로 시작 좌표 x, y = N//2, N//2
2. 토네이도의 진행
- 토네이도는 총 2*N-1 번 진행
- 토네이도의 진행 방향 별 횟수는 left 방향과 right 방향으로 시작할 때마다 추가됨 (time 변수를 통해 해결) -> 마지막 진행에는 추가되지 않기 때문에 count_sand 함수에서 to_y <0 조건문을 통해 해결
- 토네이도의 진행 후 좌표를 count_sand 함수에 진행 방향과 함께 전달
3. 흩어지는 모래 구하기
- 각 방향별로 모래가 흩어지는 좌표 획득
- 만약 per가 0 이라면 알파 위치이기 때문에 남은 모래 저장
- 모래의 소수점 아래는 버리기 때문에 int형으로 구함
- 좌표가 범위 안에 든다면 그 위치에 모래를 더하고 그렇지 않다면 결과 값 result에 추가
'알고리즘 문제 > 구현' 카테고리의 다른 글
[Java] 구현 (쿠키의 신체 측정) (1) | 2023.03.03 |
---|---|
[Java] 구현 (한 줄로 서기) (0) | 2023.02.18 |
구현 (누울 자리를 찾아라) (0) | 2022.04.27 |