코딩연습

(C#) 아이템 줍기

Realuda72 2025. 5. 28. 17:40

코딩테스트 연습 - 아이템 줍기 | 프로그래머스 스쿨

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

입력된 사각형들로 지도를 만들고, 길을 찾는 문제

 

세 단계로 진행했다.

1. 입력된 사각형들로 지도 만들기

- 입력된 사각형의 내부를 모두 1로 채운다

2. 지도를 가공하기

- 만들어진 지도에서 내부의 1을 모두 0으로 바꾼다

3. 지도에서 길찾기

 

핵심 아이디어는 지도를 만들 때 원래 좌표에 2배를 해주는 것이다.

왼쪽은 2배를 하지 않은 지도이고, 오른쪽은 2배를 한 지도다.

왼쪽 지도에서 파란 칸에서 빨간 칸으로 이동하는 길을 찾을 때, 원래는 초록색 경로로 가야한다.

그런데 1이 서로 인접해있으므로 노란색 경로를 따라가게 된다.

좌표를 2배수를 해주면 이런 일을 방지할 수 있다.

 

코드

using System;
using System.Collections.Generic;

public class Solution {
    public int solution(int[,] rectangle, int characterX, int characterY, int itemX, int itemY) {
        int answer = 0;
        int[,] coordinate = new int[102, 102];
        
        // 초기 지도
        for(var i = 0; i < rectangle.GetLength(0); i++){
            var min_x = rectangle[i, 0];
            var min_y = rectangle[i, 1];
            var max_x = rectangle[i, 2];
            var max_y = rectangle[i, 3];
            for(var m = min_x * 2; m <= max_x * 2; m++){
                for(var n = min_y * 2; n <= max_y * 2; n++){
                    coordinate[m, n] = 1;
                }
            }
        }
        
        int[,] temp = new int[102, 102];
        int[] dx = {-1, 0, 1, 0};
        int[] dy = {0, -1, 0, 1};
        // 지도 가공
        for(var i = 2; i < 101; i++){
            for(var j = 2; j < 101; j++){
                // 1
                bool flag = false;
                for(var x = 0; x < dx.Length; x++){
                    for(var y = 0; y < dy.Length; y++){
                        if(coordinate[i + dx[x], j + dy[y]] == 0){
                            flag = true;
                            break;
                        }
                    }
                    if(flag) break;
                }
                if(flag) {
                    temp[i, j] = coordinate[i, j];
                    continue;
                }
                temp[i, j] = 0;
            }
        }
        
        // 길찾기
        var _x = characterX * 2;
        var _y = characterY * 2;
        var queue = new Queue<(int x, int y, int distance)>();
        var visited = new List<(int x, int y)>();
        queue.Enqueue((_x, _y, 0));
        visited.Add((_x, _y));

        while(queue.Count != 0){
            var current = queue.Dequeue();
            if(current.x == 2*itemX && current.y == 2*itemY){
                return current.distance / 2;
            }
            for(var i = 0; i < dx.Length; i++){
                for(var j = 0; j < dy.Length; j++){
                    if(temp[current.x + dx[i], current.y + dy[i]] == 1 && !visited.Contains((current.x + dx[i], current.y + dy[i]))){
                        queue.Enqueue((current.x + dx[i], current.y + dy[i], current.distance + 1));
                        visited.Add((current.x + dx[i], current.y + dy[i]));
                    }
                }
            }
        }
        return answer;
    }
}

 

결과

 

'코딩연습' 카테고리의 다른 글

(javascript) 사칙연산  (0) 2025.06.01
(C#) 풍선 터트리기  (0) 2025.05.28
(C#)순위  (0) 2025.05.23
(javascript) 추석 트래픽  (0) 2025.05.16
(javascript) 최고의 집합  (0) 2025.05.13