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

namkun·2022년 7월 31일
0

코딩테스트

목록 보기
31/79

문제 링크

거리두기 확인하기

풀이

  • dfs문제 일거라곤 생각했는데, 구현을 못했고..
  • 나름 규칙성이랍시고 찾았는데, 웬걸...그게 풀렸다.
  • 거리두기를 지키지 않는 상황을 생각해보면 P끼리 접해있는 경우, 그리고 O 에 P가 2개이상이 접해있는 경우다.
    • POP를 사방면에서 그려보면 조건에 성립되지 않는다.
  • 그래서 그걸로 for문을 통해 완전탐색? 이라고 해야할지 모르겠지만 그걸로 풀었다.
class Solution {
    public int[] solution(String[][] places) {
        int[] answer = new int[places.length];

        for (int i = 0; i < places.length; i++) {
            String[][] arr = new String[5][5];
            for (int j = 0; j < places[i].length; j++) {
                String[] splited = places[i][j].split("");
                arr[j] = splited;
            }
            answer[i] = check(arr);
        }

        return answer;
    }

    public int check(String[][] arr) {
        int[] dx = {-1, 0, 1, 0};
        int[] dy = {0, -1, 0, 1};

        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j].equals("X")) continue;
                // 1. 만약에 i, j가 o인 경우
                if (arr[i][j].equals("O")) {
                    int cnt = 0;
                    for (int k = 0; k < dx.length; k++) {
                        if (i + dx[k] >= 0 && j + dy[k] >=0 && i + dx[k] < 5 && j + dy[k] < 5) {
                            if (arr[i + dx[k]][j + dy[k]].equals("P")) cnt++;
                            if (cnt >= 2) return 0;
                        }
                    }
                }

                // 2. 만약에 i, j가 p인 경우
                if (arr[i][j].equals("P")) {
                    for (int k = 0; k < dx.length; k++) {
                        if (i + dx[k] >= 0 && j + dy[k] >=0 && i + dx[k] < 5 && j + dy[k] < 5) {
                            if(arr[i + dx[k]][j + dy[k]].equals("P")) return 0;
                        }
                    }
                }
            }
        }

        return 1;
    }

}
profile
개발하는 중국학과 사람

0개의 댓글