가장 간단한 알고리즘인, 모든 경우의 수를 검사하는 브루트 포스 알고리즘을 배워 봅시다.
■ 백준 2798 블랙잭_브론즈 2 (복습)
# def combination(arr, r):
# arr = sorted(arr)
#
# def generate(chosen):
# global max, m
# if len(chosen) == r:
# if max < sum(chosen) <= m:
# max = sum(chosen)
# return
#
# start = arr.index(chosen[-1]) + 1 if chosen else 0
# for next in range(start, len(arr)):
# chosen.append(arr[next])
# generate(chosen)
# chosen.pop()
# generate([])
#
# n, m = map(int, input().split())
# n_li = list(map(int, input().split()))
# max = 0
# combination(n_li, 3)
# print(max)
# yield를(generator) 사용한 조합
def combination_2(arr, r):
for i in range(len(arr)):
if r == 1:
yield [arr[i]]
else:
for next in combination_2(arr[i+1:], r-1):
yield [arr[i]] + next
n, m = map(int, input().split())
n_li = list(map(int, input().split()))
max = 0
for i in combination_2(n_li, 3):
if max < sum(i) <= m:
max = sum(i)
print(max)
# #고수코드: for문으로 구현. nC3이라서 이렇게 구할 수 있었던 것 같다.
# N, M = map(int, input().split())
# arr = sorted(list(map(int, input().split())), reverse=True)
#
# mx = 0
# for i in range(N-2):
# for j in range(i+1, N-1):
# for k in range(j+1, N):
# s = arr[i]+arr[j]+arr[k]
# if s<=M:
# if mx < s: mx = s
# break
# print(mx)
■ 백준 2231 분해합_브론즈2
# 자연수 길이 구하는 법: https://shoark7.github.io/programming/algorithm/3-ways-to-get-length-of-natural-number
# len(str(n)), int(math.log10(n))+1, n//10 카운트
# [Pseudo code]
# n의 생성자는 n보다 작다
# 처음부터 끝까지 생성자를 구하다가 처음으로 n이 되면 출력하고 스탑
# n = int(input())
# for i in range(n-len(str(n))*9, n+1):
# new = 0
# n_i = i
# if i <= 0: continue
# else:
# while 1:
# new += n_i%10
# if not n_i//10: break
# n_i //= 10
# if i+new == n:
# print(i)
# break
# elif i >= n:
# print(0)
# break
#고수코드: 자연수 n을 문자열로 만들었다가 int 취해서 split
n = int(input())
ans = 0
for i in range(max(0, n-len(str(n))*9), n):
if sum(map(int, str(i))) + i == n:
ans = i
break
print(ans)
■ 백준 19532 수학은 비대면강의입니다_브론즈 2
# pseudo_code
# 연립방정식으로 x,y으로 도출: 실패!
# 그러기 위해선 최소 공배수를 알아야함
# def x_y(a,b,c,d,e):
# for x in range(-999, 1000):
# for y in range(-999, 1000):
# if a * x + b * y == c and d * x + e * y == f:
# return x,y
# a, b, c, d, e, f = map(int, input().split())
# print(*x_y(a,b,c,d,e))
#고수코드: 역행렬과 연립방정식을 이용하는거 같은데 아직은 모르겠다.
a,b,c,d,e,f = map(int, input().split())
print(*((e*c-b*f)//(a*e-b*d), (a*f-c*d)//(a*e-b*d)))
■ 백준 1018 체스판 다시 칠하기_실버 4 (복습)
# [문제의도]
# 8*8 이상의 배열에서 바꿔야 하는 게 최소가 되는 8*8 구간을 정하고
# 바꾸는데 든 최솟값을 출력
# [Pseudo code]
# 8*8로 쪼개지는 모든 경우의 수에서
# 흑 또는 백으로 시작하는 패턴 두 개의 변환값을 구함
# 모든 경우의 최소 변환값을 min으로 도출
# [꿀팁]
# 행과 열의 인덱스 합에 따라 짝수, 홀수의 라인이 정해진다.
# https://god-gil.tistory.com/62
def chess(x, y):
w_st = 0
b_st = 0
for k in range(x, x+8):
for l in range(y, y+8):
if (k+l)%2 == 0:
if c[k][l] != 'W': w_st += 1
if c[k][l] != 'B': b_st += 1
else:
if c[k][l] != 'W': b_st += 1
if c[k][l] != 'B': w_st += 1
return w_st, b_st
n, m, *c = open(0).read().split(); n, m = int(n), int(m)
result = []
for i in range(n-7):
for j in range(m-7):
result.extend(chess(i, j))
print(min(result))
■ 백준 1436 영화감독 숌_실버 5
# n = int(input())
# cnt = 0
# for i in range(666, int(str(n)+"666")+1):
# if str(i).find("666") >= 0:
# cnt += 1
# if cnt == n:
# ans = i
# break
# print(ans)
# 고수코드: 리스트에 10000번째 종말의 수를 인덱스에 맞게 넣어놓고 n인덱싱
s,n=[666],1
while(len(s)<10000):
m=n*1000
if(n%1000==666):s+=[m+i for i in range(1000)]
elif(n%100==66):s+=[m+600+i for i in range(100)]
elif(n%10==6):s+=[m+660+i for i in range(10)]
else:s+=[m+666]
n+=1
print(s[int(input())-1])
■ 백준 2839 설탕 배달_실버 4
# n = int(input())
# li = []
# for i in range(n//5+1):
# for j in range(n//3+1):
# if 5*i + 3*j == n:
# li.append(i+j)
# print(-1 if li == [] else min(li))
# 고수코드: 3을 빼다보면 5의 배수가 나오는데 그때 몫으로 계산
x = int(input())
cnt = 0
while x >= 0:
if x%5 == 0:
cnt += x//5
print(cnt)
break
x -= 3
cnt += 1
else:
print(-1)
'알고리즘 > 백준' 카테고리의 다른 글
백준_단계별로 풀어보기_16단계_스택, 큐, 덱 (1) | 2023.09.28 |
---|---|
백준_단계별로 풀어보기_13단계_정렬 (0) | 2023.09.11 |
백준_단계별로 풀어보기_19단계_조합론 (0) | 2023.08.11 |
백준_단계별로 풀어보기_15단계_약수, 배수와 소수 2 (1) | 2023.08.11 |
백준_단계별로 풀어보기_14단계_집합과 맵 (1) | 2023.07.26 |