광규니
광규니네
광규니
전체 방문자
오늘
어제
  • 분류 전체보기 (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
  • 개념
  • 합주
  • 오블완
  • 다이나믹 프로그래밍
  • 드린이
  • 자바
  • 알고리즘
  • 파이썬
  • 애플워치 앱
  • 프로그래머스
  • 구현
  • 백준
  • BOJ
  • 운영체제
  • DP
  • 애플워치 앱 만들기

최근 댓글

최근 글

티스토리

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

광규니네

알고리즘/문제 풀이

[Java/자바 SWEA 1953] 탈주범 검거

2022. 4. 11. 22:33
반응형

풀이

import java.io.*;
import java.util.*;
// 뱡항을 중심으로 1번은 4방 돌리고
// 2~7 은 들어온 방향으로 돌려야할거같은데
// 상 우 하 좌
public class Solution {
	static int n,m,r,c,l, time;
	static int[][] map;
	static boolean[][] check;
	static Queue<int []> queue= new LinkedList<int[]>();
	
	static int[] dx= {-1,0,1,0};
	static int[] dy= {0,1,0,-1};
	
	//hole에 위치를 기준으로 들어온 방향이 갈 수 있는 곳으로 설정하자.
	// 들어오는 방향마다 가능한거 -1
	// 상: 1,2,5,6
	// 우: 1,3,6,7
	// 하: 1,2,4,7
	// 좌: 1,3,4,5
	
	// 1번을 빼곤 들어온 방향을 따져줫 다음 nx,ny를 따져주자 
	static int[][] dx_hole = {{0,1,0,-1},{-1,0,1,0},{0,0,0,0},{0,0,0,-1}, {0,0,0,1}, {0,1,0,0}, {0,-1,0,0}};
	static int[][] dy_hole = {{1,0,-1,0}, {0,0,0,0}, {0,1,0,-1}, {0,0,1,0}, {1,0,0,0}, {-1,0,0,0},{0,0,-1,0}};
	
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int tc= Integer.parseInt(br.readLine());
		StringTokenizer st;
		label : for(int t=1 ; t<=tc; t++) {
			st= new StringTokenizer(br.readLine()," ");
			n=Integer.parseInt(st.nextToken());
			m=Integer.parseInt(st.nextToken());
			r=Integer.parseInt(st.nextToken());
			c=Integer.parseInt(st.nextToken());
			l=Integer.parseInt(st.nextToken());
			
			map = new int[n][m];
			check = new boolean[n][m];
			check[r][c]=true;
			if(l==1 || map[r][c]==0) {
				if(map[r][c]!=0) System.out.println("#"+t+" "+1);
				else System.out.println("#"+t+" "+0);
				continue label;
			}
			time=2;
			for(int i=0;i<4;i++) {
				if(dx_hole[map[r][c]-1][i]!=0 || dy_hole[map[r][c]-1][i] != 0) {
					int nx= r+dx_hole[map[r][c]-1][i];
					int ny= c+dy_hole[map[r][c]-1][i];
					if(0<=nx && nx<n && 0<=ny && ny<m && map[nx][ny]!=0) {
						if(map[nx][ny]!=0) queue.offer(new int[] {nx,ny,i});
						
					}
				}
			}
			
			for(int i=0;i <n;i++) {
				st=new StringTokenizer(br.readLine()," ");
				for(int j=0 ; j<m ; j++) {
					map[i][j]=Integer.parseInt(st.nextToken());
				}
			}
			
			bfs();
			int total=0;
			for(int i=0;i<n;i++) {
				for(int j=0; j<m; j++) {
					if(check[i][j]==true) total+=1;
				}
			}
			System.out.println("#"+t+" "+total);
		}
		
		
		
	}

	private static void bfs() {
		
		pass : while(! queue.isEmpty()) {
			
			int cnt=queue.size();
			for(int a=0 ; a<cnt;a++) {
				int[] cur=queue.poll();
				
				int bx=cur[0];
				int by=cur[1];
				//이전 방향 
				int dir=cur[2];
				
				//check 값 들어온 값 유효한지 따져주기
				int cur_num=map[bx][by];
				if(cur_num==1) {
					check[bx][by]=true;
					for(int i=0; i<4;i++) {
						int nx=bx+dx[i];
						int ny=by+dy[i];
						if(0<=nx && nx<n && 0<=ny && ny<m && map[nx][ny]!=0) {
							queue.offer(new int[] {nx,ny,i});
						}
					}
				}
				else {
					//반대 방향이
					int bdx=dx_hole[(dir+2)%4][(dir+2)%4];
					int bdy=dy_hole[(dir+2)%4][(dir+2)%4];
					if(map[bx+bdx][by+bdy]!=0) {
						check[bx][by]=true;
					}
					int nx = bx + dx_hole[cur_num][dir];
					int ny = by + dy_hole[cur_num][dir];
					
					if(0<=nx && nx<n && 0<=ny && ny<m && map[nx][ny]!=0) {
						for(int i=0;i<4;i++) {
							if(i!=dir)
								if(dx_hole[cur_num][i]!=0 || dy_hole[cur_num][i] !=0) queue.offer(new int[] {nx,ny,i});
						}
					}
					
				}
				
			}
			time+=1;
			if(time==l) continue pass;
		}
	}
}
반응형
저작자표시 (새창열림)

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

[Java/자바 백준 14226] 이모티콘  (0) 2022.04.14
[Java/자바 백준 1504] 특정한 최단 경로  (0) 2022.03.30
[Java/자바 백준 1459] 걷기  (0) 2022.03.29
[Java/자바 백준 1781] 컵라면  (0) 2022.03.29
[Java/자바 백준 23290] 마법사 상어와 복제  (0) 2022.03.28
    '알고리즘/문제 풀이' 카테고리의 다른 글
    • [Java/자바 백준 14226] 이모티콘
    • [Java/자바 백준 1504] 특정한 최단 경로
    • [Java/자바 백준 1459] 걷기
    • [Java/자바 백준 1781] 컵라면
    광규니
    광규니
    공부 및 일상 올리기~

    티스토리툴바