티스토리 뷰

문제풀이/백준

14890. 경사로

BiteSnail 2024. 1. 17. 11:05

문제 개요

세로줄과 가로줄의 문제의 조건을 만족하는 경사로의 개수를 찾는 문제입니다.

문제 접근

구현문제입니다. 이 문제를 풀면서 다시한번 구현이 약하다는 것을 느꼈습니다. 단순 구현문제 같은데 사소한 실수가 많아서 테스트를 성공하지 못한 경우가 많았습니다. 핵심은 문제의 조건을 잘 이해하고 이에 맞도록 구현하는 것이라고 생각합니다.

코드

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

public class Main {
    static int N;
    static int L;
    static int[][] map;

    static void input() throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String[] firstLine = bf.readLine().split(" ");
        N = Integer.parseInt(firstLine[0]);
        L = Integer.parseInt(firstLine[1]);
        map = new int[N][];
        for(int i=0;i<N;i++){
            map[i] = Arrays.stream(bf.readLine().split(" "))
                            .mapToInt(Integer::parseInt)
                            .toArray();
        }
    }

    static boolean isVecticalOk(int i){
        int cur = map[0][i];
        int size = 1;
        for(int j=1;j<N;j++){
            if(map[j][i] - cur == 0){
                size++;
                continue;
            }
            if(map[j][i] - cur == 1){
                if(size < L){
                    return false;
                }
                cur = map[j][i];
                size = 1;
                continue;
            }
            if(map[j][i] - cur == -1){
                for(int k=0; k<L;k++){
                    if(j+k >= N){
                        return false;
                    }
                    if(map[j][i] != map[j+k][i]){
                        return false;
                    }
                }
                cur = map[j][i];
                j += L-1;
                size = 0;
                continue;
            }
            return false;
        }
        return true;
    }

    static boolean isHorizontalOk(int i){
        int cur = map[i][0];
        int size = 1;
        for(int j=1;j<N;j++){
            if(map[i][j] - cur == 0){
                size++;
                continue;
            }
            if(map[i][j] - cur == 1){
                if(size < L){
                    return false;
                }
                cur = map[i][j];
                size = 1;
                continue;
            }
            if(map[i][j] - cur == -1){
                for(int k=0; k<L;k++){
                    if(j+k >= N){
                        return false;
                    }
                    if(map[i][j] != map[i][j+k]){
                        return false;
                    }
                }
                cur = map[i][j];
                j += L-1;
                size = 0;
                continue;
            }
            return false;
        }
        return true;
    }

    static void process(){
        int result = 0;
        for(int i=0;i<N;i++){
            if(isVecticalOk(i)){
                result++;
            }
            if(isHorizontalOk(i)){
                result++;
            }
        }

        System.out.println(result);
    }

    public static void main(String[] args) throws IOException {
        input();
        process();
    }
}

문제

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

'문제풀이 > 백준' 카테고리의 다른 글

15685. 드래곤 커브  (0) 2024.01.19
15684. 사다리 조작  (0) 2024.01.18
15683. 감시  (0) 2024.01.16
14502. 연구소  (0) 2024.01.15
16234. 인구 이동  (1) 2024.01.14
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함