코딩테스트 연습 | 프로그래머스 스쿨
개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!
school.programmers.co.kr
구해야할 것
등굣길의 가짓수 -> 문제 훑고 최단거리라고 착각하지 말자. 그렇다면 DFS를 쓸 이유도, DP를 사용할 이유도 없다.
접근 방법
얼핏 보면 DFS/BFS문제 같다.
이 문제는 경로의 가짓수이므로 BFS를 제외한다.
BFS를 제외한다면, 분명하게 DFS이다.
그렇지만 여기서 나는 1000000007로 나누라는 불안한 조건을 보았고,
DP로 꺾었다.
(근데 어차피 이 흐름 없어도 문제의 최상단에는 DP라고 떡 박혀있긴 하다)
관건은 DP를 어떻게 적용할 것인가?
이건 굉장히 간단한데, 결국 어떤 (row,col)에서 경로의 가짓수는 오른쪽과 아래쪽으로밖에 갈 수 없다는 문제의 조건 상 (row-1,col)+(row,col-1)일 수밖에 없다.
이걸 이중 for문으로 사용한다면 memoization을 채워나가면 끝
아래는 코드 전문이다.
import java.util.*;
import java.awt.*;
class Solution {
private static int answer;
private static boolean[][] hazards;
private static int[][] memo;
public int solution(int m, int n, int[][] puddles) {
answer = 0;
hazards=new boolean[n][m];
memo=new int[n][m];
for(int[] puddle:puddles){
hazards[puddle[1]-1][puddle[0]-1]=true;
}
for(int row=0;row<n;row++){
for(int col=0;col<m;col++){
if(row==0&&col==0){
memo[row][col]=1;
} else if(row==0&&!hazards[row][col]){
memo[row][col]+=memo[0][col-1]%1000000007;
} else if(col==0&&!hazards[row][col]){
memo[row][col]+=memo[row-1][0]%1000000007;
} else if(!hazards[row][col]){
memo[row][col]=(memo[row-1][col]+memo[row][col-1])%1000000007;
}
}
}
return memo[n-1][m-1]%1000000007;
}
}
문제 후기
그지같은 문제다.
(행,열)이라는 Streotype을 버리고 (열,행)으로 조건을 줘서 사람을 헷갈리게 만드냐
반응형
'Algorithm' 카테고리의 다른 글
프로그래머스 : 숫자 게임 (1) | 2025.06.23 |
---|---|
프로그래머스 : 단어변환 (0) | 2025.06.23 |
프로그래머스 : 정수 삼각형 (0) | 2025.06.07 |
프로그래머스(Programmers) : 이중 우선순위 큐 (0) | 2025.05.29 |
프로그래머스(Programmers) : 네트워크 (1) | 2025.05.29 |