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

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

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

광규니네

알고리즘/문제 풀이

[Java/자바 백준 17837] 새로운 게임 2

2022. 2. 14. 23:08
반응형

풀이

2차원 스택을 활용해서 문제를 풀었습니다.

구현 난이도는 엄청 어렵지 않지만 테케 4번이 계속 틀려서

뭐가 문제지 하면서 봤는데

 

원인은 파란색 칸 일때 !!

 

문제를 보면

  • 파란색인 경우에는 A번 말의 이동 방향을 반대로 하고 한 칸 이동한다. 방향을 반대로 바꾼 후에 이동하려는 칸이 파란색인 경우에는 이동하지 않고 가만히 있는다.

라고 나와있는데,

제가 고려하지 않은 것은 방향을 바꾸고 진행한 nx, ny칸이 흰색 or 빨간색 칸일 수도 있는 상황을 고려하지 않았네요 !

 

그거 수정하니까 정답이 되었습니다 !

 

흰색 칸일때는

쌓여있는 말들을 모두 임시 스택에 넣어주고, 

nx, ny에 다시 넣어줬습니다.

 

빨간 칸 일때는

스택을 하나 더 써서,

뒤집어서 넣어줬습니다.

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

public class Main {
	static int N,K;
	static int[][] map, horses;
	static Stack<Integer>[][] visited;
	static Stack<Integer> stack = new Stack<>();
	static int[] dx = {0,0,-1,1};
	static int[] dy = {1,-1,0,0};
	
	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());
		K = Integer.parseInt(st.nextToken());
		map = new int[N][N];
		visited = new Stack[N][N];
		horses = new int[K][3];
		
		for(int i = 0 ; i < N ; i++) {
			st = new StringTokenizer(br.readLine());
			for(int j = 0 ; j < N ; j++) {
				visited[i][j] = new Stack<>();
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		for(int i = 0 ; i < K ; i++) {
			st = new StringTokenizer(br.readLine());
			
			int x = Integer.parseInt(st.nextToken()) - 1;
			int y = Integer.parseInt(st.nextToken()) - 1;
			int dir = Integer.parseInt(st.nextToken()) - 1;
			horses[i][0] = x;
			horses[i][1] = y;
			horses[i][2] = dir;
			
			visited[x][y].add(i);
		}
		
		int time = 0;
		
		Loop : while(time != 1000) {
			time++;
			for(int idx = 0 ; idx <K ; idx++) {
				int x = horses[idx][0];
				int y = horses[idx][1];
				int dir = horses[idx][2];
				
				int nx = x + dx[dir];
				int ny = y + dy[dir];
				
				// 포개진 상황 고려하기, 임시 큐를 사용하여 담기
				while(visited[x][y].size() != 0) {
					int tmp = visited[x][y].pop();
					stack.add(tmp);
					if(idx == tmp) {
						break;
					}	
				}
				// 파란색 블록 or 범위 밖 
				if(0 > nx || nx >= N || 0 > ny || ny >= N || map[nx][ny] == 2) {
					// 홀수 
					if(dir % 2 != 0) dir -= 1;
					// 짝수 
					else dir += 1;
					
					nx = x + dx[dir];
					ny = y + dy[dir];
					horses[idx][2] = dir;
					// 파란색 블록 or 범위 밖 
					if(0 > nx || nx >= N || 0 > ny || ny >= N || map[nx][ny] == 2) {
						while(!stack.isEmpty()) {
							nx = x;
							ny = y;
							visited[x][y].add(stack.pop());
						}
					}
					else {
						zoneOfRedWhite(nx,ny);
					}
				}
				// 빨간색 블록 뒤집기
				else {
					zoneOfRedWhite(nx, ny);
				}
				if(visited[nx][ny].size() >= 4) break Loop; 
			}
		}
		if(time == 1000) System.out.println(-1);
		else System.out.println(time);
	}
	
	private static void zoneOfRedWhite(int nx, int ny) {
		if(map[nx][ny] == 1) {
			Stack<Integer> stackTmp = new Stack<Integer>();
			while(!stack.isEmpty()) {
				stackTmp.add(stack.pop());
			}
			while(!stackTmp.isEmpty()) {
				int tmp = stackTmp.pop();
				horses[tmp][0] = nx;
				horses[tmp][1] = ny;
				visited[nx][ny].add(tmp);
			}
		}
		// 하얀색 
		else {
			while(!stack.isEmpty()) {
				int tmp = stack.pop();
				horses[tmp][0] = nx;
				horses[tmp][1] = ny;
				visited[nx][ny].add(tmp);
			}
		}
	}
}
반응형
저작자표시 (새창열림)

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

[Java/자바 백준 17135] 캐슬 디펜스  (0) 2022.02.15
[Java/자바 백준 1347] 미로 만들기  (0) 2022.02.15
[Java/자바 프로그래머스] 방문길이  (0) 2022.02.04
[Java/자바 백준 19237] 어른 상어  (0) 2022.02.04
[Java/자바 백준 2234] 성곽  (0) 2022.02.03
    '알고리즘/문제 풀이' 카테고리의 다른 글
    • [Java/자바 백준 17135] 캐슬 디펜스
    • [Java/자바 백준 1347] 미로 만들기
    • [Java/자바 프로그래머스] 방문길이
    • [Java/자바 백준 19237] 어른 상어
    광규니
    광규니
    공부 및 일상 올리기~

    티스토리툴바