삐까냥의 파도타기

14890번) 경사로 본문

코딩/백준 알고리즘

14890번) 경사로

금손형아 2017. 10. 29. 00:22


.문제 출처 : https://www.acmicpc.net/problem/14890


기출 문제라네요.



import java.util.Scanner;


public class Q14890 {


static int num, L;

static int[][] map;

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

num = sc.nextInt();

map = new int[num][num];

L = sc.nextInt();

for ( int i = 0 ; i < num; i++ ) {

for ( int j = 0; j < num; j++ ) {

map[i][j] =  sc.nextInt();

}

}

int result = 0;

for ( int i = 0 ; i < num; i++ ) {

result += getPossible(i, true);

result += getPossible(i, false);

}

System.out.println(result);

}

static int getPossible(int k, boolean vertical) {

int start = 0, end = 0;

for ( int i = 0; i < num-1; i++ ) {

int now = map[k][i]; //default로 가로 이동

int next = map[k][i+1];

if ( vertical ) { //세로 이동

now = map[i][k];

next = map[i+1][k];

}

if ( now > next ) { //내려간다.

if ( i + L < num && now - 1 == next ) { //경사로 넣을 길이가 있고, 다음 땅이 한칸 내려가면

for ( int j = i + 2; j < i + L + 1; j++ ) { //경사로 길이 만큼 땅이 평평한지 확인

int moreNext = map[k][j];

if ( vertical ) {

moreNext = map[j][k];

}

if ( next != moreNext ) { //경사로 길이 만큼 땅이 평평하지 않으니 갈수 없다.(경사로 못넣음)

return 0;

}

}

start = i+L+1;

end = i+L+1;

continue;

}

return 0;

} else if ( now < next ) { //올라간다.

end = i;

if ( end - start + 1 < L ) { //평평한 땅의 길이가 경사로보다 작으면 갈수 없다.

return 0;

}

start = i + 1;

}

}

return 1;

}

}



변수가 너무 많으면 코딩이 힘들기 때문에,


가로로 가는 방법만 생각하고, 경사로의 길이를 2로 정한 후 1차 코드를 짰습니다.


그 후 세로 방법에도 적용이 되는지 확인 후


경사로 길이를 동적으로 수정했습니다.



 2018년 3월 11일


import java.util.Scanner;

public class Q14890 {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int mapSize = sc.nextInt();

int L = sc.nextInt();

int[][] map = new int[mapSize][mapSize];

for (int i = 0; i < mapSize; i++) {

for (int j = 0; j < mapSize; j++) {

map[i][j] = sc.nextInt();

}

}

solution(mapSize, L, map);

}

static void solution(int mapSize, int L, int[][] map) {

int resultNum = 0;

for (int i = 0; i < mapSize; i++) {

//가로검색

int[] tempMap = map[i].clone();

resultNum += getRoute(mapSize, L, tempMap);

//세로 검색

for (int j = 0; j < mapSize; j++) {

tempMap[j] = map[j][i];

}

resultNum += getRoute(mapSize, L, tempMap);

}

System.out.println(resultNum);

}

static int getRoute(int mapSize, int L, int[] searchMap) {

int preHeight = searchMap[0];

int helperEndPosition = -1; //발판의 마지막 위치

for (int j = 1; j < mapSize; j++) {

int nowHeight = searchMap[j];

if (preHeight == nowHeight) { //수평이다. -> 그냥 패스

continue;

} else if (preHeight - 1 == nowHeight) { //내려간다. -> 이후 검사

int maxL = j + L - 1;

if (maxL < mapSize) { //발판 사용 가능 여부 확인

for (int k = j + 1; k <= maxL; k++) {

if (nowHeight != searchMap[k]) {

return 0;

}

}

helperEndPosition = maxL;

j = maxL;

preHeight = nowHeight;

continue;

}

} else if (preHeight + 1 == nowHeight) { //올라간다. -> 이전 검사

int minL = j - L;

if ( 0 <= minL && helperEndPosition < minL) { //발판 사용 가능 여부 확인

for (int k = minL; k < j; k++) {

if (preHeight != searchMap[k]) {

return 0;

}

}

helperEndPosition = j - 1;

preHeight = nowHeight;

continue;

}

}

return 0;

}

return 1;

}

}


'코딩 > 백준 알고리즘' 카테고리의 다른 글

11654번) 아스키 코드  (0) 2017.11.11
1152번) 단어의 개수  (0) 2017.11.11
14889번) 스타트와 링크  (0) 2017.10.28
1507번) 궁금한 민호  (0) 2017.10.28
5567번) 결혼식 - 그래프  (0) 2017.10.28