ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

https://school.programmers.co.kr/learn/courses/30/lessons/60061

 

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

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

programmers.co.kr

 

๐Ÿ“  ํ’€์ด

๋ฌธ์ œ๋ฅผ ์ฒ˜์Œ ์ฝ๊ณ  ๊ตฌํ˜„๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค. ๋˜ํ•œ n์ œํ•œ์ด 100์ด๊ณ  build_frame์˜ ์ตœ๋Œ€ ๊ธธ์ด๊ฐ€ 1000์ด๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ณ ๋ ค์•ˆํ•ด๋„ ๋˜๋Š” ๊ตฌํ˜„๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ๋งค์šฐ ํ—ท๊ฐˆ๋ฆฌ๊ธฐ๋„ ํ–ˆ๊ณ  ์กฐ๊ฑด์„ ๊ตฌํ˜„ํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ค์› ๋‹ค. ํŠนํžˆ, ํŠน์ • ์ขŒํ‘œ์—์„œ ๋ณด์™€ ๊ธฐ๋‘ฅ์„ ๋‘˜ ๋‹ค ์ง€์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ฒดํฌํ•ด์•ผํ•œ๋‹ค.

์ผ๋‹จ build_frame์— ๋”ฐ๋ผ ๊ธฐ๋‘ฅ์ด๋‚˜ ๋ณด๋ฅผ ์ง“๊ฑฐ๋‚˜ ์—†์• ๊ณ  ์ „์ฒด ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค. ๋˜ํ•œ ๊ฐ’์ด 0์ธ ๊ฒฝ์šฐ๋Š” ๊ธฐ๋‘ฅ, 1์€ ๋ณด, 2๋Š” ๋‘˜ ๋‹ค ์ง€์–ด์กŒ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ๋‹ค. 

 

1. ๋‹จ์ˆœ ๋ฒ”์œ„ ์ฒดํฌ๋ฅผ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

def isValid(x,y,n):
    if 0 <= x < n and 0 <= y < n:
        return True
    return False

 

2. ๊ธฐ๋‘ฅ์„ ์ง€์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํŒ๋ณ„ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

def canBuildPillow(i,j,build):
    if j == len(build)-1: # ์ขŒํ‘œ์˜ ๋งจ ์œ„๋ผ๋ฉด ๋ฒฝ๋ฉด์„ ๋„˜์–ด๊ฐ€๋ฏ€๋กœ ์ง€์„ ์ˆ˜ ์—†๋‹ค.
        return False
    # ๊ธฐ๋‘ฅ์˜ ์กฐ๊ฑด
    # ๋ฐ”๋‹ฅ ์œ„์— ์žˆ๊ฑฐ๋‚˜ 
    if j == 0:
        return True
    # ๋ณด์˜ ํ•œ์ชฝ ๋ ๋ถ€๋ถ„ ์œ„์— ์žˆ๊ฑฐ๋‚˜ (์™ผ์ชฝ ๋ณด)
    if isValid(i-1,j,len(build)):
        if build[i-1][j] == 1 or build[i-1][j] == 2:
            return True
    # ๋ณด์˜ ํ•œ์ชฝ ๋ ๋ถ€๋ถ„ ์œ„์— ์žˆ๊ฑฐ๋‚˜ (์˜ค๋ฅธ์ชฝ ๋ณด)
    if isValid(i,j,len(build)):
        if build[i][j] == 1 or build[i][j] == 2:
            return True
    #  ๋˜ ๋‹ค๋ฅธ ๊ธฐ๋‘ฅ ์œ„์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    if isValid(i,j-1,len(build)):
        if build[i][j-1] == 0 or build[i][j-1] == 2:
            return True

    return False # ํ†ต๊ณผ ๋ชปํ•จ

3. ๋ณด๋ฅผ ์ง€์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํŒ๋ณ„ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

