알고리즘/BOJ

백준 20057번 마법사 상어와 토네이도

꾸준함. 2021. 5. 1. 02:36

문제 링크입니다: www.acmicpc.net/problem/20057

 

20057번: 마법사 상어와 토네이도

마법사 상어가 토네이도를 배웠고, 오늘은 토네이도를 크기가 N×N인 격자로 나누어진 모래밭에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c열을 의미하고, A[r][c]는 (r, c)에 있는 모래의 양을

www.acmicpc.net

기존 마법사 상어 문제들처럼 주어진 과정만 수행해주면 됩니다.

 

알고리즘은 아래와 같습니다.

1. 토네이도가 한 방향으로 이동하는 길이는 방향을 두 번 바꿀 때마다 1증가하고, 방향이 바뀔 때는 반시계방향으로 90도 돕니다.

2. 모래가 이동했을 때 분배되는 비율을 5 * 5 이차원 배열에 저장하고, 방향이 바뀔 때마다 반시계방향으로 90도 회전시켜줍니다. (sandPercentage 배열과 rotateSandPercentage 메서드 참고)

3. 토네이도 위치가 바뀔 때마다 moveSand 메서드를 호출하고 해당 좌표에 모래가 있을 때 하위 알고리즘을 진행해줍니다.

3.1 sandPercentage 배열을 기준으로 모래를 분배하는데 이 때 소수점 아래는 버리라고 했으므로 알파 위치에 존재하는 모래 양은 별도의 메서드(getLeftSand)를 통해 구해줘야합니다.

3.2 격자 밖을 벗어나면 result에 모래를 더해주고, 격자 안에 모래가 쌓일 경우 해당 좌표에 더해주면 됩니다.

4. 토네이도가 (0, 0)에 위치할 때까지 3번 알고리즘을 반복해주고 result를 출력해주면 끝

 

 

개발환경:Visual Studio 2017

 

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형