programmers - 거리두기확인하기

resilient

·

2021. 7. 17. 13:13

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

  • 이 문제는 카카오 2021 여름 인턴십 코딩테스트 2번 문제로 나왔더 문제인데, 당시에 풀다가 계속 100프로가 나오지않아서 결국엔 틀렸던 문제였다.
  • 지금 풀어보니까 엄청 쉽다는 아니여도 충분히 풀 수 있었던 문제였는데 아쉽다. 그 사이에 실력이 늘었다고 좋게 생각해야겠다.
  • 2중 for문으로 2차원 배열을 탐색하면서 만약에 P가 나오면, 그 오른쪽, 대각선 아래 왼쪽, 대각선 아래 오른쪽 배열만 확인해주면된다. 이유는 그 전에 이미 왼쪽이나 위쪽 배열을 탐색했기 때문이다.
  • 경우의 수를 6개로 나눠서 문제를 풀었고, 생각보다 간단했다.
  • validRange라는 함수를 만들어서 범위 안에 있는지만 간단하게 확인해주는 방식으로 구현했다.
def solution(places):
    def validRange(x, y):
        if 0 <= x < 5 and 0 <= y < 5:
            return True
        return False
    answer = []
    for room in places:
        flag = 0
        for i in range(5):
            for j in range(5):
                if room[i][j] == "P":
                    if validRange(i+1,j) and room[i+1][j] == "P":
                        flag = 1
                    if validRange(i+2,j) and room[i+2][j] == "P" and room[i+1][j] != "X":
                        flag = 1
                    if validRange(i,j+1) and room[i][j+1] == "P":
                        flag = 1
                    if validRange(i,j+2) and room[i][j+2] == "P" and room[i][j+1] != "X":
                        flag = 1
                    if validRange(i+1,j+1) and room[i+1][j+1] == "P" and (room[i+1][j] != "X" or room[i][j+1] != "X"):
                        flag = 1
                    if validRange(i+1,j-1) and room[i+1][j-1] == "P" and (room[i][j-1] != "X" or room[i+1][j] != "X"):
                        flag = 1
        if flag == 0:
            answer.append(1)
        else:
            answer.append(0)   
    return answer
반응형