250x250
250x250
JinSeopKim
Hello World!
JinSeopKim
전체 방문자
오늘
어제
  • 분류 전체보기 (168)
    • Artificial intelligence (14)
      • DeepDiveToAI (3)
      • Pytorch (3)
      • Etc (8)
    • Back-end (19)
      • Spring (10)
      • JPA (9)
    • Language (24)
      • Python (3)
      • Java (11)
      • Swift (10)
    • Math (4)
      • Linear Algebra (4)
    • CodingTest (79)
      • Algolithm (12)
      • Backjoon (25)
      • Programmers (42)
    • Etc (27)
      • Book Review (3)
      • Adsp (6)
      • Life (2)
      • Docker (1)
      • odds and ends (15)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • GitHub

인기 글

태그

  • JPA
  • 코딩테스트
  • data
  • 선형대수
  • 자바
  • 개발
  • uArm
  • java
  • ADsP
  • 백준
  • 파이썬
  • Front-end
  • certificate
  • AI
  • 브루트포스
  • 프로그래머스
  • DP
  • 구현
  • BOJ
  • Python
  • JAVA8
  • 개발자
  • BFS
  • ios
  • 머신러닝
  • SpringMVC
  • 문제풀이
  • 카카오
  • swift
  • 알고리즘

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
JinSeopKim
CodingTest/Programmers

[PGM_81302] 거리두기 확인하기 (java)

[PGM_81302] 거리두기 확인하기 (java)
CodingTest/Programmers

[PGM_81302] 거리두기 확인하기 (java)

2022. 2. 9. 22:57
728x90
728x90

문제링크

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

 

코딩테스트 연습 - 거리두기 확인하기

[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] [1, 0, 1, 1, 1]

programmers.co.kr

문제풀이

👨🏻‍💻 핵심 스킬 👨🏻‍💻
브루트포스

이 문제는 5개의 방에 5x5로 자리가 있고, 그 자리마다 사람, 빈 의자, 파티션 중에 하나가 올 수 있다. 파티션을 기준으로 사람들은 붙어있을수 있지만, 빈 의자를 기준으로는 2칸이상 떨어져 있어야한다. 이 때 사람들이 모두 두 칸이상 떨어져 거리두기를 하고있는지 확인하는 문제이다.

파티션의 역할은 사람과 사람 사이의 거리를 2로 줄이는 기능을 한다. 즉 '사람 | 파티션 | 사람' 일 경우에는 거리두기를 하고 있는 것이다

하지만 빈 의자의 경우는 다르다. '사람 | 빈의자 | 사람' 의 경우 2칸이상 차이가 나지 않으므로 거리두기를 하고 있지 않은 상태가 된다. 

 

문제를 해결하기 위해 나는 재귀에 깊이를 더해 모든 경우의 수를 확인하여 체크하였다. 만약 특정 지점이 사람일 경우 상하좌우를 고려하여 사람이 있는지 확인하고, 없다면 다시 그 지점에서 상하좌우를 체크하여 사람이 있는지 확인하여 거리두기를 하는지 체크하였다. 이 때 파티션을 만나는 경우는 거리가 1이여도 괜찮기 때문에 사회적 거리두기를 하고있는 상황이라고 판단하였고, 다시한번 더 호출되는 경우는 빈 의자의 경우 다시 호출하여주었다. 체크하여주었다. 그리고 사람으로 인해 호출될 때마다, depth를 1 늘려주어 거리를 계산하여 주었다.

구현코드

package pgm_81302;

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

        for (int i = 0; i < 5; i++) {
            answer[i] = check(makePosition(places[i])) ? 1 : 0;
        }
        return answer;
    }

    private char[][] makePosition(String[] place) {
        char[][] positions = new char[5][5];

        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                positions[i][j] = place[i].charAt(j);
            }
        }
        return positions;
    }

    public boolean check(char[][] positions) {
        boolean result = true;
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (result) {
                    boolean[][] checked = new boolean[5][5];
                    result = isKeepDistance(positions, checked, i, j, 0);
                }
            }
        }
        return result;
    }

    public boolean isKeepDistance(char[][] positions, boolean[][] checked, int x, int y, int depth) {
        if (!(x < 5 && x >= 0 && y >= 0 && y < 5 && !checked[x][y]))
            return true;
        if (depth == 3)
            return true;
        if (positions[x][y] == 'P' && depth != 0)
            return false;

        int[] dx = {1, 0, -1, 0};
        int[] dy = {0, 1, 0, -1};

        checked[x][y] = true;
        if (positions[x][y] == 'P') {
            for (int i = 0; i < dx.length; i++) {
                if (!isKeepDistance(positions, checked, x + dx[i], y + dy[i], depth + 1))
                    return false;
            }
        } else if (positions[x][y] == 'X')
            return true;
        else {
            if (depth == 0)
                return true;
            for (int i = 0; i < dx.length; i++) {
                if (!isKeepDistance(positions, checked, x+dx[i], y+dy[i], depth + 1))
                    return false;
            }
        }
        return true;
    }
}
잘못된 지식이나 궁금한 내용이 있을 경우 편하게 댓글 남겨주시면 감사하겠습니다 :)
728x90
728x90
저작자표시 비영리

'CodingTest > Programmers' 카테고리의 다른 글

[pgm_64065] 튜플 (java)  (0) 2022.02.15
[pgm_67257] 수식 최대화 (java)  (0) 2022.02.11
[PGM_17677] 뉴스 클러스터링 (java)  (0) 2022.02.08
[PGM_60058] 괄호 변환 (java)  (0) 2022.02.07
[PGM_72411] 메뉴 리뉴얼 (java)  (0) 2022.02.04
  • 문제링크
  • 문제풀이
  • 구현코드
'CodingTest/Programmers' 카테고리의 다른 글
  • [pgm_64065] 튜플 (java)
  • [pgm_67257] 수식 최대화 (java)
  • [PGM_17677] 뉴스 클러스터링 (java)
  • [PGM_60058] 괄호 변환 (java)
JinSeopKim
JinSeopKim
기록📚

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.