티스토리 뷰
https://www.acmicpc.net/problem/21922
21922번: 학부 연구생 민상
첫 번째 줄에는 연구실의 크기가 세로 $N(1 \le N \le 2,000)$, 가로 $M(1 \le M \le 2,000)$ 순으로 주어진다. 두 번째 줄부터 $N + 1$ 줄까지 연구실 내부 구조 정보를 알려주는 값 $M$개가 주어진다. $1,2,3,4$
www.acmicpc.net

문제
학부 연구생으로 새로 연구실에 들어온 민상이는 사용할 자리를 정하려고 한다.
연구실은 격자 모양으로 되어있고 에어컨에서 바람이 상,하,좌,우 4방향으로 분다. 물론 에어컨이 위치한 곳에도 바람이 분다.
민상이는 더위를 많이 타서 에어컨 바람이 지나가는 곳 중 하나를 선택하여 앉으려고 한다.
연구실에는 다양한 물건들이 있어 바람의 방향을 바꾼다.
연구실에 있는 물건의 종류는 총 4가지가 있다. 아래 화살표의 의미는 바람이 각 물건에서 바람의 이동을 표시한 것이다.


연구실 어디든 민상이가 앉을 수 있는 자리이다. 즉 에어컨이 위치한 자리와 물건이 있는 자리 모두 앉을 수 있다.
민상이가 원하는 자리는 몇 개 있는지 계산해주자.
유형 : DFS + 구현
접근 방식
- 각 격자에 맞게 방향을 바꿀 수 있게 메소드를 만든다.
- 방문 배열을 3차원으로 설정한다.
전체 코드
import java.util.*;
import java.io.*;
public class Main {
static int n = 0;
static int m = 0;
static int[][] board;
// U - R - D - L
static int[] dx = {-1,0,1,0};
static int[] dy = {0,1,0,-1};
static boolean[][][] v;
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine()," ");
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
board = new int[n+1][m+1];
v = new boolean[n+1][m+1][4];
for(int i=1;i<=n;i++){
st = new StringTokenizer(bf.readLine()," ");
for(int j=1;j<=m;j++){
board[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(board[i][j] == 9){
for(int k=0;k<4;k++){
v[i][j][k] = true;
move(i,j,k);
}
}
}
}
int count = 0;
for(int i=1;i<=n;i++) {
for (int j = 1; j <= m; j++) {
if(v[i][j][0] || v[i][j][1] || v[i][j][2] || v[i][j][3]){
count += 1;
}
}
}
System.out.println(count);
bf.close();
}
static void move(int x,int y,int dir){
int nx = x + dx[dir];
int ny = y + dy[dir];
if(nx < 1 || nx > n || ny < 1 || ny > m)
return;
if(board[nx][ny] == 1){
dir = first(dir);
if(v[nx][ny][dir]){
return;
}
v[nx][ny][dir] = true;
}else if(board[nx][ny] == 2){
dir = second(dir);
if(v[nx][ny][dir]){
return;
}
v[nx][ny][dir] = true;
}else if(board[nx][ny] == 3){
dir = third(dir);
if(v[nx][ny][dir]){
return;
}
v[nx][ny][dir] = true;
}else if(board[nx][ny] == 4){
dir = four(dir);
if(v[nx][ny][dir]){
return;
}
v[nx][ny][dir] = true;
}else if(board[nx][ny] == 0){
if(v[nx][ny][dir]){
return;
}
v[nx][ny][dir] = true;
}
move(nx,ny,dir);
}
// U - R - D - L
static int first(int dir){
if(dir == 0 || dir == 2)
return dir;
if(dir == 1)
return 3;
return 1;
}
// U - R - D - L
static int second(int dir){
if(dir == 1 || dir == 3)
return dir;
if(dir == 0)
return 2;
return 0;
}
// U - R - D - L
static int third(int dir){
if(dir == 0){
return 1;
}else if(dir == 1){
return 0;
}else if(dir == 2){
return 3;
}
return 2;
}
// U - R - D - L
static int four(int dir){
if(dir == 0){
return 3;
}else if(dir == 1){
return 2;
}else if(dir == 2){
return 1;
}
return 0;
}
}'알고리즘 > 백준' 카테고리의 다른 글
| 백준 17244 (아맞다우산) - java (1) | 2023.12.13 |
|---|---|
| 백준 18231 (파괴된 도시) - java (0) | 2023.12.12 |
| 백준 17845 (수강 과목) - java (0) | 2023.11.29 |
| 백준 2307 (도로 검문) - java (0) | 2023.11.29 |
| 백준 14728 (벼락치기) - java (0) | 2023.11.28 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백준 #1325 #효율적인 해킹
- 백준 #28140 #빨강~ 빨강~ 파랑! 파랑! 달콤한 솜사탕! #java #자바
- 백준 #17940 #주식 #자바 #java
- 백준 #1584 #게임 #java #자바
- 백준 #15686 #치킨 배달
- 백준 #25603 #짱해커 이동식 #java #자바
- Java
- 백준 #4963 #섬의 개수
- 백준 #치즈 #2638
- 자바 #JAVA
- 백준 #14863 #서울에서 경산까지 #java #자바
- 백준
- 백준 #18405 #경쟁적 전염
- 백준 #1987 #알파벳 #자바 #java
- 백준 #
- 백준 #2580 #스도쿠
- 백준 #13549 #숨바꼭질3
- 백준 #다리 만들기 #2146
- 행복합시다.
- 17218
- 17394
- 백준 #인구 이동 #16234
- 백준 #1759 #암호 만들기
- 백준 #16973 #직사각형 탈출
- 백준 #12014 #주식 #자바 #java
- 올해보다
- 백준 #3980 #선발 명단
- 자바
- 백준 #5721 #사탕 줍기 대회 #java #자바
- 백준 #2636 #치즈
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
글 보관함