반응형
풀이
고려해줄 사항
1. map의 크기 정의
처음엔 2000*2000이면 가능하겠다 생각해서 풀다가 0.5초에 충돌하는 경우를 해결하지 못했습니다.
*2를 해주어서 map의 크기를 늘려주어 이를 해결해줬습니다.
input 원자들의 값들도 *2 해주고 + 2000씩 해주어야합니다.
2. map[nx][ny] 값이 0일 경우는 그냥 옮겨주고
0이 아닐 경우에는 map[nx][ny]= map[nx][ny] + 현재 에너지 로 잡고 queue를 넣어주지 않았습니다.
이렇게 되면, 처음 도달한 원자 값만 큐에 있기 때문에, 이 원자값을 현재 map 위치의 값과 비교해주어서 조건에 해당하면
현재 map위치의 값에 있는 원자 에너지값을 모두 더해주었습니다.
3. 원자 에너지가 0인 경우
원자 에너지가 0인 경우는 에너지가 가질 수 있는 최대 에너지값 +1 을 해주어서
현재 energy값이 101인데 충돌을 할 경우 갯수를 카운트해주고 마지막에 빼주기
import java.io.*;
import java.util.*;
//0.5 초씩 만나는거를 해결못해줬다. 4000으로 늘려볼까하다가 안했는데 뭐든지 시도는 해봐야겠다.
// 0.5초씩 전진해서 만나는 경우 -> 4000으로 늘려서 해결
// map을 두배로 늘려줌으로써 0.5,1초 나눌 필요없이 한번에 해결 가능
public class Solution{
static int N, ans;
static int[][] map=new int[4001][4001];
//상 하 좌 우 반대로 따져줘야 반대로 따져줘야한다. 30분 잡아먹음..
static int[] dx = {0,0,-1,1};
static int[] dy = {1,-1,0,0};
static Queue<Pos>queue;
static class Pos{
int y,x,dir,energy;
public Pos(int y, int x, int dir, int energy) {
super();
this.y = y;
this.x = x;
this.dir = dir;
this.energy = energy;
}
}
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int t= Integer.parseInt(br.readLine());
for(int tc=1 ; tc<=t ; tc++) {
N = Integer.parseInt(br.readLine());
queue= new LinkedList<Pos>();
ans=0;
for(int i=0 ; i<N ; i++) {
st= new StringTokenizer(br.readLine()," ");
int x= Integer.parseInt(st.nextToken());
int y= Integer.parseInt(st.nextToken());
int dir=Integer.parseInt(st.nextToken());
int energy=Integer.parseInt(st.nextToken());
// 테케중에 energy0 일 경우 없는거랑 비교를 못해주므로
// energy 최대값보다 +1 해준다음 출력하기 전에 빼준다.
if(energy == 0) energy = 101;
queue.add(new Pos(2*y+2000,2*x+2000,dir,energy));
}
bfs();
sb.append("#").append(tc).append(" ").append(ans).append("\n");
}
System.out.println(sb);
br.close();
}
private static void bfs() {
// TODO Auto-generated method stub
int cntzero = 0;
// map을 테케마다 선언 안해줘도 되는게 범위를 벗어나게되면 map현재값이 0으로 바뀐다.
while(!queue.isEmpty()) {
Pos cur = queue.poll();
// 현재 위치에서 값이 내 에너지보다 크면
if(map[cur.y][cur.x]>cur.energy) {
if(cur.energy==101) {
cntzero++;
}
ans += map[cur.y][cur.x];
map[cur.y][cur.x]=0;
continue;
}
// 현재위치를 0으로 만들기
map[cur.y][cur.x]=0;
int ny = cur.y + dy[cur.dir];
int nx = cur.x + dx[cur.dir];
if(0>nx || nx>4000 || 0>ny|| ny>4000) continue;
// map[ny][nx]가 0일 경우
if(map[ny][nx]==0) {
queue.offer(new Pos(ny,nx,cur.dir,cur.energy));
}
// 아닐 경우 queue에 넣어줄 필요 없고 energy가 0인지 확
else {
if(cur.energy==101) {
cntzero++;
}
}
// 다음위치 += 해준다 여러개가 모이는상황 고려
map[ny][nx] += cur.energy;
}
ans -= cntzero*101;
}
}
아쉬운 점
1. 사이즈를 4000으로 늘려볼까만 생각하고 안해본거.
2. ny,nx 반대로 생각해주는게 헷갈린거
3. 원자 충돌기준을 ny,nx 기준에 맞춰서 풀이한거, cur기준으로 맞추자
반응형
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[Java/자바 백준 14999] 주사위 굴리기 (0) | 2021.10.29 |
---|---|
[Java/자바 백준 17140] 이차원 배열과 연산 (0) | 2021.10.17 |
[Java/자바 swea 5653] 줄기세포배양 (0) | 2021.10.11 |
[Java/자바 swea 4013] 특이한 자석 (0) | 2021.10.01 |
[Java/자바 swea 1868] 파핑파핑 지뢰찾기 (0) | 2021.10.01 |