백준 python 2580번 스도쿠
입력
아홉 줄에 걸쳐 한 줄에 9개씩 게임 시작 전 스도쿠판 각 줄에 쓰여 있는 숫자가 한 칸씩 띄워서 차례로 주어진다. 스도쿠 판의 빈 칸의 경우에는 0이 주어진다. 스도쿠 판을 규칙대로 채울 수 없는 경우의 입력은 주어지지 않는다.
출력
모든 빈 칸이 채워진 스도쿠 판의 최종 모습을 아홉 줄에 걸쳐 한 줄에 9개씩 한 칸씩 띄워서 출력한다.
스도쿠 판을 채우는 방법이 여럿인 경우는 그 중 하나만을 출력한다.
제한
baekjoon의 백트래킹 알고리즘으로 풀 수 있는 입력만 주어진다. 다음은 그 알고리즘의 수행 시간이다.
C++14: 80ms
Java: 292ms
PyPy3: 1172ms
Python |
def AbleNumber(n, m):
ableNumber = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for i in range(9):
if graph[n][i] in ableNumber:
ableNumber.remove(graph[n][i])
for i in range(9):
if graph[i][m] in ableNumber:
ableNumber.remove(graph[i][m])
sub_n = n // 3
sub_m = m // 3
for i in range(sub_n * 3, sub_n * 3 + 3):
for j in range(sub_m * 3, sub_m * 3 + 3):
if graph[i][j] in ableNumber:
ableNumber.remove(graph[i][j])
return ableNumber
graph = [list(map(int, input().split())) for _ in range(9)]
def BackT(idx):
if idx == 81:
return True
for i in range(idx, 81):
sub_n = i // 9
sub_m = i % 9
if graph[sub_n][sub_m] != 0:
if i == 80:
return True
continue
ableNumber = AbleNumber(sub_n, sub_m)
for j in ableNumber:
graph[sub_n][sub_m] = j
if BackT(i + 1):
return True
graph[sub_n][sub_m] = 0
return False
BackT(0)
for i in range(9):
for j in range(9):
print(graph[i][j], end=' ')
print()
백준 pyton 14888번
입력
첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(×)의 개수, 나눗셈(÷)의 개수이다.
출력
첫째 줄에 만들 수 있는 식의 결과의 최댓값을, 둘째 줄에는 최솟값을 출력한다. 연산자를 어떻게 끼워넣어도 항상 -10억보다 크거나 같고, 10억보다 작거나 같은 결과가 나오는 입력만 주어진다. 또한, 앞에서부터 계산했을 때, 중간에 계산되는 식의 결과도 항상 -10억보다 크거나 같고, 10억보다 작거나 같다.
Python |
n = int(input())
number = list(map(int, input().split()))
operator = list(map(int, input().split()))
result_max = -1e9
result_min = 1e9
def BackTrack(index, start):
global result_max, result_min
if index == n - 1:
result_max = max(start, result_max)
result_min = min(start, result_min)
return
for i in range(4):
if operator[i % 4] == 0:
continue
operator[i % 4] -= 1
BackTrack(index + 1, Operator(start, number[index + 1], i % 4))
operator[i % 4] += 1
def Operator(x, y, oper):
if oper == 0:
return x + y
elif oper == 1:
return x - y
elif oper == 2:
return x * y
else:
if x < 0:
result = (-x) // y
return -result
else:
return x // y
BackTrack(0, number[0])
print(result_max)
print(result_min)
백준 python 6603번
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로 주어진다.
입력의 마지막 줄에는 0이 하나 주어진다.
출력
각 테스트 케이스마다 수를 고르는 모든 방법을 출력한다. 이때, 사전 순으로 출력한다.
각 테스트 케이스 사이에는 빈 줄을 하나 출력한다.
Python |
i = 1
while True:
globals()['lotto{}'.format(i)] = list(map(int, input().split()))
if globals()['lotto{}'.format(i)][0] == 0:
break
globals()['visited{}'.format(i)] = [False] * (globals()['lotto{}'.format(i)][0] + 1)
i += 1
result = list()
def BackTracking(depth, start, lotto, visited):
global string
if depth == 6:
print(' '.join(map(str, result)))
return
for i in range(start, lotto[0]+1):
if visited[i]:
continue
visited[i] = True
result.append(lotto[i])
BackTracking(depth+1, i, lotto, visited)
result.pop()
visited[i] = False
for i in range(1, i):
BackTracking(0, 1, globals()['lotto{}'.format(i)], globals()['visited{}'.format(i)])
print()
'알고리즘 백준문제풀기' 카테고리의 다른 글
백준 python 7576번 토마토/ 14503번 로봇청소기 / 2206번 벽부수고이동하기 (0) | 2022.02.03 |
---|---|
백준 python 1759번 / 20208번 / 1149번풀이 (0) | 2022.02.02 |
백준 python 1697번 숨바꼭질 / 백준 15649번 / (0) | 2022.01.30 |
백준 python 1260번 DFS -BFS / 2606번 바이러스 / 2667번 단지번호 (0) | 2022.01.27 |
백준 python 1463번 1로만들기 / 2579번 계단오르기 / 백준 1932번 정수 삼각형 (0) | 2022.01.26 |
댓글