ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๊ฑฐ๋ฆฌ๋‘๊ธฐ ํ™•์ธํ•˜๊ธฐ (๊ตฌํ˜„)
    ๐Ÿ’ป Algorithm/Python 2022. 7. 8. 23:46

    ๐Ÿ“Œ ๋ฌธ์ œ

    ๊ฐœ๋ฐœ์ž๋ฅผ ํฌ๋งํ•˜๋Š” ์ฃ ๋ฅด๋””๊ฐ€ ์นด์นด์˜ค์— ๋ฉด์ ‘์„ ๋ณด๋Ÿฌ ์™”์Šต๋‹ˆ๋‹ค.

     

    ์ฝ”๋กœ๋‚˜ ๋ฐ”์ด๋Ÿฌ์Šค ๊ฐ์—ผ ์˜ˆ๋ฐฉ์„ ์œ„ํ•ด ์‘์‹œ์ž๋“ค์€ ๊ฑฐ๋ฆฌ๋ฅผ ๋‘ฌ์„œ ๋Œ€๊ธฐ๋ฅผ ํ•ด์•ผํ•˜๋Š”๋ฐ ๊ฐœ๋ฐœ ์ง๊ตฐ ๋ฉด์ ‘์ธ ๋งŒํผ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทœ์น™์œผ๋กœ ๋Œ€๊ธฐ์‹ค์— ๊ฑฐ๋ฆฌ๋ฅผ ๋‘๊ณ  ์•‰๋„๋ก ์•ˆ๋‚ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

     

    1. ๋Œ€๊ธฐ์‹ค์€ 5๊ฐœ์ด๋ฉฐ, ๊ฐ ๋Œ€๊ธฐ์‹ค์€ 5x5 ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.
    2. ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์œ„ํ•˜์—ฌ ์‘์‹œ์ž๋“ค ๋ผ๋ฆฌ๋Š” ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ1๊ฐ€ 2 ์ดํ•˜๋กœ ์•‰์ง€ ๋ง์•„ ์ฃผ์„ธ์š”.
    3. ๋‹จ ์‘์‹œ์ž๊ฐ€ ์•‰์•„์žˆ๋Š” ์ž๋ฆฌ ์‚ฌ์ด๊ฐ€ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋ง‰ํ˜€ ์žˆ์„ ๊ฒฝ์šฐ์—๋Š” ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

     

    ์˜ˆ๋ฅผ ๋“ค์–ด,

     

     

    5๊ฐœ์˜ ๋Œ€๊ธฐ์‹ค์„ ๋ณธ ์ฃ ๋ฅด๋””๋Š” ๊ฐ ๋Œ€๊ธฐ์‹ค์—์„œ ์‘์‹œ์ž๋“ค์ด ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ž˜ ๊ธฐํ‚ค๊ณ  ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ž๋ฆฌ์— ์•‰์•„์žˆ๋Š” ์‘์‹œ์ž๋“ค์˜ ์ •๋ณด์™€ ๋Œ€๊ธฐ์‹ค ๊ตฌ์กฐ๋ฅผ ๋Œ€๊ธฐ์‹ค๋ณ„๋กœ ๋‹ด์€ 2์ฐจ์› ๋ฌธ์ž์—ด ๋ฐฐ์—ด places๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๊ฐ ๋Œ€๊ธฐ์‹ค๋ณ„๋กœ ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ง€ํ‚ค๊ณ  ์žˆ์œผ๋ฉด 1์„, ํ•œ ๋ช…์ด๋ผ๋„ ์ง€ํ‚ค์ง€ ์•Š๊ณ  ์žˆ์œผ๋ฉด 0์„ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.

    ์ œํ•œ์‚ฌํ•ญ

    places์˜ ํ–‰ ๊ธธ์ด(๋Œ€๊ธฐ์‹ค ๊ฐœ์ˆ˜) = 5

    • places์˜ ๊ฐ ํ–‰์€ ํ•˜๋‚˜์˜ ๋Œ€๊ธฐ์‹ค ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

     

    places์˜ ์—ด ๊ธธ์ด(๋Œ€๊ธฐ์‹ค ์„ธ๋กœ ๊ธธ์ด) = 5

     

    places์˜ ์›์†Œ๋Š” P,O,X๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

    • places ์›์†Œ์˜ ๊ธธ์ด(๋Œ€๊ธฐ์‹ค ๊ฐ€๋กœ ๊ธธ์ด) = 5
    • P๋Š” ์‘์‹œ์ž๊ฐ€ ์•‰์•„์žˆ๋Š” ์ž๋ฆฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • O๋Š” ๋นˆ ํ…Œ์ด๋ธ”์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • X๋Š” ํŒŒํ‹ฐ์…˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

     

    ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” 5๊ฐœ ๋Œ€๊ธฐ์‹ค์˜ ํฌ๊ธฐ๋Š” ๋ชจ๋‘ 5x5 ์ž…๋‹ˆ๋‹ค.

     

    return ๊ฐ’ ํ˜•์‹

    • 1์ฐจ์› ์ •์ˆ˜ ๋ฐฐ์—ด์— 5๊ฐœ์˜ ์›์†Œ๋ฅผ ๋‹ด์•„์„œ return ํ•ฉ๋‹ˆ๋‹ค.
    • places์— ๋‹ด๊ฒจ ์žˆ๋Š” 5๊ฐœ ๋Œ€๊ธฐ์‹ค์˜ ์ˆœ์„œ๋Œ€๋กœ, ๊ฑฐ๋ฆฌ๋‘๊ธฐ ์ค€์ˆ˜ ์—ฌ๋ถ€๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฐ์—ด์— ๋‹ด์Šต๋‹ˆ๋‹ค.
    • ๊ฐ ๋Œ€๊ธฐ์‹ค ๋ณ„๋กœ ๋ชจ๋“  ์‘์‹œ์ž๊ฐ€ ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ง€ํ‚ค๊ณ  ์žˆ์œผ๋ฉด 1์„, ํ•œ ๋ช…์ด๋ผ๋„ ์ง€ํ‚ค์ง€ ์•Š๊ณ  ์žˆ์œผ๋ฉด 0์„ ๋‹ด์Šต๋‹ˆ๋‹ค.

     

    ์ž…๋ ฅ ์˜ˆ์‹œ

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

     


    ๐Ÿ“Œ ํ’€์ด

    ๐Ÿ’ฌ Code

    from itertools import combinations
    
    
    def solution(places):
        answer = []
    
        for place in places:
    
            pos = []
            for i in range(5):
                for j in range(5):
                    if place[i][j] == 'P':
                        pos.append((i, j))
    
            is_correct = 1
            com = list(combinations(pos, 2))
    
            for i in range(len(com)):
                x1, y1 = com[i][0][0], com[i][0][1]
                x2, y2 = com[i][1][0], com[i][1][1]
                dist = abs(x1 - x2) + abs(y1 - y2)
    
                if dist <= 2:
                    if x1 == x2 and place[x1][max(y1, y2) - 1] == 'X':
                        continue
                    elif y1 == y2 and place[max(x1, x2) - 1][y1] == 'X':
                        continue
                    elif abs(x1 - x2) == 1 and abs(y1 - y2) == 1:
                        if place[x1][y2] == 'X' and place[x2][y1] == 'X':
                            continue
                    is_correct = 0
                    break
    
            answer.append(is_correct)
    
        return answer

    ๐Ÿ’ก Solution

    ์ฒ˜์Œ์— BFS๋กœ ํ’€์—ˆ๋Š”๋ฐ 30๊ฐœ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ์ค‘ 5๊ฐœ๋งŒ ํ†ต๊ณผํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋– ์„œ ๋น ๋ฅด๊ฒŒ ํฌ๊ธฐํ•˜๊ณ  ์กฐํ•ฉ์œผ๋กœ ํ’€์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทผ๋ฐ ๋‹ค๋ฅธ ๋ถ„๋“ค์€ BFS๋กœ ์ž˜ ํ‘ธ์…จ๊ธธ๋ž˜ ๊ทธ๋ƒฅ ๋‚ด๊ฐ€ ์„ค๊ณ„๋ฅผ ์ž˜ ๋ชปํ•œ ๊ฒƒ ๊ฐ™์•„์š” ^_ใ…  ๊ป„๊ป„ ๋‚˜์ค‘์— BFS๋กœ ๋‹ค์‹œ ํ’€์–ด๋ด์•ผ์ง€

     

    ์ฝ”๋“œ๋ฅผ ๋œฏ์–ด๋ณด๋ฉด

     

    • num: ๋Œ€๊ธฐ์‹ค ์ธ๋ฑ์Šค
    • pos: P์˜ ์œ„์น˜๋ฅผ ๋‹ด์„ ๋ฆฌ์ŠคํŠธ
    • is_correct: ๊ฑฐ๋ฆฌ๋‘๊ธฐ๊ฐ€ ์ง€์ผœ์กŒ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” boolean ๊ฐ’
    • com: ๋‘ ๊ฐœ์˜ P ์œ„์น˜๋ฅผ ์กฐํ•ฉํ•ด์„œ ๋ฌถ์–ด๋‘” ๋ฆฌ์ŠคํŠธ
    • dist: ๋‘ P ์‚ฌ์ด ๊ฑฐ๋ฆฌ

    pos = []  # pos: P์˜ ์œ„์น˜๋ฅผ ๋‹ด์„ ๋ฆฌ์ŠคํŠธ
    for i in range(5):
        for j in range(5):
            if place[i][j] == 'P':
                pos.append((i, j))

    P์˜ ์œ„์น˜๋ฅผ (x, y) ํ˜•ํƒœ๋กœ pos๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋ชจ๋“  P์˜ ์œ„์น˜๋“ค์„ ์กฐํ•ฉํ•ด์„œ (x1, y1), (x2, y2)์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

     

    is_correct = 1  # is_correct: ๊ฑฐ๋ฆฌ๋‘๊ธฐ๊ฐ€ ์ง€์ผœ์กŒ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” boolean ๊ฐ’
    com = list(combinations(pos, 2))  # com: ๋‘ ๊ฐœ์˜ P ์œ„์น˜๋ฅผ ์กฐํ•ฉ
    
    for i in range(len(com)):
        x1, y1 = com[i][0][0], com[i][0][1]
        x2, y2 = com[i][1][0], com[i][1][1]
        dist = abs(x1 - x2) + abs(y1 - y2)
    
        # ๋‘ P ์‚ฌ์ด ๊ฑฐ๋ฆฌ๊ฐ€ 2 ์ดํ•˜๋ผ๋ฉด ์ค‘๊ฐ„์— ํŒŒํ‹ฐ์…˜์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ
        if dist <= 2:
            # ๊ฐ€๋กœ ๊ฒ€์‚ฌ
            if x1 == x2 and place[x1][max(y1, y2) - 1] == 'X':
                continue
            # ์„ธ๋กœ ๊ฒ€์‚ฌ
            elif y1 == y2 and place[max(x1, x2) - 1][y1] == 'X':
                continue
            # ๋Œ€๊ฐ์„  ๊ฒ€์‚ฌ
            elif abs(x1 - x2) == 1 and abs(y1 - y2) == 1:
                if place[x1][y2] == 'X' and place[x2][y1] == 'X':
                    continue
            # ์•„๋ฌด๋ฐ์„œ๋„ ํŒŒํ‹ฐ์…˜์„ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด ๊ฑฐ๋ฆฌ๋‘๊ธฐ ์‹คํŒจ
            is_correct = 0
            break

    is_correct๋ฅผ 1๋กœ ์ดˆ๊ธฐํ™”ํ–ˆ๋Š”๋ฐ, ๊ฑฐ๋ฆฌ๋‘๊ธฐ๊ฐ€ ์ง€์ผœ์ง€์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด 0์œผ๋กœ ๋ณ€๊ฒฝํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


    P์˜ ์œ„์น˜๋“ค์˜ ์กฐํ•ฉ์ด ๋‹ด๊ธด com์—์„œ x1, y1, x2, y2๋ฅผ ์–ป๊ณ  ๊ฑฐ๋ฆฌ dist๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.


    ๋งŒ์•ฝ dist๊ฐ€ 2 ์ดํ•˜๋ผ๋ฉด ์ค‘๊ฐ„์— ํŒŒํ‹ฐ์…˜ X๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

     

    • (0, 0) (0, 1)์ฒ˜๋Ÿผ dist๊ฐ€ 1์ธ ๊ฒฝ์šฐ
      ํŒŒํ‹ฐ์…˜ ๊ฒ€์‚ฌ๋ฅผ ํ•  ํ•„์š”๋„ ์—†์ด ๊ฑฐ๋ฆฌ๋‘๊ธฐ ์‹คํŒจ์ด๋ฏ€๋กœ ๋ชจ๋“  if-elif๋ฌธ์„ ํ†ต๊ณผํ•˜๊ณ  ๋ฐ”๋กœ is_correct๋ฅผ 0์œผ๋กœ ๋งŒ๋“ ๋‹ค.
    • (0, 0) (0, 2)์ฒ˜๋Ÿผ dist๊ฐ€ 2์ด๊ณ  x1 == x2์ธ ๊ฒฝ์šฐ
      (0, 1)์— ํŒŒํ‹ฐ์…˜์ด ์œ„์น˜ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ
    • (1, 0) (3, 0)์ฒ˜๋Ÿผ dist๊ฐ€ 2์ด๊ณ  y1 == y2์ธ ๊ฒฝ์šฐ
      (2, 0)์— ํŒŒํ‹ฐ์…˜์ด ์œ„์น˜ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ
    • (0, 0) (1, 1)์ฒ˜๋Ÿผ dist๊ฐ€ 2์ด๊ณ  ๋Œ€๊ฐ์„ ์ธ ๊ฒฝ์šฐ
      (0, 1) (1, 0)์— ํŒŒํ‹ฐ์…˜์ด ๋ชจ๋‘ ์œ„์น˜ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ

     

     

     

    ๋Œ“๊ธ€

Designed by Tistory.