코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍
알고리즘/SWEA

[SWEA] 1949번 : 등산로 조성

알고리즘/SWEA

[SWEA] 1949번 : 등산로 조성

2023. 11. 6. 17:06

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PoOKKAPIDFAUq&

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

 


소스코드

import java.io.*;
import java.util.*;

class Solution {
    static int arr[][];
    static int n, k;
    static ArrayList<int[]> al = new ArrayList<>();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;

        int t = Integer.parseInt(br.readLine());

        for (int i = 0; i < t; i++) {
            st = new StringTokenizer(br.readLine());
            n = Integer.parseInt(st.nextToken());
            k = Integer.parseInt(st.nextToken());
            arr = new int[n][n];
            al.clear();

            int max = 0;
            for (int j = 0; j < n; j++) {
                st = new StringTokenizer(br.readLine());
                for (int l = 0; l < n; l++) {
                    arr[j][l] = Integer.parseInt(st.nextToken());
                    if(max < arr[j][l]) max = arr[j][l];
                }
            }

            // 가장 높은 봉우리 저장
            for (int j = 0; j < n; j++) {
                for (int l = 0; l < n; l++) {
                    if(max == arr[j][l]) al.add(new int[]{j, l});
                }
            }

            result = 0;
            for(int[] xy : al) {
                visited = new boolean[n][n];
                visited[xy[0]][xy[1]] = true;
                dfs(xy[0], xy[1], false, 1);
            }

            sb.append("#" + (i + 1) + " " + result + "\n");
        }
        System.out.println(sb);
    }

    static int rx[] = {0, 0, -1, 1};
    static int ry[] = {-1, 1, 0, 0};
    static boolean visited[][];
    static int result = 0;
    static void dfs(int x, int y, boolean flag, int cnt) {
        if(result < cnt) result = cnt;
        for (int i = 0; i < 4; i++) {
            int nx = x + rx[i];
            int ny = y + ry[i];
            // 범위 초과
            if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue;
            // 이미 방문한 봉우리
            if(visited[nx][ny]) continue;
            // 이미 깎은 경우
            if(arr[x][y] <= arr[nx][ny] && flag) continue;

            if(arr[x][y] <= arr[nx][ny]) {
                // 깎아도 못 가는 경우
                if(arr[x][y] <= arr[nx][ny] - k) continue;

                int cur = arr[nx][ny];
                arr[nx][ny] = arr[x][y] - 1; // 깎기

                visited[nx][ny] = true;
                dfs(nx, ny, !flag, cnt + 1);
                visited[nx][ny] = false;

                arr[nx][ny] = cur; // 원복
            }
            else {
                visited[nx][ny] = true;
                dfs(nx, ny, flag, cnt + 1);
                visited[nx][ny] = false;
            }
        }
    }
}

 

해결 방법

  1. 가장 높은 봉우리들의 위치를 저장해 놓는다.
  2. 가장 높은 봉우리에서 DFS 탐색을 진행한다. 이때, 한 번 간 봉우리로 이동할 수 없도록 방문을 판단하는 배열 visited를 둔다.
  3. 낮은 봉우리로 이동하며 길이를 센다.
  4. 현재 봉우리와 높이가 같거나 높은 봉우리를 만나면 공사를 할 수 있는지 판단하고 가능하면 깎고 이동한다.
  5. DFS 탐색을 빠져나올 때마다 visited[][]와 공사된 봉우리를 원복한다.

'알고리즘 > SWEA' 카테고리의 다른 글

[SWEA] 2105번 : 디저트 카페  (0) 2023.11.09
[SWEA] 1953번 : 탈주범 검거  (0) 2023.11.08
[SWEA] 5658번 : 보물상자 비밀번호  (0) 2023.11.06
[SWEA] 16800번 : 구구단 걷기  (0) 2023.11.05
[SWEA] 4615번 : 재미있는 오셀로 게임  (0) 2023.11.05
  • 소스코드
  • 해결 방법
'알고리즘/SWEA' 카테고리의 다른 글
  • [SWEA] 2105번 : 디저트 카페
  • [SWEA] 1953번 : 탈주범 검거
  • [SWEA] 5658번 : 보물상자 비밀번호
  • [SWEA] 16800번 : 구구단 걷기
코딍코딍
코딍코딍
ㅎ2

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.