백준_단계별로 풀어보기_12단계_브루트 포스

브루트 포스 단계 (acmicpc.net)

가장 간단한 알고리즘인, 모든 경우의 수를 검사하는 브루트 포스 알고리즘을 배워 봅시다.

 

브루트 포스 단계

한때는 이 문제가 "기본 수학 1" 단계에 있었지만, 사실 브루트 포스로 푸는 게 더 쉽습니다.

www.acmicpc.net


■ 백준 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)