본문 바로가기
알고리즘/알고리즘 설명

20230904 [Java] 문제풀이

by JayAlex07 2023. 9. 8.

20230904 [Java] 문제풀이

 

[프로그래머스] 거리두기 확인하기

 

P들의 위치를 찾고, P들을 비교를 한다

  • 먼저 맨해튼의 거리를 비교한다
  • 2 이하면, 두 개의 P들이 가로 또는 세로 상에 있으면
    • 1맨해튼 거리가 1이면, 거리두기를 못 하는 것
    • 2맨해튼 거리인데, 중간에 패티션이 없으면 거리두기를 못 하는 것
  • 대각선에 있으면, 반대쪽 대각선에 모두 패티션이 없으면 거리두기를 못 하는 것이
import java.util.*;
class Solution {

    public static boolean socialDistance(String[] places, ArrayList<int[]> pLocation) {

        boolean isPossible = true;

        for (int i = 0; i < pLocation.size() - 1; i ++) {
            if (!isPossible) break;

            for (int j = i + 1; j < pLocation.size(); j ++) {
                int[] from = pLocation.get(i);
                int[] to = pLocation.get(j);

                int manhattan = Math.abs(from[0] - to[0]) + Math.abs(from[1] - to[1]);

                if (manhattan <= 2) {
                    // 가로 상에 있으면
                    if (from[0] == to[0]) {
                        if (manhattan == 1) {   // 거리가 1이면 바로 옆에 있다는 것
                            isPossible = false;
                            break;
                        } else if (manhattan == 2) {    // 거리가 2이고 중간에 파티션 여부
                            char petition = places[from[0]].charAt(from[1] + 1);
                            if (petition == 'O') {
                                isPossible = false;
                                break;
                            }
                        }
                        // 세로 상에 있으면
                    } else if (from[1] == from[1]) {
                        if (manhattan == 1) {   // 거리가 1이면 바로 옆에 있다는 것
                            isPossible = false;
                            break;
                        } else if (manhattan == 2) {    // 거리가 2이고 중간에 파티션 여부
                            char petition = places[from[0] + 1].charAt(from[1]);
                            if (petition == 'O') {
                                isPossible = false;
                                break;
                            }
                        }

                    }
                    // 대각선 위치
                    if (from[0] != to[0] && from[1] != to[1]) {

                        if (from[1] < to[1]) {
                            // from 위치의 동쪽과 남쪽을 확인하고, 둘 중에 하나라도 패티션이 없으면 거리두기를 못 하고 있는 것
                            if (places[from[0] + 1].charAt(from[1]) != 'X' || places[from[0]].charAt(from[1] + 1) != 'X') {
                                isPossible = false;
                                break;
                            }
                            // from 위치의 서쪽과 남쪽을 확인하고, 둘 중에 하나라도 패티션이 없으면 거리두기를 못 하고 있는 것
                        } else if (from[1] > to[1]) {
                            if (places[from[0] + 1].charAt(from[1]) != 'X' || places[from[0]].charAt(from[1] - 1) != 'X') {
                                isPossible = false;
                                break;
                            }
                        }

                    }
                }
            }

            if (!isPossible) break;
        }

        return isPossible;
    }

    public int[] solution(String[][] places) {
        int[] answer = new int[5];


        for (int i = 0; i < 5; i ++) {
            ArrayList<int[]> pLocation = new ArrayList<>();

            for (int j = 0; j < 5; j ++) {
                for (int k = 0; k < 5; k ++) {
                    if (places[i][j].charAt(k) == 'P') {
                        pLocation.add(new int[]{j, k});
                    }
                }
            }

            Collections.sort(pLocation, (x1, x2) -> x1[0] - x2[0]);

            for (int[] pLoc : pLocation) System.out.print(Arrays.toString(pLoc));
            System.out.println();

            if (socialDistance(places[i], pLocation)) {
                answer[i] = 1;
            };
        }

        return answer;
    }
}

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

20230906 [Java] 문제풀이  (0) 2023.09.08
20230905 [Java] 문제풀이  (0) 2023.09.08
20230829 [Java] 문제풀이  (0) 2023.08.29
20230828 [Java] 문제풀이  (1) 2023.08.28
20230822 [Java] 문제풀이  (0) 2023.08.22