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

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

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

광규니네

[Java/자바 백준 20057] 마법사 상어와 토네이도
알고리즘/문제 풀이

[Java/자바 백준 20057] 마법사 상어와 토네이도

2022. 1. 10. 15:53
반응형

풀이

2가지 구현이 핵심이었던 문제

1. 토네이도 루트 구현 -> 규칙이 있어서 나름 쉬움

2. 흩날리는 모래 구현  -> 꽤 까다로움

그림과 같이 소수점으로 떨어지게 되면 버림으로 해서 각각 계산해주어, 1 이상이면 map += 더해주고,

흩날리지 않은 나머지들을 모두 알파에 넣어줘야한다. (처음 퍼센트를 다 계산하니까 나머지가 55여서 55로 계산했다가 시간을 날렸다.)

 

그 과정에서 서 남 동 북 순서대로 3차원 배열을 사용해서 위치를 하나하나씩 구해주었다.

함수가 진행하면서 map 밖으로 나가면 answer에 더해주고 출력 !

package b0108;
import java.io.*;
import java.util.*;

public class Main_bj_g4_20057_마법사상어와토네이도 {
	static int N, curX, curY, curDir, answer;
	static int[][] map;
	//서 남 동 북 
	static int[] dx = {0,1,0,-1};
	static int[] dy = {-1,0,1,0};
	static int[][][] direct = { 
			// 모래 위치 기준으로 방향에 따라서 나눠주기 
			//서 
			{ { 1, -1, 2, -2, 0, 1, -1, 1, -1, 0 }, { 1, 1, 0, 0, -2, 0, 0, -1, -1, -1 } },
			// 남 
			{ { -1, -1, 0, 0, 2, 0, 0, 1, 1, 1 }, { -1, 1, -2, 2, 0, -1, 1, -1, 1, 0 } },
			// 동 
			{ { 1, -1, 2, -2, 0, 1, -1, 1, -1, 0 }, { -1, -1, 0, 0, 2, 0, 0, 1, 1, 1 } },
			// 북 
			{ { 1, 1, 0, 0, -2, 0, 0, -1, -1, -1 }, { -1, 1, -2, 2, 0, -1, 1, -1, 1, 0 } } 
	};
	static int[] percent = {1, 1, 2, 2, 5, 7, 7, 10, 10};
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		N = Integer.parseInt(br.readLine());
		map = new int[N][N];

		answer = 0;
		for(int i = 0 ; i < N ; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for(int j = 0 ; j < N ; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		curX = N/2;
		curY = N/2;

		int idx = -1;
		int len = 0;
		curDir = 0;
		while(true) {
			if(++idx%2 == 0) {
				len ++;
			}
			for(int i = 0 ; i < len ; i++) {
				sandMove();
				windMove();
			}

			curDir = (curDir+1) % 4;

			if(len == N) {
				break;
			}
		}
		System.out.println(answer);
	}

	private static void windMove() {
		curX = curX + dx[curDir];
		curY = curY + dy[curDir];
	}

	private static void sandMove() {
		int nx = curX + dx[curDir];
		int ny = curY + dy[curDir];
		int sandX = nx;
		int sandY = ny;
		if(0> nx || nx>= N || 0>ny || ny>=N) return;

		int sand = map[nx][ny];

		if(sand == 0) return;

		for(int i = 0 ; i < 9 ; i++) {
			nx = sandX + direct[curDir][0][i];
			ny = sandY + direct[curDir][1][i];

			int amount = map[sandX][sandY] * percent[i] / 100;
			sand -= amount;

			if(0> nx || nx>= N || 0>ny || ny>=N) {
				answer += amount;
			}
			else map[nx][ny] += amount;
		}

		nx = sandX + direct[curDir][0][9];
		ny = sandY + direct[curDir][1][9];

		if(0> nx || nx>= N || 0>ny || ny>=N) {
			answer += sand;
			map[curX][curY] = 0;
		}
		else map[nx][ny] += sand;
	}

}

 

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

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

[Java/자바 백준 1062] 가르침  (0) 2022.01.18
[Java/자바 백준 21609] 상어 중학교  (0) 2022.01.15
[Java/자바 프로그래머스] 오픈 채팅방  (0) 2022.01.07
[Java/자바 20056 백준] 마법사 상어와 파이어볼  (0) 2022.01.06
[Java/자바 백준 1520] 내리막 길  (0) 2022.01.05
    '알고리즘/문제 풀이' 카테고리의 다른 글
    • [Java/자바 백준 1062] 가르침
    • [Java/자바 백준 21609] 상어 중학교
    • [Java/자바 프로그래머스] 오픈 채팅방
    • [Java/자바 20056 백준] 마법사 상어와 파이어볼
    광규니
    광규니
    공부 및 일상 올리기~

    티스토리툴바