광규니
광규니네
광규니
전체 방문자
오늘
어제
  • 분류 전체보기 (154)
    • 알고리즘 (100)
      • 알고리즘 개념 (2)
      • 문제 풀이 (96)
    • 주절주절 (19)
      • 자격증, 활동 후기 (4)
      • 전시회 후기 (3)
      • 이모저모 (2)
      • 회고 (3)
      • 뜨럼 (7)
    • 운영체제 (9)
    • 개발 지식 (9)
      • Apple Watch (4)
      • MySQL (2)
      • Eclipse (1)
      • XCode (1)
    • 네트워크 공부 (1)
    • 데이터베이스 공부 (5)
    • Java 공부 (7)
    • TMP (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 드린이
  • OS
  • 프로그래머스
  • 컴퓨터 사이언스
  • 티스토리챌린지
  • 파이썬
  • 구현
  • 애플워치 앱 만들기
  • 개념
  • BFS
  • 백준
  • 다이나믹 프로그래밍
  • 운영체제
  • DP
  • 자바
  • 알고리즘
  • 합주
  • BOJ
  • 오블완
  • 애플워치 앱

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
광규니

광규니네

알고리즘/문제 풀이

[Java/자바 swea 5648] 원자 소멸 시뮬레이션

2021. 10. 13. 00:08
반응형

풀이

고려해줄 사항

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
    '알고리즘/문제 풀이' 카테고리의 다른 글
    • [Java/자바 백준 14999] 주사위 굴리기
    • [Java/자바 백준 17140] 이차원 배열과 연산
    • [Java/자바 swea 5653] 줄기세포배양
    • [Java/자바 swea 4013] 특이한 자석
    광규니
    광규니
    공부 및 일상 올리기~

    티스토리툴바