프로그래밍공부/알고리즘
코딩테스트-알고리즘-등굣길
중랑구보안관
2020. 8. 6. 11:11
프로그래머스 코딩테스트 등굣길을 풀어봤다.
문제는 아래와 같다.
https://programmers.co.kr/learn/courses/30/lessons/42898
코딩테스트 연습 - 등굣길
계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 m x n 크기의 격자모양으로 나타낼 수 있습니다. 아래 그림은 m =
programmers.co.kr
배열을 순회하면서 위에꺼와 왼쪽꺼를 더해주면 쉽게 풀 수 있는 문제이다.
아래는 제가 짠 코드입니다.
public class 등굣길 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] puddles ={{2, 2}};
System.out.println("answer : "+solution(4,3,puddles));
}
//n은 세로길이(y) m은 가로길이(x)
public static int solution(int m, int n, int[][] puddles) {
int answer = 0;
//길의 개수를 저장할 변수
int[][] retArr=new int[n][m];
//1으로 배열 초기화 단 장애물 있는 부분만 0으로 초기화
initArr(retArr,puddles);
for(int y=0;y<n;++y) {
for(int x=0;x<m;++x) {
//맨처음 지점은 패스 || 장애물지점도 패스
if( (y==0 && x==0) || retArr[y][x]==0) {
continue;
}else if(y==0) {
//맨 윗줄의 경우 내자리뒤에있는것만 가지고오면 된다.
//더하는 것이 아님!
retArr[y][x]=retArr[y][x-1];
}else if(x==0) {
//맨 왼쪽줄의 경우도 마찬가지.위에꺼를 그냥 가져오면 된다.
retArr[y][x]=retArr[y-1][x];
}else {
//중간줄의 경우 내자리 = 위에꺼 + 왼쪽꺼
//찾은게 int값을 넘을수도 있어서 1000000007로 나눈나머지를 넣어줘야 효율성테스트에서 통과됨.
retArr[y][x]=(retArr[y-1][x]+retArr[y][x-1])%1000000007;
}
}
printArr(retArr);
System.out.println();
}
answer = retArr[n-1][m-1];
return answer;
}
public static void initArr(int[][] arr,int[][] puddles) {
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr[i].length;j++) {
arr[i][j]=1;
}
}
//물에잠긴지역이 있을 경우 해당 부분만 0으로 초기화
if(puddles.length>0)
for(int i=0;i<puddles.length;i++) {
//장애물이 있는 지점
int x = puddles[i][0]-1;
int y = puddles[i][1]-1;
//x y 바뀌지 않도록 주의.
arr[y][x]=0;
}
}
public static void printArr(int[][] arr) {
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr[i].length;j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
가로축,세로축 햇갈리지 않는게 첫번째로 중요하고
두번째는 조건에따라 위에꺼와 왼쪽꺼 길찾은 것을 더해 저장하는 것입니다.
그리고 효율성 테스트를 위해 배열에 값을 저장할 때 1000000007로 나눈 나머지를 저장해야합니다.
(이 부분은 제가 찾아본 결과 길을 찾은 개수가 int값을 넘을 수 있어서 1000000007나눈 나머지를 저장해야 한다고 합니다. 실제 이 부분이 있어야 효율성테스트에서 통과가 되고, 실행시간도 약 절반가량 줄어들었습니다.)
-끝-