Algorithm/Programmers

[Programmers] 거리두기 확인하기 / ⭕

cks._.hong 2024. 10. 8. 16:12

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 제출 코드 (1시간 20분 14초 / 구현)

import java.util.*;

class Solution {
    public int[] solution(String[][] places) {
        int[] answer = new int[5];
        Arrays.fill(answer, 1);
        
        for(int i = 0; i < 5; i++) {
            String[] curr = places[i];
            for(int j = 0; j < 5; j++) {
                String t = places[i][j];
                for(int k = 0; k < 5; k++) {
                    if(t.charAt(k) == 'P') {
                        answer[i] = isValid(j, k, curr) ? 1 : 0;
                        if(answer[i] == 0) break;
                    }
                }
                if(answer[i] == 0) break;
            }
        }
        
        return answer;
    }
    public static boolean isValid(int x, int y, String[] place) {
        int[] dx = {0, 0, -1, 1, -1, -1, 1, 1};
        int[] dy = {1, -1, 0, 0, -1, 1, -1, 1};
        
        // 상하좌우 탐색
        for(int i = 0; i < 4; i++) {
            for(int j = 1; j <= 2; j++) {
                int nx = x + dx[i] * j;
                int ny = y + dy[i] * j;
                
                if(nx < 0 || nx > 4 || ny < 0 || ny > 4) {
                    continue;
                }
                if(place[nx].charAt(ny) == 'X') break;
                if(place[nx].charAt(ny) == 'P') {
                    return false;
                }
            }
        }
        // 대각선 탐색
        for(int i = 4; i < 8; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
                
            if(nx < 0 || nx > 4 || ny < 0 || ny > 4) {
                continue;
            }
            if(place[nx].charAt(ny) == 'P') {
                if(place[nx].charAt(y) == 'X' && place[x].charAt(ny) == 'X') {
                    continue;
                } else {
                    return false;
                }
            }
        }
        return true;
    }
}

 

 

2. 구현 로직

  1. 응시자가 없는 경우를 고려해서 answer의 값을 1로 모두 초기화
  2. 대기실의 모든 좌표를 탐색하는데, 응시자가 있을 경우 isValid() 실행
    1. 응시자 주변에 거리두기를 만족하는지 검사하는 함수
    2. 맨해튼 거리만큼 상하좌우를 탐색하는데 중간에 파티션 'X'를 만나면 거리두기를 고려할 필요가 없으므로 break 하고 다른 응시자를 만날경우 False
    3. 맨해튼 거리만큼 대각선을 탐색하는데 다른 응시자를 만날경우 주변에 파티션이 있는 지 체크해서 있다면 continue로 탐색 지속, 파티션이 없다면 False
  3. isValid의 결과를 answer[i]에 삽입하고 만약, answer[i]가 0이라면 더이상 대기실을 탐색할 필요가 없으므로 탐색 종료

 

3. 회고

  • answer의 배열을 모두 1로 채움으로써 응시자가 없을 때의 경우를 고려하지 않은 것이 좋았던 거 같다.