250x250
250x250
JinSeopKim
Hello World!
JinSeopKim
전체 방문자
오늘
어제
  • 분류 전체보기 (168)
    • Artificial intelligence (14)
      • DeepDiveToAI (3)
      • Pytorch (3)
      • Etc (8)
    • Back-end (19)
      • Spring (10)
      • JPA (9)
    • Language (24)
      • Python (3)
      • Java (11)
      • Swift (10)
    • Math (4)
      • Linear Algebra (4)
    • CodingTest (79)
      • Algolithm (12)
      • Backjoon (25)
      • Programmers (42)
    • Etc (27)
      • Book Review (3)
      • Adsp (6)
      • Life (2)
      • Docker (1)
      • odds and ends (15)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • GitHub

인기 글

태그

  • java
  • Python
  • JPA
  • 파이썬
  • AI
  • swift
  • uArm
  • 알고리즘
  • BOJ
  • 백준
  • data
  • BFS
  • 개발
  • ios
  • ADsP
  • Front-end
  • 구현
  • JAVA8
  • 머신러닝
  • 코딩테스트
  • 개발자
  • DP
  • 카카오
  • SpringMVC
  • 브루트포스
  • 선형대수
  • certificate
  • 문제풀이
  • 프로그래머스
  • 자바

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
JinSeopKim

Hello World!

[BOJ_14890] 경사로 (java)
CodingTest/Backjoon

[BOJ_14890] 경사로 (java)

2021. 12. 21. 22:58
728x90
728x90

문제링크

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

 

14890번: 경사로

첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.

www.acmicpc.net

문제풀이

👨🏻‍💻 핵심 스킬 👨🏻‍💻
 구현,사고

경사로 문제를 해결하기 위해서 경사로의 조건을 충분히 이해하고 구현해주어야 합니다.

출처 - https://www.acmicpc.net/problem/14890

위 경우는 경사로에 놓을 수 있는 경우들을 의미합니다. 문제에서 제시되는 경사로의 길이만큼 충분히 같은 수의 길이 있을 경우 경사로를 놓을 수 있으며 경사로를 놓을 때는 항상 1만 차이가 나야합니다.

출처 - https://www.acmicpc.net/problem/14890

위 경우는 경사로에 놓을 수 없는 경우입니다. 높이 차이가 2 이상인 경우 경사로를 놓을 수 없으며, 경사로를 겹쳐서 놓을 수 없습니다.

 

위 조건을 고려하여 &n*n& 배열에서 길을 찾아야합니다. 길이 시작하는 부분부터 앞으로 하나하나 나아가며 문제를 해결할 수 있습니다.

그 다음의 위치의 값이 같거나, 1 작거나, 1 크거나에 따라 구분하여 구현을 해주면 됩니다.

 

만약 같은 경우는 경사로를 놓을 길 한개가 추가 되었다고 생각해주면 됩니다.

 

만약 앞으로 나아간 길이 1 큰 경우 그동안 지나간 길을 보고 경사로를 놓을만큼 길이 충분히 긴지 확인하여줍니다.

 

만약 앞으로 나아간 길이 1이 작은 경우는 내려가는 경사로를 놓을 수 있는지 그 다음길들을 검사하여주면 됩니다.

 

구현코드

package backjoon_14890;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int l = sc.nextInt();
        int[][] map = new int[n][n];

        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                map[i][j] = sc.nextInt();
            }
        }

        int roadCount = 0;

        //가로 확인
        for(int i = 0; i < n; i++){
            int[] road = map[i];
            if(isRoad(road,l)) {
                roadCount += 1;
            }
        }

        //세로 확인
        for(int i = 0; i < n; i++){
            int[] road = new int[n];
            for(int j = 0; j < n; j++){
                road[j] = map[j][i];
            }
            if(isRoad(road,l)) {
                roadCount += 1;
            }
        }

        System.out.println(roadCount);
    }

    public static boolean isRoad(int[] road, int l){
        int equalCount = 1;
        int prev = road[0];
        int i = 1;
        for(;i< road.length; i++){
            if(road[i] == prev)
                equalCount++;
            else if(road[i] > prev && road[i]-1 == prev){
                if(equalCount < l)
                    break;
                prev = road[i];
                equalCount = 1;
            }
            else if(road[i] < prev && road[i]+1 == prev && i+l-1 < road.length){
                int j = 0;
                for(; j < l; j++){
                    if(road[i+j] != road[i])
                        break;
                }
                if(j != l)
                    break;
                i = i+l-1;
                prev = road[i];
                equalCount = 0;
            }
            else{
                break;
            }
        }
        return i == road.length;
    }
}

 

시간복잡도

길인지 한번 확인하는 방법은 2차원 배열중 한 줄만 확인하기 때문에 $O(n)$이 됩니다.

그리고 한줄짜리 배열이 총 $2n$개 있으므로  시간복잡도는 $O(n^2)이 됩니다.

728x90
728x90
저작자표시 비영리 변경금지 (새창열림)

'CodingTest > Backjoon' 카테고리의 다른 글

[BOJ_15685] 드래곤 커브 (Java)  (0) 2021.12.29
[BOJ_15662] 톱니바퀴 ( java)  (0) 2021.12.22
[BOJ_14499] 주사위 굴리기 (java)  (0) 2021.12.21
[BOJ_14226] 이모티콘 (java)  (0) 2021.12.18
[BOJ_14226] 이모티콘 (java)  (0) 2021.12.18
    'CodingTest/Backjoon' 카테고리의 다른 글
    • [BOJ_15685] 드래곤 커브 (Java)
    • [BOJ_15662] 톱니바퀴 ( java)
    • [BOJ_14499] 주사위 굴리기 (java)
    • [BOJ_14226] 이모티콘 (java)
    JinSeopKim
    JinSeopKim
    기록📚

    티스토리툴바