[level 3] 아이템 줍기 - 87694

2024. 11. 13. 16:55·코딩테스트/프로그래머스

[level 3] 아이템 줍기 - 87694

문제 링크

성능 요약

메모리: 77.1 MB, 시간: 1.51 ms

구분

코딩테스트 연습 > 깊이/너비 우선 탐색(DFS/BFS)

채점결과

정확성: 100.0
합계: 100.0 / 100.0

제출 일자

2024년 11월 13일 16:32:14

문제 설명

다음과 같은 다각형 모양 지형에서 캐릭터가 아이템을 줍기 위해 이동하려 합니다.

rect_1.png

지형은 각 변이 x축, y축과 평행한 직사각형이 겹쳐진 형태로 표현하며, 캐릭터는 이 다각형의 둘레(굵은 선)를 따라서 이동합니다.

만약 직사각형을 겹친 후 다음과 같이 중앙에 빈 공간이 생기는 경우, 다각형의 가장 바깥쪽 테두리가 캐릭터의 이동 경로가 됩니다.

rect_2.png

단, 서로 다른 두 직사각형의 x축 좌표 또는 y축 좌표가 같은 경우는 없습니다.

rect_4.png

즉, 위 그림처럼 서로 다른 두 직사각형이 꼭짓점에서 만나거나, 변이 겹치는 경우 등은 없습니다.

다음 그림과 같이 지형이 2개 이상으로 분리된 경우도 없습니다.

rect_3.png

한 직사각형이 다른 직사각형 안에 완전히 포함되는 경우 또한 없습니다.

rect_7.png

지형을 나타내는 직사각형이 담긴 2차원 배열 rectangle, 초기 캐릭터의 위치 characterX, characterY, 아이템의 위치 itemX, itemY가 solution 함수의 매개변수로 주어질 때, 캐릭터가 아이템을 줍기 위해 이동해야 하는 가장 짧은 거리를 return 하도록 solution 함수를 완성해주세요.

제한사항
  • rectangle의 세로(행) 길이는 1 이상 4 이하입니다.
  • rectangle의 원소는 각 직사각형의 [좌측 하단 x, 좌측 하단 y, 우측 상단 x, 우측 상단 y] 좌표 형태입니다.
    • 직사각형을 나타내는 모든 좌표값은 1 이상 50 이하인 자연수입니다.
    • 서로 다른 두 직사각형의 x축 좌표, 혹은 y축 좌표가 같은 경우는 없습니다.
    • 문제에 주어진 조건에 맞는 직사각형만 입력으로 주어집니다.
  • charcterX, charcterY는 1 이상 50 이하인 자연수입니다.
    • 지형을 나타내는 다각형 테두리 위의 한 점이 주어집니다.
  • itemX, itemY는 1 이상 50 이하인 자연수입니다.
    • 지형을 나타내는 다각형 테두리 위의 한 점이 주어집니다.
  • 캐릭터와 아이템의 처음 위치가 같은 경우는 없습니다.

  • 전체 배점의 50%는 직사각형이 1개인 경우입니다.
  • 전체 배점의 25%는 직사각형이 2개인 경우입니다.
  • 전체 배점의 25%는 직사각형이 3개 또는 4개인 경우입니다.

입출력 예
rectangle characterX characterY itemX itemY result
[[1,1,7,4],[3,2,5,5],[4,3,6,9],[2,6,8,8]] 1 3 7 8 17
[[1,1,8,4],[2,2,4,9],[3,6,9,8],[6,3,7,7]] 9 7 6 1 11
[[1,1,5,7]] 1 1 4 7 9
[[2,1,7,5],[6,4,10,10]] 3 1 7 10 15
[[2,2,5,5],[1,3,6,4],[3,1,4,6]] 1 4 6 3 10
입출력 예 설명

입출력 예 #1

rect_5.png

캐릭터 위치는 (1, 3)이며, 아이템 위치는 (7, 8)입니다. 위 그림과 같이 굵은 선을 따라 이동하는 경로가 가장 짧습니다.

입출력 예 #2

rect_6.png

캐릭터 위치는 (9, 7)이며, 아이템 위치는 (6, 1)입니다. 위 그림과 같이 굵은 선을 따라 이동하는 경로가 가장 짧습니다.

입출력 예 #3

