코테 공부
파이프 옮기기(백준 17070번, 자바)
DaEun_
2023. 1. 15. 18:00
https://www.acmicpc.net/problem/17070
17070번: 파이프 옮기기 1
유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의
www.acmicpc.net
1. 큐 사용
2. 이전 이동 방향이 대각선인 경우 다음으로 이동이 가능한 좌표: (x+1, y), (x,y++1), (x+1,y+1)
위의 세 가지의 pipe 값이 어느것 하나라도 1이라면 이동 불가능하다!!
import java.util.*;
class Solution
{
static int pipe[][];
static Queue<Point> q;
static int N;
static int answer=0;
public static void main(String args[]) throws Exception
{
Scanner sc=new Scanner(System.in);
N=sc.nextInt();
pipe=new int[N][N];
for(int i=0;i<N;i++) {
for(int j=0;j<N;j++) {
pipe[i][j]=sc.nextInt();
}
}
q=new LinkedList<Point>();
q.add(new Point(0,1,1));
while(!q.isEmpty()) {
if(pipe[N-1][N-1]==1) break;
Point p=q.poll();
if(p.x ==N-1 && p.y ==N-1) answer++;
else if(pipe[p.x][p.y]!=1)
check(p.x,p.y,p.direction);
}
System.out.println(answer);
}
static void check(int x, int y, int direction) {
switch(direction) {
case 1:
move_1(x,y);
move_2(x,y);
break;
case 2:
move_1(x,y);
move_2(x,y);
move_3(x,y);
break;
case 3:
move_2(x,y);
move_3(x,y);
break;
}
}
static void move_1(int x, int y) {
if(y<N-1) q.add(new Point(x,y+1,1));
}
static void move_2(int x, int y) {
if(x<N-1 && y<N-1) {
if(pipe[x][y+1]!=1 && pipe[x+1][y]!=1)
q.add(new Point(x+1,y+1,2));
}
}
static void move_3(int x, int y) {
if(x<N-1) q.add(new Point(x+1,y,3));
}
static class Point{
int x;
int y;
int direction;
Point(int x,int y, int direction){
this.x=x;
this.y=y;
this.direction=direction;
}
}
}
2. dp 3차원 배열 이용
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main_17070_파이프옮기기1 {
static int N;
static int[] dx= {0,1,1};
static int[] dy= {1,0,1};
static int[][] d;
static int[][][] dp;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N=Integer.parseInt(br.readLine());
d=new int[N+1][N+1];
dp=new int[N+1][N+1][3];
for(int i=1;i<=N;i++) {
StringTokenizer st=new StringTokenizer(br.readLine());
for(int j=1;j<=N;j++) {
d[i][j]=Integer.parseInt(st.nextToken());
}
}
dp[1][2][0]=1;
for(int i=1;i<=N;i++) {
for(int j=1;j<=N;j++) {
if(d[i][j]==1) {
continue;
}
if(d[i][j-1]!=1)
dp[i][j][0]+=(dp[i][j-1][0]+dp[i][j-1][2]);
if(d[i-1][j]!=1)
dp[i][j][1]+=(dp[i-1][j][1]+dp[i-1][j][2]);
if(d[i][j-1]==0 && d[i-1][j]==0 && d[i-1][j-1]!=1)
dp[i][j][2]+=(dp[i-1][j-1][0]+dp[i-1][j-1][1]+dp[i-1][j-1][2]);
}
}
System.out.println(dp[N][N][0]+dp[N][N][1]+dp[N][N][2]);
}
}
해결하지 못한 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main_17070_파이프옮기기 {
static int N;
static int[] dx= {0,1,1};
static int[] dy= {1,0,1};
static boolean[][] visit;
static Queue<int[]> q;
static int[][] d;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N=Integer.parseInt(br.readLine());
d=new int[N+1][N+1];
visit=new boolean[N+1][N+1];
q=new LinkedList<>();
for(int i=0;i<N;i++) {
StringTokenizer st=new StringTokenizer(br.readLine());
for(int j=0;j<N;j++) {
d[i][j]=Integer.parseInt(st.nextToken());
if(d[i][j]==1) d[i][j]=-1;
}
}
bfs(0,1);
System.out.println(d[N-1][N-1]);
}
static void bfs(int x, int y) {
q.add(new int[] {x,y,1});
d[x][y]=1;
while(!q.isEmpty()) {
int[] num=q.poll();
for(int i=0;i<3;i++) {
if(num[2]==1) {
if(i==1) continue;
}
else if(num[2]==2) {
if(i==0) continue;
}
int nx=num[0]+dx[i];
int ny=num[1]+dy[i];
if(nx<0 || nx>=N || ny<0 || ny>=N) continue;
if(d[nx][ny]==-1) continue;
if(i==2 && (d[nx][ny-1]==-1 || d[nx-1][ny]==-1)) continue;
d[nx][ny]+=1;
q.add(new int[] {nx,ny,i+1});
}
}
}
}