Notice
Recent Posts
Recent Comments
Link
반응형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
Tags
- 백준1026
- 조건문
- AI강의
- C++ 함수
- 9095
- 패스트캠퍼스혁펜하임
- precision
- 혁펜하임
- C++ 공백 입력
- 백준9095
- C++ 백준
- 백준
- AIDEEPDIVE
- 백준C++
- 반복문
- c++ 기초
- 비교연산자
- tensorflow
- 혁펜하임강의후기
- pytorch
- for문
- CUDA
- 백준1463
- 혁펜하임강의
- 패스트캠퍼스
- cuDNN
- 혁펜하임AI
- C++
- 1로만들기
- 1463
Archives
- Today
- Total
코딩하는 덕구 🐶
119. [삼성기출15]Python 백준 15684 번 사다리조작 자세한 설명 본문
728x90
반응형
안녕하세요 코딩하는 덕구입니다.
백준 15684 번 사다리조작 입니다.
먼저 백준 15684 번 사다리조작 정답 코드입니다. 설명은 아래에 있습니다.
n, m, h = map(int, input().split())
board = [[False for _ in range(n + 1)] for _ in range(h + 1)]
for _ in range(m):
a, b = map(int, input().split())
board[a][b] = True
def dfs(depth, x, y):
global ans
if ans <= depth:
return
if check():
ans = min(ans, depth)
for i in range(x, (h + 1)):
if x != i:
y = 1
for j in range(y, n):
if not board[i][j]:
board[i][j] = True
dfs(depth + 1, i, j + 2)
board[i][j] = False
return
def check():
for i in range(1, n + 1):
loc = i
for j in range(1, h + 1):
if board[j][loc]:
loc += 1
elif board[j][loc - 1]:
loc -= 1
if loc != i:
return False
return True
ans = 4
dfs(0, 1, 1)
if ans == 4:
ans = -1
print(ans)
문제 접근
1. dfs 를 통해 다리 3개까지 놓는 모든 경우의 수를 생각한다.
2. 각 경우마다 마다 사다리 조작이 재대로 되었는지 확인한다.
3. 최소값을 업데이트 한다.
Python 코드 구현
사다리를 구현합니다.
n, m, h = map(int, input().split())
board = [[False for _ in range(n + 1)] for _ in range(h + 1)]
for _ in range(m):
a, b = map(int, input().split())
board[a][b] = True
answer 의 줄임말인 ans 에는 최소 값을 저장합니다. 맨 처음에는 4로 초기화 합니다.
최소 다리 개수를 업데이트 하는 재귀함수 dfs를 구현합니다.
1. 사다리의 다리는 3개 까지 추가가 가능하므로 4개 이상이면 함수를 실행시키지 않습니다.
2. ans보다 다리 개수가 많으면 return 합니다.
3. check를 통해 사다리 조작이 되었다면 ans와 현재 사다리의 다리 개수를 비교하여 최소값을 ans에 업데이트 합니다.
for문 에서는 다리를 놓을 수 있는 모든 위치에 다리를 놓고 depth(다리 개수)를 1 추가 한 후 dfs를 재귀적으로 실행시킵니다.
x != i 일때 y=1인 이유는 x(높이)가 달라지면 1부터 다시 체크해야되기 때문입니다.
j + 2인 이유는 다리는 같은 가로선에 이어서 놓을 수 없기 때문입니다.
def dfs(depth, x, y):
global ans
if ans <= depth:
return
if check():
ans = min(ans, depth)
for i in range(x, (h + 1)):
if x != i:
y = 1
for j in range(y, n):
if not board[i][j]:
board[i][j] = True
dfs(depth + 1, i, j + 2)
board[i][j] = False
return
ans가 4이면 (업데이트 되지 않았단 이야기는 4 이상의 사다리가 필요하단 뜻 이므로)
-1 출력
아니라면 ans를 출력합니다.
ans = 4
dfs(0, 1, 1)
if ans == 4:
ans = -1
print(ans)
파이썬 백준 15684 번 사다리조작 최종 코드입니다.
n, m, h = map(int, input().split())
board = [[False for _ in range(n + 1)] for _ in range(h + 1)]
for _ in range(m):
a, b = map(int, input().split())
board[a][b] = True
def dfs(depth, x, y):
global ans
if ans <= depth:
return
if check():
ans = min(ans, depth)
for i in range(x, (h + 1)):
if x != i:
y = 1
for j in range(y, n):
if not board[i][j]:
board[i][j] = True
dfs(depth + 1, i, j + 2)
board[i][j] = False
return
def check():
for i in range(1, n + 1):
loc = i
for j in range(1, h + 1):
if board[j][loc]:
loc += 1
elif board[j][loc - 1]:
loc -= 1
if loc != i:
return False
return True
ans = 4
dfs(0, 1, 1)
if ans == 4:
ans = -1
print(ans)
백준 15684 번 사다리조작 자세한 설명 및 Python 코드였습니다.
감사합니다.
728x90
반응형
'알고리즘 문제 풀이' 카테고리의 다른 글
121. [삼성기출17]Python 백준 15686 번 치킨 배달 자세한 설명 (0) | 2023.05.30 |
---|---|
120. [삼성기출16]Python 백준 15685 번 드래곤 커브 자세한 설명 (0) | 2023.05.26 |
118. [삼성기출14]Python 백준 15683 번 감시 자세한 설명 (0) | 2023.05.16 |
117. [삼성기출13]Python 백준 14891 번 톱니바퀴 자세한 설명 (0) | 2023.05.09 |
116. [삼성기출12]Python 백준 14890 번 경사로 자세한 설명 (0) | 2023.04.17 |