ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค [lv2] ๊ฑฐ๋ฆฌ๋‘๊ธฐ ํ™•์ธํ•˜๊ธฐ ํŒŒ์ด์ฌ

2021. 8. 3. 23:56ใ†๐Ÿ”ฑ Algorithm

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๊ฑฐ๋ฆฌ๋‘๊ธฐ ํ™•์ธํ•˜๊ธฐ

[["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

 

๐Ÿ“—  ์ ‘๊ทผ

์šฐ์„  ์„ธ๊ฐ€์ง€ ํ•จ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ์ ‘๊ทผํ–ˆ์Šต๋‹ˆ๋‹ค.

 

1) ๊ฐ matrix๋ฅผ ์ˆœํšŒ

2) ์ˆœํšŒ๋ฅผ ํ•˜๋ฉด์„œ ๋Œ€๊ธฐ์‹ค์˜ ๋ฒ”์œ„ ๋‚ด๋ถ€๋งŒ ํƒ์ƒ‰ํ•˜๋„๋ก

3) ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ง€์ผฐ๋Š”์ง€   -> main ์ด ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

 

์ฝ”๋“œ

1) ๊ฐ matrix๋ฅผ ์ˆœํšŒ: solution(places)

def solution(places):
    answer = []
    entire_matrix = [(i, j) for i in range(5) for j in range(5)]
    for place in places:
        for r, c in entire_matrix:
            if place[r][c] == 'P' and not check(r, c, place):
                answer.append(0)
                break
        else:
            answer.append(1)

    return answer

๋Œ€๊ธฐ์‹ค์˜ ๊ฐ ์œ„์น˜๋ฅผ ์ขŒํ‘œ๋กœ ๊ฐ–๋Š” ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค : entire_matrix

# entire_matrix
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4)]

๊ทธ๋ฆฌ๊ณ  for ๋ฌธ์„ ํ†ตํ•ด ์ฐจ๋ก€๋Œ€๋กœ places ๋ฅผ ์ˆœํšŒํ•ฉ๋‹ˆ๋‹ค.

entire_matrix์˜ ์›์†Œ๋ฅผ ์ขŒํ‘œ๋กœ ์‚ฌ์šฉํ•˜์—ฌ, P๊ฐ€ ์กด์žฌํ•˜๋ฉด์„œ, ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ง€ํ‚ค๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๊ฑฐ๋ฆฌ๋‘๊ธฐ์˜ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜๋Š” check()๋กœ ๋ช…๋ช…ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

for-else ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ, for ๋ฌธ์„ ๋ชจ๋‘ ํ†ต๊ณผํ•˜๋ฉด ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ œ๋Œ€๋กœ ์ง€์ผฐ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ else ๊ตฌ๋ฌธ์—์„œ append(1)์„ ํ•ฉ๋‹ˆ๋‹ค.

 

 

2) ๋Œ€๊ธฐ์‹ค์˜ ๋ฒ”์œ„ ๋‚ด๋ถ€๋งŒ ํƒ์ƒ‰: in_range()

def in_range(x, y):
    SIZE = 5
    return -1 < x < SIZE and -1 < y < SIZE

 

3) ๊ฑฐ๋ฆฌ๋‘๊ธฐ ํ™•์ธ: check()

์ผ€์ด์Šค ๋ณ„๋กœ ๋‚˜๋ˆ„์–ด ์ƒ๊ฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

1๏ธโƒฃ P ๋ฅผ ๊ธฐ์ค€์œผ๋กœ, ๋™์„œ๋‚จ๋ถ ํ•œ์นธ์”ฉ์˜ ๋ฒ”์œ„ โžก๏ธ ์ด ๋ฒ”์œ„์— ๋˜ ๋‹ค๋ฅธ P ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด False

2๏ธโƒฃ P ๋ฅผ ๊ธฐ์ค€์œผ๋กœ, ๋Œ€๊ฐ์„ ์œผ๋กœ ํ•œ์นธ ๋ฒ”์œ„ 

3๏ธโƒฃ P ๋ฅผ ๊ธฐ์ค€์œผ๋กœ, ๋™์„œ๋‚จ๋ถ ๋‘์นธ์”ฉ์˜ ๋ฒ”์œ„ โžก๏ธ ๋‘ ์นธ ๋–จ์–ด์ง„ ๊ณณ์— P ๊ฐ€ ์žˆ์„ ๋•Œ, ๊ธฐ์ค€์ ๊ณผ์˜ ์‚ฌ์ด์— "X"๊ฐ€ ์—†๋‹ค๋ฉด False

 

๋Œ€์ถฉ ์ด๋Ÿฐ ๊ทธ๋ฆผ

 

def check(r, c, p):
    #1
    dist = [(1, 0), (0, 1), (-1, 0), (0, -1)]
    for dx, dy in dist:
        nx, ny = r + dx, c + dy
        if in_range(nx, ny) and p[nx][ny] == 'P':
            return False
            
    #2    
    dist = [(-1, -1), (-1, 1), (1, -1), (1, 1)]
    for dx, dy in dist:
        nx, ny = r + dx, c + dy
        if in_range(nx, ny) and p[nx][ny] == "P" and (p[r][ny] != "X" or p[nx][c] != "X"):
            return False
            
    #3
    dist = [(2, 0), (0, 2), (-2, 0), (0, -2)]
    for dx, dy in dist:
        nx, ny = r + dx, c + dy
        if in_range(nx, ny) and p[nx][ny] == "P" and p[r + dx // 2][c + dy // 2] != "X":
            return False
        
    return True

๋ชจ๋“  ์ผ€์ด์Šค๋ฅผ ๋‹ค ํ†ต๊ณผํ•˜๋ฉด ๋งˆ์ง€๋ง‰์— True ๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ธ๊ทผ ๋ฒ”์œ„ ๋‚ด์—์„œ ๊ฑฐ๋ฆฌ๋‘๊ธฐ๊ฐ€ ์ž˜ ์ง€์ผœ์กŒ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

๐ŸŽ  ์ „์ฒด ์ฝ”๋“œ

def in_range(x, y):
    SIZE = 5
    return -1 < x < SIZE and -1 < y < SIZE


def check(r, c, p):
    dist = [(1, 0), (0, 1), (-1, 0), (0, -1)]
    for dx, dy in dist:
        nx, ny = r + dx, c + dy
        if in_range(nx, ny) and p[nx][ny] == 'P':
            return False
        
    dist = [(-1, -1), (-1, 1), (1, -1), (1, 1)]
    for dx, dy in dist:
        nx, ny = r + dx, c + dy
        if in_range(nx, ny) and p[nx][ny] == "P" and (p[r][ny] != "X" or p[nx][c] != "X"):
            return False

    dist = [(2, 0), (0, 2), (-2, 0), (0, -2)]
    for dx, dy in dist:
        nx, ny = r + dx, c + dy
        if in_range(nx, ny) and p[nx][ny] == "P" and p[r + dx // 2][c + dy // 2] != "X":
            return False
        
    return True


def solution(places):
    answer = []
    entire_matrix = [(i, j) for i in range(5) for j in range(5)]
    for place in places:
        for r, c in entire_matrix:
            if place[r][c] == 'P' and not check(r, c, place):
                answer.append(0)
                break
        else:
            answer.append(1)

    return answer