코드굽는 타자기
SWEA[5648] - 원자 소멸 시뮬레이션 본문
링크
Jungol[1661]
문제설명
- {문제설명}
문제풀이
- {문제풀이}
문제코드
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.StringTokenizer;
/*
* contains로는 int[] 같은거 비교 못함
* 최대시간 2000이 아니라 4000임 모서리 에서 만나는 경우
* map index는 +2000 해 줘야함.
* time 4000 이내에 경계 밖으로 나가는 경우도 있음 그경우 처리해줘야함
* 탈출 경계검사의 index 는 -2000~2000임 2배로 늘린거 까먹지말자..
*/
public class Solution {
// {x,y}임
public static int[][] dir = { //
{0,1}, //상
{0,-1}, //하
{-1,0}, //좌
{1,0}, //우
};
public static void main(String[] args) throws NumberFormatException, IOException {
//System.setIn(new FileInputStream("res/swea/5648.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T=Integer.parseInt(br.readLine());
StringTokenizer st;
for (int test_case = 1; test_case <= T; test_case++) {
// 입력
int ans=0;
int N = Integer.parseInt(br.readLine());
int[][] map = new int[4001][4001];
ArrayList<int[]> atom = new ArrayList<int[]>();
LinkedList<int[]> next = new LinkedList<int[]>();
int x,y,d,e;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
x = Integer.parseInt(st.nextToken())*2;
y = Integer.parseInt(st.nextToken())*2;
d = Integer.parseInt(st.nextToken());
e = Integer.parseInt(st.nextToken());
atom.add(new int[] {x,y,d,e});
}
int[] now_xy;
int[] next_xy;
int nx;
int ny;
int[] now_atom;
for (int time = 0; time <= 4000; time++) {
// 1칸씩 이동
for (int i = 0; i < atom.size(); i++) {
now_atom = atom.get(i);
atom.get(i)[0] += dir[now_atom[2]][0];
atom.get(i)[1] += dir[now_atom[2]][1];
// 경계 안에서 이동일 경우
nx=atom.get(i)[0];
ny=atom.get(i)[1];
if(nx>=-2000 && nx<=2000 && ny>=-2000 && ny<=2000) {
// 좌표계 추가
next_xy = new int[] {atom.get(i)[0], atom.get(i)[1]};
// 충돌안하면
next.add(next_xy);
map[next_xy[0]+2000][next_xy[1]+2000]++;
}
else {
atom.remove(i);
i--;
}
}
// 좌표겹치면 boom
for (int i = 0; i < atom.size(); i++) {
now_xy = new int[] {atom.get(i)[0],atom.get(i)[1]};
// 원자 충돌이 발생한 경우임
if(map[now_xy[0]+2000][now_xy[1]+2000]>=2) {
ans+=atom.get(i)[3];
atom.remove(i);
i--;
}
}
// map 초기화
for (int i = 0; i < next.size(); i++) {
now_xy = new int[] {next.get(i)[0],next.get(i)[1]};
map[now_xy[0]+2000][now_xy[1]+2000]=0;
}
next.clear();
if(atom.isEmpty()) {
break;
}
}
System.out.println("#"+test_case+" "+ans);
/*
* 초기화
*/
}//end test_case
}//end main
}
아쉬운점
- 1
- 2
- 3
잘한점
- 1
- 2
- 3
시간초과
'알고리즘 > 미해결' 카테고리의 다른 글
Programmers[59413] - 입양 시각 구하기(2)[Level4] (0) | 2020.05.03 |
---|---|
SWEA[1249] - 보급로[D4] (0) | 2020.02.09 |
Baekjoon[16637] - 괄호 추가하기 (2) | 2020.02.02 |
Programmers[12899] - 124 나라의 숫자[Level2] (0) | 2020.01.28 |
Programmers[42895] - N으로 표현[Level3] (0) | 2020.01.27 |
Comments