def canBuildBeam(i,j,build):
    # ๋งจ ์˜ค๋ฅธ์ชฝ์ธ ๊ฒฝ์šฐ ๋ฒฝ๋ฉด์„ ๋„˜์–ด๊ฐ€๋ฏ€๋กœ ์ง€์„ ์ˆ˜ ์—†๋‹ค.
    if i == len(build)-1:
        return False
    # ํ•œ์ชฝ ๋ ๋ถ€๋ถ„์ด ๊ธฐ๋‘ฅ ์œ„์— ์žˆ๊ฑฐ๋‚˜ 
    if isValid(i,j-1,len(build)):
        if build[i][j-1] == 0 or build[i][j-1] == 2:
            return True
    if isValid(i+1,j-1,len(build)):
        if build[i+1][j-1] == 0 or build[i+1][j-1] == 2:
            return True
    # ์–‘์ชฝ ๋ ๋ถ€๋ถ„์ด ๋‹ค๋ฅธ ๋ณด์™€ ๋™์‹œ์— ์—ฐ๊ฒฐ๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.
    if isValid(i-1,j,len(build)) and (build[i-1][j] == 1 or build[i-1][j] == 2) and isValid(i+1,j,len(build)) and (build[i+1][j] == 1 or build[i+1][j] == 2):
        return True
    return False

4.  ์ „์ฒด build๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๋ชจ๋“  ๋ณด์™€ ๊ธฐ๋‘ฅ๋“ค์ด ์ง€์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํŒ๋ณ„ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ•œ๋‹ค.

def isPossible(build):
    # ๋ชจ๋“  ๊ฑด์ถ•๋ฌผ๋“ค์„ ์ˆœํšŒํ•œ๋‹ค.
    for i in range(len(build)):
        for j in range(len(build)):
            if build[i][j] == -1: # ์•„๋ฌด๊ฒƒ๋„ ์•ˆ์ง€์–ด์ง„ ๊ฒฝ์šฐ
                continue
            else: # ๋ณด๋‚˜ ๊ธฐ๋‘ฅ์ด ์žˆ๋Š” ๊ฒฝ์šฐ
                if build[i][j] == 0: # ๊ธฐ๋‘ฅ์ธ ๊ฒฝ์šฐ
                    if not canBuildPillow(i,j,build):
                        return False
                        
                if build[i][j] == 1: # ๋ณด์ธ ๊ฒฝ์šฐ
                    if not canBuildBeam(i,j,build):
                        return False
                        
                if build[i][j] == 2: # ๋‘˜๋‹ค ์„ค์น˜
                    if not canBuildPillow(i,j,build):
                        return False
                    if not canBuildBeam(i,j,build):
                        return False
    return True

5. ์œ„์—์„œ ๊ตฌํ˜„ํ•œ ๋ฉ”์„œ๋“œ๋“ค์„ ํ™œ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค.

def solution(n, build_frame):
    # ์•„๋ฌด๊ฒƒ๋„ ์•ˆ์ง€์€ ์ƒํƒœ๋กœ -1๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
    build = [[-1 for i in range(n+1)] for i in range(n+1)]
    
    for i in range(len(build_frame)):
        x,y,a,b = build_frame[i][0],build_frame[i][1],build_frame[i][2],build_frame[i][3]
        
        # ์ง€์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ณต๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „๊ฐ’ ์ €์žฅ
        tmp = build[x][y]
        
        if b == 0: # ์‚ญ์ œ
            if build[x][y] == 2:
                if a == 0:
                    build[x][y] = 1
                if a == 1:
                    build[x][y] = 0
            else:
                build[x][y] = -1
                
        if b == 1: # ์ƒ์„ฑ
            if build[x][y] == -1:
                build[x][y] = a
            else:
                build[x][y] = 2
            
        if not isPossible(build):
            build[x][y] = tmp
            #print(str(x)+str(y),str(a)+"์„ค์น˜์•ˆํ•จ")
    answer = []
    
    for i in range(len(build)):
        for j in range(len(build)):
            if build[i][j] == 0 or build[i][j] == 1:
                answer.append([i,j,build[i][j]])
            if build[i][j] == 2:
                answer.append([i,j,0])
                answer.append([i,j,1])
    
    return answer

๐Ÿ–ฅ ์ตœ์ข… ์ฝ”๋“œ

 

def isValid(x,y,n):
    if 0 <= x < n and 0 <= y < n:
        return True
    return False
