코드굽는 타자기

SWEA[5648] - 원자 소멸 시뮬레이션 본문

알고리즘/미해결

SWEA[5648] - 원자 소멸 시뮬레이션

bright-jun 2020. 2. 20. 15:04

링크

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

시간초과

Comments