티스토리 뷰
https://www.acmicpc.net/problem/20056
난이도 : 골드 5
LinkedList 2차원 배열을 이용하여 풀었습니다. 1차원 배열만 이용해봤는데 2차원 배열은 처음으로 써봤습니다.
매 턴이 되면 불들이 이동을 할 텐데 불들이 이동할 때 동시에 이동해야 합니다. 이 부분을 적절히 처리하지 않는다면 오동작을 합니다.
저는 새로운 배열을 만들어서 불을 하나씩 이동시킨 후 이 배열을 참조하도록 했습니다. int형으로 푼다면 기본적으로 연산은 버림이기 때문에 신경 쓸 것은 따로 없습니다.
전역 변수
int n = 문제에서 주어진 입력
LinkedList<FireBall> map [][] = 파이어볼의 상태를 저장하는 배열
int dx [], dy [] = 0~8까지 이동할 수 있는 좌표 값.
메소드
void main
입력을 받고 파이어볼들의 위치를 잡아줍니다. 그 후 k번 이동해줍니다.
(move 호출)
void move
파이어볼들이 이동합니다. 하지만 map에 있는 파이어볼들은 이동 후 next 배열에 새겨집니다. 오동작을 방지하기 위함입니다.
파이어볼들의 속력이 n보다 크다면 n으로 모듈러 하여 불필요한 반복을 방지합니다. 속력, 방향으로 다음 좌표 값을 계산합니다. 하지만 맵은 양 옆, 위아래가 이어진 구조입니다. 맵의 정상 범위를 벗어난다면 적절히 처리해줍니다.
모든 이동이 끝났다면 map 변수가 next 배열을 참조하여 새로운 map으로 갈아줍니다.
그 후 혹시나 파이어볼이 겹친 곳이 있으면 나눠줍니다.
(split 호출)
void split
배열에서 파이어볼이 2개 이상인 곳을 찾습니다. 그 좌표에서 질량과 속력의 합을 구하며 짝수와 홀수를 판별해줍니다. int로 계산하므로 소수점은 신경 쓸 필요가 없습니다. 정석은 Math.floor를 이용하는 것입니다.
문제에서 요구한 값을 구하고 새로운 파이어볼들을 그 좌표에 넣어줍니다.
long sum
맵에 있는 모든 파이어볼들의 질량을 더합니다.
int형으로도 될 것 같긴 한데 혹시 몰라 long으로 계산하여 반환했습니다.
'문제풀이 > 백준 && 프로그래머스' 카테고리의 다른 글
[백준 20058] 마법사 상어와 파이어스톰 (자바) (6) | 2020.10.22 |
---|---|
[백준 20057] 마법사 상어와 토네이도 (자바) (0) | 2020.10.21 |
[백준 20055] 컨베이어 벨트 위의 로봇 (자바) (0) | 2020.10.21 |
[백준 17081] RPG Extreme (자바) (2) | 2020.10.19 |
[백준 2146] 다리 만들기 (자바) (0) | 2020.10.16 |