모든 경우의 수를 다 해보는 방법
영어로 Brute-Force(무식하게 풀기)라고도 한다.
가능한 모든 가짓수를 계산해본다.
입력, 출력 제한이 중요함
어떤 식으로 구현을 할 지 생각한다.
단순 for문 사용, 순열, 재귀(백트래킹) 등이 있다.
답을 구하고, 제출해 본다.
완전 탐색 방법은 무식한 방법으로 사람은 편하지만 기계는 힘들다.
→ 적용하기 전에 시간은 우리가 계산해 주어야한다.
💡 1억번의 연산 = 1초
O(N) : 1억
O(NlogN) : 5백만
O(N^2) : 1만
O(N!) : 11
포커 카드 N장 중 2장을 골라 두 장의 합이 M에 최대한 가까운 합을 구하는 문제
N장 중 2장 고르기 → nC2
n, m = map(int, input().split())
arr = [*map(int, input().split())]
ans = 0
for i in range(n):
for j in range(i+1, n):
sumCard = arr[i] + arr[j]
if abs(sumCard - m) < abs(ans - m):
ans = sumCard
print(ans)
Q. n이 10만 이상이라면?
A. 1초 제한인 문제에서는 시간 초과
N개의 정수로 이루어진 순열 중 사전순으로 M번째 위치한 순열을 구하는 문제
모든 순열의 가짓수 → N!
from itertools import permutations as pm
n, m = map(int, input().split())
arr = [*map(int, input().split())]
print(*sorted([*pm(arr)])[m-1])
itertools 모듈의 permutations을 사용한다.
→ 입력값 순서대로 값을 유지하니 정렬이 필요하다.
Q. n이 12 이상이라면?
A. 12! = 479,001,600으로 1초 제한인 문제에서는 시간초과
9개의 정수가 주어졌을 때, 합이 100이 되는 7개의 정수를 찾는 문제
(단, 항상 답이 유일한 경우만 입력으로 주어짐)
arr = [int(input()) for i in range(9)]
for a in range(9):
for b in range(a+1, 9):
if sum(arr) - arr[a] - arr[b] == 100:
for i in range(9):
# if i != a or i != b:
if i not in [a, b]:
print(arr[i])
아홉난쟁이 중에서 가짜 난쟁이 2명을 찾아야하기 때문에,
중첩 for문으로 가짜 난쟁이 2명을 a, b로 두고 찾으면 문제가 해결된다.
N자리 순열을 사전순으로 순서대로 출력하는 문제
itertools 모듈의 permutations을 사용하면 N자리 순열을 출력할 수 있다.
from itertools import permutations as pm
n = int(input())
arr = [i+1 for i in range(n)]
for ans in pm(arr):
print(*ans)
순열이 아닌 조합을 구하고 싶다면 combinations
중복조합을 구하고 싶다면 combinations_with_replacement
임의의 정수들이 주어졌을 때, 나머지 두 정수를 알아내 식을 완성하는 문제
(a,c) 조합의 개수는 최대 1만개이므로 완전탐색으로 문제를 풀 수 있다.
m, Seed, X1, X2 = map(int, input().split())
for a in range(100):
for c in range(100):
if X1 == (a * Seed + c) % m:
if X2 == (a * (a * Seed + c) % m + c) % m:
print(a, c)
exit()
가능한 답이 여러 개라면, 그 중 아무거나 하나를 출력해도 되기 때문에 exit()로 종료한다.