rect_8.png

캐릭터 위치는 (1, 1)이며, 아이템 위치는 (4, 7)입니다. 위 그림과 같이 굵은 선을 따라 이동하는 경로가 가장 짧습니다.

입출력 예 #4, #5

설명 생략


 

테두리만 이동할 수 있는 공간으로 분류한다면 일반적인 탐색 문제와 동일하다

 

테두리를 분류하는 방법

  1. 사각형의 좌표가 1만큼 차이난다면 테두리를 구분할 수 없으므로 두배 늘린 공간에서 작업을 진행한다


  2. 주어진 사각형의 공간만큼 이동할 수 있는 공간으로 분류한다
  3. 주어진 사각형에서 테두리를 제외한 공간만큼 이동할 수 없는 공간으로 분류한다

 

import java.util.*;

class Solution {
    public int solution(int[][] rectangle, int characterX, int characterY, int itemX, int itemY) {
        int answer = 0;
        int[][] map = new int[101][101];
        boolean[][] visited = new boolean[101][101];
        
        for(int i=0; i<rectangle.length; i++){
            int sx = rectangle[i][0] * 2;
            int sy = rectangle[i][1] * 2;
            int ex = rectangle[i][2] * 2;
            int ey = rectangle[i][3] * 2;
            
            // 테두리를 포함한 사각형 구간만큼 1로 변경
            for(int j=sy; j<=ey; j++){
                for(int k=sx; k<=ex; k++){
                    map[j][k] = 1;
                }
            }
        }
        
        for(int i=0; i<rectangle.length; i++){
            int sx = rectangle[i][0] * 2;
            int sy = rectangle[i][1] * 2;
            int ex = rectangle[i][2] * 2;
            int ey = rectangle[i][3] * 2;
            
            // 테두리를 포함하지 않은 사각형 구간만큼 0으로 변경
            for(int j=sy + 1; j<ey; j++){
                for(int k=sx + 1; k<ex; k++){
                    map[j][k] = 0;
                }
            }
        }
        
        Queue<int[]> q = new LinkedList<>();
        
        int[] dy = {1,-1,0,0};
        int[] dx = {0,0,1,-1};
        
        q.offer(new int[]{characterY * 2, characterX * 2, 0});
        visited[characterY * 2][characterX * 2] = true;
        
        while(!q.isEmpty()){
            int[] arr = q.poll();
            if(itemY * 2 == arr[0] && itemX * 2 == arr[1])
                return arr[2]/2;
            
            for(int i=0; i<4; i++){
                int ny = arr[0] + dy[i];
                int nx = arr[1] + dx[i];
                if(ny>=0 && ny<=100 && nx>=0 && nx<=100 &&!visited[ny][nx] && map[ny][nx] == 1) {
                    visited[ny][nx] = true;
                    q.offer(new int[]{ny,nx,arr[2] + 1});
                }
            }
        }
        return -1;
    }
}

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

[level 2] 땅따먹기 - 12913  (3) 2024.11.24
[level 3] 가장 먼 노드 - 49189  (1) 2024.11.18
[level 3] 섬 연결하기 - 42861  (0) 2024.11.13
[level 3] 등굣길 - 42898  (0) 2024.11.12
[level 3] 다단계 칫솔 판매 - 77486  (0) 2024.11.08
'코딩테스트/프로그래머스' 카테고리의 다른 글
  • [level 2] 땅따먹기 - 12913
  • [level 3] 가장 먼 노드 - 49189
  • [level 3] 섬 연결하기 - 42861
  • [level 3] 등굣길 - 42898
mint723dev
mint723dev
mint723dev 님의 블로그 입니다.
  • mint723dev
    mint723dev 님의 블로그
    mint723dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (88)
      • Computer Science (16)
        • Computer Architecture (0)
        • Data Structure (2)
        • Database (4)
        • Network (4)
        • Operating System (6)
        • Software Engineering (0)
      • Java (6)
      • 자료 구조 (0)
      • 코딩테스트 (62)
        • LeetCode (1)
        • 프로그래머스 (29)
        • 백준 (32)
      • Spring (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DP
    DFS
    deque
    오블완
    BFS
    JVM
    탐욕법
    티스토리챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
mint723dev
[level 3] 아이템 줍기 - 87694
상단으로

티스토리툴바