dfs, 그리디 알고리즘을 사용했다.
우선 어떤 방식이 그리디 알고리즘일까 생각해봤다. 내가 첫번째로 생각한 것은 우측으로 이동하되, (우측 위), (그냥 우측) , (우측 하단) 으로 나누면서,
(1) 우측 위로 이동할 수 있으면 바로 이동.
(2) 우측 위로 이동할 수 없다면 그냥 우측으로 이동
(3) 그냥 우측으로 이동할 수 없다면 우측 하단으로 이동
3가지 방식을 사용했다.
import java.io.*;
import java.util.*;
public class Main {
static char map[][];
static boolean visited[][];
static int yy[]= {-1,0,1};
static int xx[]= {1,1,1};
static int count=0;
static boolean status=false;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb=new StringBuilder();
StringTokenizer st;
st=new StringTokenizer(br.readLine());
int row=Integer.parseInt(st.nextToken());
int col=Integer.parseInt(st.nextToken());
map=new char[row][col];
visited=new boolean[row][col];
for(int i=0;i<row;i++) {
String line=br.readLine();
for(int j=0;j<line.length();j++) {
map[i][j]=line.charAt(j);
}
}
for(int i=0;i<map.length;i++) {
status=false;
dfs(i,0);
}
System.out.println(count);
}
public static void dfs(int y,int x) {
visited[y][x]=true;
if(x==map[0].length-1) {
count++;
status=true;
return;
}
for(int i=0;i<3;i++) {
int nextY=y+yy[i];
int nextX=x+xx[i];
if(status) break;
if(nextY<0||nextX<0||nextY>=map.length||nextX>=map[0].length) continue;
if(visited[nextY][nextX]==true ||map[nextY][nextX]=='x') continue;
dfs(nextY,nextX);
}
}
}
확실히 나는 그래프 이론을 제일 잘한다.. ! 그래프 이론 문제는 골드 2여도 한 50~60 % 확률로 푸는데 다른 그리디 알고리즘은 골드 5여도 쉽게 못풀고 다이나믹 프로그래밍은 실버 문제도 못푸는게 많기도 하고 ... 그래고 골드 2 문제를 내 스스로 그것도 15분만에 풀었다니 뿌듯하다.
문제를 풀고 다른 사람 코드를 몇개 봤는데 432ms 면 굉장히 빠른 속도로 푼 케이스 였다 .
하루에 백준 1문제 이상 푸는 것을 목표로 하고있다.
https://solved.ac/profile/anwlro0212