ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ ๋ฌธ์ ๋งํฌ
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
'Algorithm > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] LV3. ๋ค๋จ๊ณ ์นซ์ ํ๋งค (1) | 2023.01.04 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] Lv2 ํ ์ธ ํ์ฌ (0) | 2022.12.28 |
[ํ๋ก๊ทธ๋๋จธ์ค] Lv2 k์ง์์์ ์์ ๊ฐ์ ๊ตฌํ๊ธฐ (0) | 2022.12.24 |
- Total
- Today
- Yesterday
- ํด๋ฆฐ์ฝ๋
- lombok
- ๋๊ท๋ชจํธ๋ํฝ
- ์๊ณ ๋ฆฌ์ฆ
- spring
- ์ฝ๋ฉํ ์คํธ
- ์๋ฐ
- ํ๋ก๊ทธ๋๋จธ์ค
- jpa
- ๊ตฌํ
- java
- pinpoint
- ์คํ๋ง๋ถํธ
- mysql
- Docker
- springboot
- ํ์ด์ฌ
- apm
- ๋ฐฑ์๋
- jdbc
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |