알고리즘/PS - SWEA

[SWEA 5650 - Java] 핀볼 게임

excited-hyun 2021. 10. 15. 17:31
반응형
 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

풀이

이 문제는 특별한 알고리즘을 적용하는 것이 중요하지는 않은 구현문제입니다!!

특히 블록에 부딪히거나 벽에 부딪힌 경우의 방향 전환과 웜홀에서 순간 이동에 주의해야합니다!!!

 

저는 위의 그림처럼 충돌 전 방향과 충돌 후 방향이 어떻게 변하는지를 미리 생각해두고 문제를 해결했습니다.

또한 웜홀의 경우는 ArrayList배열을 만들어 같은 숫자에 해당하는 위치들을 해당 인덱스에 저장해 두고 사용했습니다.

 

그런뒤 map상에서 빈칸 즉 0인 위치들에서 각각의 4가지 방향에 대해 모두 출발해 보며 최대 점수를 찾아내면 되는 문제입니다.

 

import java.util.Scanner;
import java.util.*;

public class Solution {

	static int[][] dirChange = {{0, 0, 0, 0}, {1, 2, 3, 0}, {1, 3, 0 ,2}, {3, 0, 1, 2}, {2, 0, 3, 1}, {1, 0, 3, 2}};
	static int[] moveR = {0, 0, -1, 1};
	static int[] moveC = {1, -1, 0, 0};
	
	static int[][] map;
	static ArrayList<Pos>[] wormhole;
	
	static int N;
	static int answer;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int T = sc.nextInt();
		
		for(int tc = 1; tc<= T; tc++) {
			N = sc.nextInt();
			map = new int[N][N];
			wormhole = new ArrayList[5];
			
			for(int i=0; i<5; i++) {
				wormhole[i] = new ArrayList<>();
			}
			
			for(int i=0; i<N; i++) {
				for(int j=0; j<N; j++) {
					map[i][j] = sc.nextInt();
					if(map[i][j] >= 6) {
						wormhole[map[i][j]-6].add(new Pos(i, j));
					}
				}
			}
			
			
			answer = 0;
		
			for(int i=0; i<N; i++) {
				for(int j=0; j<N; j++) {
					if(map[i][j]!=0)
						continue;
					for(int dir=0; dir<4; dir++) {
						
						int score = check(i, j, dir);
						if(score > answer)
							answer = score;
						
					}
				}
			}
			
			System.out.println("#"+tc+" "+answer);
		}

	}
	
	static int check(int r, int c, int dir) {
		int score = 0;
		
		int nowR = r;
		int nowC = c;
		int move = 0;
		
		while(true) {
			
			//제자리로 
			if(nowR == r && nowC == c && move !=0) 
				break;
			
			//블랙홀
			if(map[nowR][nowC] == -1)
				break;
			
			nowR = nowR + moveR[dir];
			nowC = nowC + moveC[dir];
			move++;
			
			
			//벽에 부딪힘 
			if(nowR<0 || nowR>=N || nowC<0 || nowC>=N) {
				nowR = nowR - moveR[dir];
				nowC = nowC - moveC[dir];
				
				if(dir == 0)
					dir = 1;
				else if(dir == 1)
					dir = 0;
				else if(dir == 2)
					dir = 3;
				else if(dir == 3)
					dir = 2;
				
				score++;
				
			}
			
			//블록에 부딪힘 
			if(map[nowR][nowC] >= 1 && map[nowR][nowC] <=5) {
				int block = map[nowR][nowC];
				
				dir = dirChange[block][dir];
				score++;
				continue;
			}
			
			//웜홀
			if(map[nowR][nowC] > 5) {
				int block = map[nowR][nowC];
				int r1 = wormhole[block-6].get(0).r;
				int c1 = wormhole[block-6].get(0).c;
				
				int r2 = wormhole[block-6].get(1).r;
				int c2 = wormhole[block-6].get(1).c;
				
				if(nowR == r1 && nowC == c1) {
					nowR = r2;
					nowC = c2;
				}
				else {
					nowR = r1;
					nowC = c1;
				}
			}
			
			
		}
		
		return score;
	}
	
	static class Pos {
		int r, c;
		Pos(int r, int c){
			this.r = r;
			this.c = c;
		}
		
	}

}
728x90
반응형

'알고리즘 > PS - SWEA' 카테고리의 다른 글

[SWEA 5644 - Java] 무선 충전  (0) 2021.10.18
[SWEA 4012 - Java] 요리사  (0) 2021.10.15
[SWEA 1953 - Java] 탈주범 검거  (0) 2021.10.14
[SWEA 1952 - Java] 수영장  (0) 2021.10.14
[SWEA 1949 - Java] 등산로 조성  (0) 2021.10.13