광규니
광규니네
광규니
전체 방문자
오늘
어제
  • 분류 전체보기 (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)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

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

광규니네

알고리즘/문제 풀이

[Java/자바 20056 백준] 마법사 상어와 파이어볼

2022. 1. 6. 23:37
반응형

풀이

문제 해석은 딱히 필요없고 주어진 대로 구현하면 됩니다.

K번 돌고나서 불의 질량 합을 구하면 되는 문제입니다.

 

저는 map을 큐로 표현해서 fire 형태로 담아 여러개 불이 존재할 수 있는 상황을 해결했습니다.

 

1. fireMove() 에서 불을 이동시켜주었습니다. 불의 범위가 map을 벗어나는 것을 판별해주려고 isAvailiable을 만들었습니다.

%를 사용하면 더 편할거같은데 음수값일때 복잡해져서 일단은 for문 돌때마다 비교를 했습니다.

 

2. 다음 map에 2개 이상의 불이 존재할 경우 fireDivide()에서 나누는 작업을 했습니다.

모든 질량, 속력 값을 구해줘서 조건에 따라 질량이 0이될 경우와 모든 수가 홀수 or 짝수일 때를 판별해주었습니다.

 

https://www.acmicpc.net/problem/21610

비슷한 문제를 풀어봐서 푸는 시간은 얼마 안걸렸지만, r과 c가 1부터 시작한것을 간과해서 30분 정도 삽질을 했습니당 ^^

 

21610번: 마법사 상어와 비바라기

마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기

www.acmicpc.net

import java.io.*;
import java.util.*;

public class Main{
	static int N, M, K, answer;
	static Queue<Fire> fires;
	static Queue<Fire>[][] map;
	static int[] dx = {-1,-1,0,1,1, 1, 0,-1};
	static int[] dy = {0 ,1 ,1,1,0,-1,-1,-1};
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st= new StringTokenizer(br.readLine(), " ");
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		K= Integer.parseInt(st.nextToken());
		answer = 0;
		fires =new LinkedList<>();
		
		map = new LinkedList[N][N];
		for(int i = 0 ; i < N ; i++) {
			for(int j = 0 ; j < N ; j ++) {
				map[i][j] = new LinkedList<Fire>();
			}
		}
		for(int i = 0 ; i < M ; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			int r = Integer.parseInt(st.nextToken())-1;
			int c = Integer.parseInt(st.nextToken())-1;
			int m = Integer.parseInt(st.nextToken());
			int s = Integer.parseInt(st.nextToken());
			int d = Integer.parseInt(st.nextToken());
			fires.offer(new Fire(r,c,m,s,d));
		}
		
		while(K > 0) {
			
			K--;
			fireMove();
			
			for(int i = 0 ; i < N; i++) {
				for(int j = 0 ; j< N ; j++) {
					// 2개이상 queue 넣어주
					int mapSize = map[i][j].size();
					if(mapSize >= 2) {
						fireDivide(i,j);
					}
					// 1개는 그냥 넣어주기 
					else if(mapSize == 1) {
						fires.offer(map[i][j].poll());
					}
				}
			}
		}
		while(! fires.isEmpty()) {
			Fire fire = fires.poll();
			answer += fire.m;
		}
		System.out.println(answer);
	}
	
	private static void fireDivide(int x, int y) {
		int totalM = 0, totalS = 0, totalD = 0;
		int fireCnt = map[x][y].size();
		
		int oddFlag = map[x][y].peek().d % 2;
		boolean flag = true;
		while(! map[x][y].isEmpty()) {
			Fire fire = map[x][y].poll();
			totalM += fire.m;
			// 1,3,5,7 조건 , 모두 홀짝이 아닐때 
			if(oddFlag != fire.d % 2) flag = false;
			totalS += fire.s;
			totalD += fire.d;
		}
		
		if(totalM/5 == 0) return;
		
		int start = 0;
		if(!flag) start += 1;
		
		for(int i = start ; i < 8 ; i += 2) {
			fires.add(new Fire(x, y, totalM/5, totalS/fireCnt, i));
		}
	}

	private static void fireMove() {
		while(! fires.isEmpty()) {
			Fire fire = fires.poll();
			for(int i = 0 ; i < fire.s ; i++) {
				int nx = fire.r + dx[fire.d];
				int ny = fire.c + dy[fire.d];
				
				fire.r = isAvailiable(nx);
				fire.c = isAvailiable(ny);
			}
			map[fire.r][fire.c].offer(fire);
		}
	}

	private static int isAvailiable(int location) {
		if(location < 0) {
			location =  N-1;
		}
		else if (location >= N) {
			location = 0;
		}
		return location;
	}

	static class Fire{
		int r,c,m,s,d;
		//row,col, 질량,속력, 방향 
		public Fire(int r, int c, int m, int s, int d) {
			this.r = r;
			this.c = c;
			this.m = m;
			this.s = s;
			this.d = d;
		}
	}

}
반응형
저작자표시 (새창열림)

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[Java/자바 백준 20057] 마법사 상어와 토네이도  (0) 2022.01.10
[Java/자바 프로그래머스] 오픈 채팅방  (0) 2022.01.07
[Java/자바 백준 1520] 내리막 길  (0) 2022.01.05
[Java/자바 20055 백준] 컨베이어 벨트 위의 로봇  (0) 2022.01.05
[Java/자바 백준 19238] 스타트 택시  (0) 2022.01.04
    '알고리즘/문제 풀이' 카테고리의 다른 글
    • [Java/자바 백준 20057] 마법사 상어와 토네이도
    • [Java/자바 프로그래머스] 오픈 채팅방
    • [Java/자바 백준 1520] 내리막 길
    • [Java/자바 20055 백준] 컨베이어 벨트 위의 로봇
    광규니
    광규니
    공부 및 일상 올리기~

    티스토리툴바