📌 고정 게시글

📢 공지합니다

이 게시글은 메인 페이지에 항상 고정되어 표시됩니다.

최코딩의 개발

[백준 14890번] 경사로 본문

코딩테스트/백준

[백준 14890번] 경사로

seung_ho_choi.s 2025. 5. 19. 23:37
728x90

https://www.acmicpc.net/problem/14890

package implement;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Implement14890 {
    static int N;

    static int L;

    static int[][] map;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        L = Integer.parseInt(st.nextToken());

        map = new int[N][N];

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        int result = solution();
        System.out.println(result);

    }

    private static int solution() {
        int answer = 0;

        // 가로 줄 체크
        for (int i = 0; i < N; i++) {
            int[] row = new int[N];
            for (int j = 0; j < N; j++) {
                row[j] = map[i][j];
            }
            if (check(row)) {
                answer++;
            }
        }

        // 세로 줄 체크
        for (int i = 0; i < N; i++) {
            int[] col = new int[N];
            for (int j = 0; j < N; j++) {
                col[j] = map[j][i];
            }
            if (check(col)) {
                answer++;
            }
        }

        return answer;
    }

    private static boolean check(int[] line) {
        boolean[] visit = new boolean[N];
        for (int i = 0; i < N - 1; i++) {
            int diff = line[i + 1] - line[i];
            // 같을때 넘기기
            if (diff == 0) {
                continue;
            }
            // 양수 오르막길
            else if (diff == 1) {
                for (int j = 0; j < L; j++) {
                    int idx = i - j;
                    if (idx < 0  || line[i] != line[idx] || visit[idx]) {
                        return false;
                    }
                    visit[idx] = true;
                }
            }
            // 음수 내리막길
            else if (diff == -1) {
                for (int j = 0; j < L; j++) {
                    int idx = i + j + 1;
                    if (idx >=N  || line[i+1] != line[idx] || visit[idx]) {
                        return false;
                    }
                    visit[idx] = true;
                }

            }
            // 차이가 2 이상이면 false
            else {
                return false;
            }
        }

        return true;
    }

}

 

 

diff 차를 구해 1이면 오르막길, -1이면 내리막길로 나눠 경우를 처리하면 된다. 오르막길일 경우, 현재 위치 기준으로 이전 위치들이 같은 높이인지, 그리고 이미 경사로가 설치되지 않았는지(방문 여부)를 조건으로 확인하면 되고, 내리막길은 반대로 현재 위치에서 +1, +2 위치를 기준으로 같은 방식으로 확인하면 된다.

 

골드3이지만 비교적 단순한 구현 문제... 더 분발해야겠다.

728x90

'코딩테스트 > 백준' 카테고리의 다른 글

[백준 14500번] 테트로미노  (0) 2025.05.18
[백준 12100번] 2048(Easy)  (0) 2025.05.16
[백준 14719번] 빗물  (0) 2025.05.15
[백준 11066번] 파일 합치기  (0) 2025.05.12
[백준 3190번] 뱀  (0) 2025.04.01