def canBuildPillow(i,j,build):
    if j == len(build)-1:
        return False
    # ๊ธฐ๋‘ฅ์˜ ์กฐ๊ฑด
    # ๋ฐ”๋‹ฅ ์œ„์— ์žˆ๊ฑฐ๋‚˜ 
    if j == 0:
        return True
    # ๋ณด์˜ ํ•œ์ชฝ ๋ ๋ถ€๋ถ„ ์œ„์— ์žˆ๊ฑฐ๋‚˜ ๋˜ ๋‹ค๋ฅธ ๊ธฐ๋‘ฅ ์œ„์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    if isValid(i-1,j,len(build)):
        if build[i-1][j] == 1 or build[i-1][j] == 2:
            return True
    #  ๋˜ ๋‹ค๋ฅธ ๊ธฐ๋‘ฅ ์œ„์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    if isValid(i,j-1,len(build)):
        if build[i][j-1] == 0 or build[i][j-1] == 2:
            return True
    # ----
    if isValid(i,j,len(build)):
        if build[i][j] == 1 or build[i][j] == 2:
            return True
    return False # ํ†ต๊ณผ ๋ชปํ•จ
def canBuildBeam(i,j,build):
    # ๋งจ ์˜ค๋ฅธ์ชฝ์ธ ๊ฒฝ์šฐ
    if i == len(build)-1:
        return False
    # ํ•œ์ชฝ ๋ ๋ถ€๋ถ„์ด ๊ธฐ๋‘ฅ ์œ„์— ์žˆ๊ฑฐ๋‚˜ 
    if isValid(i,j-1,len(build)):
        if build[i][j-1] == 0 or build[i][j-1] == 2:
            return True
    if isValid(i+1,j-1,len(build)):
        if build[i+1][j-1] == 0 or build[i+1][j-1] == 2:
            return True
    # ์–‘์ชฝ ๋ ๋ถ€๋ถ„์ด ๋‹ค๋ฅธ ๋ณด์™€ ๋™์‹œ์— ์—ฐ๊ฒฐ๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.
    if isValid(i-1,j,len(build)) and (build[i-1][j] == 1 or build[i-1][j] == 2) and isValid(i+1,j,len(build)) and (build[i+1][j] == 1 or build[i+1][j] == 2):
        return True
    return False

def isPossible(build):
    for i in range(len(build)):
        for j in range(len(build)):
            if build[i][j] == -1:
                continue
            else: # ๋ณด๋‚˜ ๊ธฐ๋‘ฅ์ด ์žˆ๋Š” ๊ฒฝ์šฐ
                if build[i][j] == 0: # ๊ธฐ๋‘ฅ์ธ ๊ฒฝ์šฐ
                    if not canBuildPillow(i,j,build):
                        return False
                        
                if build[i][j] == 1: # ๋ณด์ธ ๊ฒฝ์šฐ
                    if not canBuildBeam(i,j,build):
                        return False
                if build[i][j] == 2: # ๋‘˜๋‹ค ์„ค์น˜
                    if not canBuildPillow(i,j,build):
                        return False
                    if not canBuildBeam(i,j,build):
                        return False
    return True

def solution(n, build_frame):
    
    build = [[-1 for i in range(n+1)] for i in range(n+1)]
    
    for i in range(len(build_frame)):
        x,y,a,b = build_frame[i][0],build_frame[i][1],build_frame[i][2],build_frame[i][3]
        
        # ์ด์ „๊ฐ’ ์ €์žฅ
        tmp = build[x][y]
        
        if b == 0: # ์‚ญ์ œ
            if build[x][y] == 2:
                if a == 0:
                    build[x][y] = 1
                if a == 1:
                    build[x][y] = 0
            else:
                build[x][y] = -1
                
        if b == 1: # ์ƒ์„ฑ
            if build[x][y] == -1:
                build[x][y] = a
            else:
                build[x][y] = 2
            
        if not isPossible(build):
            build[x][y] = tmp
            #print(str(x)+str(y),str(a)+"์„ค์น˜์•ˆํ•จ")
    answer = []
    
    for i in range(len(build)):
        for j in range(len(build)):
            if build[i][j] == 0 or build[i][j] == 1:
                answer.append([i,j,build[i][j]])
            if build[i][j] == 2:
                answer.append([i,j,0])
                answer.append([i,j,1])
    
    return answer
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/02   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
๊ธ€ ๋ณด๊ด€ํ•จ