DevYoon

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ฑฐ๋ฆฌ๋‘๊ธฐ ํ™•์ธํ•˜๊ธฐ (Python) ๋ณธ๋ฌธ

PS/Programmers

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ฑฐ๋ฆฌ๋‘๊ธฐ ํ™•์ธํ•˜๊ธฐ (Python)

gimewn 2023. 2. 19. 00:10

link ๐Ÿ”— https://school.programmers.co.kr/learn/courses/30/lessons/81302

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

๋ฌธ์ œ ์„ค๋ช…

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

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

  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์„ ๋‹ด์Šต๋‹ˆ๋‹ค.

 


 

def solution(places):
    answer = []
    for idx in range(len(places)):
        flag = 1
        board = places[idx]
        people = []
        
        # ์‚ฌ๋žŒ๋“ค์ด ์•‰์•„ ์žˆ๋Š” ์ž๋ฆฌ ๊ตฌํ•˜๊ธฐ
        for y in range(5):
            for x in range(5):
                if board[y][x] == 'P':
                    people.append((y, x))
        
        # ํ•œ ์‚ฌ๋žŒ์”ฉ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ์˜ ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ
        for now in range(len(people) - 1):
            nowY, nowX = people[now]
            for next in range(now + 1, len(people)):
                nextY, nextX = people[next]
                # ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ
                distance = abs(nowY - nextY) + abs(nowX - nextX)
                # ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ๊ฐ€ 2์ดํ•˜์ด๋ฉด
                if distance <= 2:
                    partition = 0
                    # ๊ฐ™์€ ํ–‰์ด๋‚˜ ์—ด์— ์•‰์•„ ์žˆ์œผ๋ฉด ์‚ฌ์ด์— ํŒŒํ‹ฐ์…˜์ด 1๊ฐœ ํ•„์š”ํ•จ
                    if nowY == nextY or nowX == nextX:
                        need = 1
                    # ์—ด๊ณผ ํ–‰์ด ๋ชจ๋‘ ๋‹ค๋ฅด๋ฉด ์‚ฌ์ด์— ํŒŒํ‹ฐ์…˜ 2๊ฐœ๊ฐ€ ํ•„์š”ํ•จ
                    else:
                        need = 2
                    
                    # min ๋ถ€ํ„ฐ max๊นŒ์ง€ ํ–‰๊ณผ ์—ด์„ ๋Œ๋ฉฐ ํŒŒํ‹ฐ์…˜ ๊ฐœ์ˆ˜ ์„ธ์–ด์ฃผ๊ธฐ
                    minY, maxY = min(nowY, nextY), max(nowY, nextY)
                    minX, maxX = min(nowX, nextX), max(nowX, nextX)

                    for y in range(minY, maxY+1):
                        for x in range(minX, maxX+1):
                            # ํŒŒํ‹ฐ์…˜์ด๋ฉด ++
                            if board[y][x] == 'X':
                                partition += 1
                    # ํ•„์š”ํ•œ ํŒŒํ‹ฐ์…˜ ๊ฐœ์ˆ˜์™€ ์‹ค์ œ ์žˆ๋Š” ๊ฐœ์ˆ˜๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด flag = 0
                    if need != partition:
                        flag = 0
                        break
            # ํ•œ ๋ฒˆ์ด๋ผ๋„ ์–ด๊ฒผ๋‹ค๋ฉด ๊ทธ๋งŒ ๊ฒ€์‚ฌ
            if flag == 0:
                break
                
        answer.append(flag)
        
    return answer

- ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ๊ฐ€ 2์ดํ•˜์ธ ๋‘ ์‚ฌ๋žŒ์ด ๊ฐ™์€ ํ–‰์ด๋‚˜ ๊ฐ™์€ ์—ด์— ์•‰์•„ ์žˆ๋‹ค๋ฉด ์‚ฌ์ด์— ํŒŒํ‹ฐ์…˜์ด 1๊ฐœ ํ•„์š”ํ•˜๊ณ , ์—ด๊ณผ ํ–‰์ด ๋ชจ๋‘ ๋‹ค๋ฅด๋‹ค๋ฉด ์‚ฌ์ด์— ํŒŒํ‹ฐ์…˜์ด 2๊ฐœ ์žˆ์–ด์•ผ ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค!