์•Œ๊ณ ๋ฆฌ์ฆ˜๐Ÿฅš/๋ฌธ์ œํ’€์ด (Python)

[Programmers] ๊ธฐ๋‘ฅ๊ณผ ๋ณด ์„ค์น˜ (Lv.3) 2024/4/1

๐Ÿช„ํ•˜๋ฃจ๐Ÿช„ 2024. 4. 1. 19:16
728x90
๋ฌธ์ œ ์ œ๋ชฉ ์ •๋‹ต๋ฅ  ๋‚œ์ด๋„
๊ธฐ๋‘ฅ๊ณผ ๋ณด ์„ค์น˜ 35% Lv.3

 

 

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

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

programmers.co.kr

 

๋ฌธ์ œ์š”์•ฝ

๊ตฌ์กฐ๋ฌผ(๊ธฐ๋‘ฅ, ๋ณด) ์„ค์น˜ ์‚ญ์ œ์— ๋Œ€ํ•œ ๋ฐฐ์—ด build_frame์ด ์ฃผ์–ด์ง„๋‹ค.

์กฐ๊ฑด 1) ๋ชจ๋“  ๊ธฐ๋‘ฅ์€ ๋•…์— ์„ค์น˜๋˜๊ฑฐ๋‚˜, ๋ณด์˜ ํ•œ์ชฝ ๋ ์œ„์— ์žˆ๊ฑฐ๋‚˜, ๋˜ ๋‹ค๋ฅธ ๊ธฐ๋‘ฅ ์œ„์— ์žˆ๋‹ค.

์กฐ๊ฑด 2) ๋ชจ๋“  ๋ณด๋Š” ๋•… ์œ„์— ์žˆ์ง€ ์•Š๊ณ , ํ•œ์ชฝ ๋์ด ๊ธฐ๋‘ฅ ์œ„์— ์žˆ๊ฑฐ๋‚˜, ์–‘์ชฝ ๋์ด ๋ณด์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๊ฐ ์‚ฝ์ž…, ์‚ญ์ œ๋งˆ๋‹ค ์กฐ๊ฑด1) ์กฐ๊ฑด2)๋ฅผ ๋งŒ์กฑ์‹œ์ผœ์•ผ ํ•œ๋‹ค(๋งŒ์กฑ์‹œํ‚ค์ง€ ์•Š๋Š” ํ–‰์œ„์— ๋Œ€ํ•ด์„œ๋Š” ๋ฌด์‹œํ•˜๊ณ  ๋‹ค์Œ ํ–‰์œ„๋ฅผ ์ง„ํ–‰)

answer=๋ชจ๋“  ๊ตฌ์กฐ๋ฌผ ๊ฒฐ๊ณผ : [[x, y, 0|1],...]]๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ  ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์ด์–ด์•ผ ํ•œ๋‹ค.

 

ํ’€์ด

Step1. ํŠน์ • ๊ธฐ๋‘ฅ์ด๋‚˜ ๋ณด๊ฐ€ ์กฐ๊ฑด1, ์กฐ๊ฑด2๋ฅผ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธ

  • ํŠน์ • ๊ธฐ๋‘ฅ์ด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธ
  • ํŠน์ • ๋ณด๊ฐ€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธ

Step2. ์‚ฝ์ž…, ์‚ญ์ œ์— ๋Œ€ํ•ด ์—ฐ์‚ฐ ์ˆ˜ํ–‰์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ

  • ์‚ฝ์ž…์˜ ๊ฒฝ์šฐ ํ•ด๋‹น x, y์— ๋Œ€ํ•ด step1์„ ์ง„ํ–‰
  • ์‚ญ์ œ์˜ ๊ฒฝ์šฐ ์‚ญ์ œํ•œ ๋’ค์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ชจ๋“  ๊ธฐ๋‘ฅ, ๋ณด์— ๋Œ€ํ•ด step1์„ ์ง„ํ–‰

 

โ€ปโ€ป ์ฑ…์˜ ํ’€์ด๋Š” possibleํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์‚ฝ์ž… ์‚ญ์ œ ์‹œ ๋ชจ๋“  answer์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ์ง€ ํƒ์ƒ‰ํ•˜๋Š”๋ฐ

ํ•ด๋‹น ํ’€์ด์˜ ๊ฒฝ์šฐ ์‚ฝ์ž…, ์‚ญ์ œ๊ฐ€ ์ผ์–ด๋‚ ๋•Œ๋งˆ๋‹ค ํŠน์ • ๊ธฐ๋‘ฅ, ํŠน์ • ๋ณด์— ๋Œ€ํ•ด is_build_okay์ธ์ง€ ํŒ๋‹จํ•˜๊ฒŒ ํ•˜์˜€๋‹ค.

(์‚ฝ์ž…์˜ ๊ฒฝ์šฐ 1๊ฐœ, ์‚ญ์ œ์˜ ๊ฒฝ์šฐ 6๊ฐ€์ง€์˜ ๊ธฐ๋‘ฅ์ด๋‚˜ ๋ณด์— ๋Œ€ํ•ด ํƒ์ƒ‰)

์ฝ”๋“œ์˜ ๊ธธ์ด๋Š” ์ฆ๊ฐ€ํ•˜์ง€๋งŒ, ์กฐ๊ธˆ ๋” ์—„๋ฐ€ํ•˜๊ฒŒ ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

def is_build_okay(x, y, type, answer):
    if type==0: #๊ธฐ๋‘ฅ-> ๋ฐ”๋‹ฅ์œ„, ๋ณด์˜ ํ•œ์ชฝ ๋ ๋ถ€๋ถ„ ์œ„, ๋‹ค๋ฅธ ๊ธฐ๋‘ฅ ์œ„
        if y==0 or [x-1, y, 1] in answer or [x, y, 1] in answer or [x, y-1, 0] in answer:
            return True
    else:
        if y>0:
            if [x, y-1, 0] in answer or [x+1, y-1, 0] in answer:
                return True
            if [x-1, y, 1] in answer and [x+1, y, 1] in answer:
                return True
    return False

def solution(n, build_frame):

    answer=[]
    for now in build_frame:
        if now[3]==0: #์‚ญ์ œ
            all_okay=True
            check_answer_xy=[]
            check_answer_xy=[xy for xy in [[now[0]-1, now[1], 1], [now[0], now[1], 1], [now[0]-1, now[1]+1, 1], [now[0], now[1]+1, 1], [now[0]+1, now[1], 1]] if xy in answer]
            check_answer_xy+=[xy for xy in [[now[0], now[1]-1, 0], [now[0], now[1], 0],  [now[0], now[1]+1, 0], [now[0]+1, now[1]-1, 0],[now[0]+1, now[1], 0]] if xy in answer]
            
            temp_answer=answer[:]
            
            if now[2]==0:
                temp_answer.remove([now[0], now[1], 0])
            else:
                temp_answer.remove([now[0], now[1], 1])
                
            for xy in check_answer_xy:
                all_okay=is_build_okay(xy[0], xy[1], xy[2], temp_answer)
                if all_okay==False:
                    break
                    
            if all_okay==True:
                if now[2]==0:
                    answer.remove([now[0], now[1], 0])
                else:
                    answer.remove([now[0], now[1], 1])
        else:
            if now[2]==0: #๊ธฐ๋‘ฅ
                if is_build_okay(now[0], now[1], 0, answer):#์„ค์น˜
                    answer.append([now[0], now[1], 0])
            else: #๋ณด ์กฐ๊ฑด
                if is_build_okay(now[0], now[1], 1, answer):#์„ค์น˜
                    answer.append([now[0], now[1], 1])
    answer.sort()
    return answer
728x90