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

2026. 8. 20. 19:03·Programmers/Java, Ruby

 

https://school.programmers.co.kr/learn/courses/30/lessons/81302#

 

프로그래머스

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

programmers.co.kr

 


 

맨해튼 거리가 2이하인 곳에 지원자가 앉아 있는지? 앉아있다면 그 사이 파티션으로 막혀있는지?를 확인한다.

일단 확인해야하는 범위를 그림으로 나타내어보자면 이런 느낌...

분홍색은 맨해튼거리가 1, 파란색은 2인 곳이다.

 

맨해튼 거리가 1인 경우 > 쉽다 그냥 핑크색인 부분이 P인지 아닌지만 확인해주면 끝.

맨해튼 거리가 2인 경우는 두 가지로 나누어 풀었는데

- 직선(상하좌우)에 있는 경우; 새로운 좌표가 P이고 좌표끼리 더해서 나누기 2한 좌표에 X있음? 확인.

- 대각선에 있는 경우; 새로운 좌표가 P이고 {i,nj} {ni,j} 둘 다 X인지 아닌지 확인. (둘 다 X여야만 통과)

새로운 좌표가 0보다 작진 않은지, 범위를 벗어나진 않는지 확인해주자.

 

써놓고보니까 말이 좀 이상하긴 한데 흠.

 

import java.util.*;
class Solution {
    static int[][] dir = {{1,0},{0,1},{-1,0},{0,-1}};
    static int[][] dir1 = {{2,0},{-2,0},{0,2},{0,-2}};
    static int[][] dir2 = {{1,1},{-1,1},{-1,-1},{1,-1}};
    
    public int[] solution(String[][] places) {
        int[] answer = new int[5];
        for(int i=0;i<5;i++){
            answer[i]=aaa(places[i]);
        }
        return answer;
    }
    static int aaa(String ss[]){
        int ans = 1;
        char[][] bb = new char[5][5];
        for(int i=0;i<5;i++)
            for(int j=0;j<5;j++)
                bb[i][j]=ss[i].charAt(j);
        
        for(int i=0;i<5;i++){
            for(int j=0;j<5;j++){
                if(bb[i][j]=='P'){
                    //맨 1
                    for(int k=0;k<4;k++){
                        int ni = i+dir[k][0];
                        int nj = j+dir[k][1];
                        if(ni<0||ni>=5)continue;
                        if(nj<0||nj>=5)continue;
                        if(bb[ni][nj]=='P') return 0;
                    }
                    //맨2
                    for(int k=0;k<4;k++){
                        int ni = i+dir1[k][0];
                        int nj = j+dir1[k][1];
                        if(ni<0||ni>=5)continue;
                        if(nj<0||nj>=5)continue;
                        if(bb[ni][nj]=='P' && 
                           bb[(ni+i)/2][(nj+j)/2]!='X') 
                            return 0;   
                    }
                    
                    //맨2 - 대각선
                    for(int k=0;k<4;k++){
                        int ni = i+dir2[k][0];
                        int nj = j+dir2[k][1];
                        if(ni<0||ni>=5)continue;
                        if(nj<0||nj>=5)continue;
                        if(bb[ni][nj]=='P' && (bb[ni][j]!='X'||bb[i][nj]!='X')) 
                            return 0;
                    }
                }
            }
        }
        
        
        return ans;
    }
}

 

<리뷰>

- dir1 굳이 왜 만들었을까 dir에서 *2하면 더 좋았을텐데 애초에 1이랑 같이 처리하기도 좋았을 듯.

- 교재 코드는 내가 어디서 왔는지 방향도 넘겨줘서 검사하는 방법도 있었는데... 이 정도 사이즈에선 그냥 냅다 좌표 저장해두고 검사해보는게 빠르지 않나? 라는 생각.

 

'Programmers > Java, Ruby' 카테고리의 다른 글

프로그래머스 Java : 문자열 압축  (0) 2026.08.20
프로그래머스 Java : 구슬을 나누는 경우의 수  (0) 2026.08.20
프로그래머스 Java : 영어가 싫어요  (0) 2026.08.19
프로그래머스 Java : 삼각 달팽이  (0) 2026.08.18
프로그래머스 Java : 이진수 더하기  (0) 2026.08.18
'Programmers/Java, Ruby' 카테고리의 다른 글
  • 프로그래머스 Java : 문자열 압축
  • 프로그래머스 Java : 구슬을 나누는 경우의 수
  • 프로그래머스 Java : 영어가 싫어요
  • 프로그래머스 Java : 삼각 달팽이
YYun
YYun
주로 오답노트
  • YYun
    빙글빙글
    YYun
  • 전체
    오늘
    어제
    • 분류 전체보기 (150)
      • BOJ (17)
        • Java (9)
        • Ruby (8)
      • Programmers (113)
        • MySQL (43)
        • Java, Ruby (70)
      • 잡담 (2)
      • FHIR (8)
      • AWS (8)
      • 그 외 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 공지사항
  • 인기 글

  • 태그

    aws
    Like
    재귀
    Year
    group by
    date_format
    프로그래머스
    IFNULL
    자바
    HashSet
    중복제거
    ROUND
    백준
    COUNT
    문자열
    루비
    소수판별
    mysql
    Ruby
    java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
YYun
프로그래머스 Java : 거리두기 확인하기
상단으로

티스토리툴바