-
[Programmers] 거리두기 확인하기 / ⭕Algorithm/Programmers 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. 구현 로직
- 응시자가 없는 경우를 고려해서 answer의 값을 1로 모두 초기화
- 대기실의 모든 좌표를 탐색하는데, 응시자가 있을 경우 isValid() 실행
- 응시자 주변에 거리두기를 만족하는지 검사하는 함수
- 맨해튼 거리만큼 상하좌우를 탐색하는데 중간에 파티션 'X'를 만나면 거리두기를 고려할 필요가 없으므로 break 하고 다른 응시자를 만날경우 False
- 맨해튼 거리만큼 대각선을 탐색하는데 다른 응시자를 만날경우 주변에 파티션이 있는 지 체크해서 있다면 continue로 탐색 지속, 파티션이 없다면 False
- isValid의 결과를 answer[i]에 삽입하고 만약, answer[i]가 0이라면 더이상 대기실을 탐색할 필요가 없으므로 탐색 종료
3. 회고
- answer의 배열을 모두 1로 채움으로써 응시자가 없을 때의 경우를 고려하지 않은 것이 좋았던 거 같다.
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] 순위 검색 / ⭕ (6) 2024.10.08 [Programmers] 주차 요금 계산 / ⭕ (0) 2024.10.07 [Programmers] 롤케이크 자르기 / ❌ (0) 2024.10.07 [Programmers] 두 큐 합 같게 만들기 / ⭕ (0) 2024.10.07 [Programmers] 할인 행사 / ⭕ (1) 2024.10.06