본문 바로가기

PS/BOJ : 단계별로 풀어보기

백준 [단계별로 풀어보기]: (12단계) "브루트 포스", python

반응형

백준 [단계별로 풀어보기]: (12단계) "브루트 포스", python

 

1. 문제번호 및 정답비율

12단계 브루트 포스: 문제번호 및 정답 비율

 

2. 문제별 필요 지식 및 풀이 포인트

더보기

#블랙잭 2798
3중for문 안 쓰는법 찾아보기(시간복잡도때문)

from itertools import combinations

 

#분해합 2231
map(int, str(i))의 의미 알기

 

# 수학은 비대면강의입니다 19532

import numpy as np
C = np.linalg.inv(A) #파이썬 역행렬 구하는 함수: np.linalg.inv()
D = np.dot(C,B)      #행렬의곱 구하는 함수: np.dot(A,B)

 

#체스판 다시 칠하기 1018
나중에 다시 풀기

 

#영화감독 숌 1436

핵심은 if 666 in str(EndNum)의 의미 파악

 

3. 문제별 풀이 코드

#블랙잭 2798
from itertools import combinations
'''3중for문 안 쓰는법 찾아보기(시간복잡도때문)'''
n, m = map(int, input().split()) #카드개수, 최대값
n_num = list(map(int, input().split()))

result = 0
for i in range(n):
    for j in range(i+1,n):
        for k in range(j+1,n):
            if n_num[i] + n_num[j] + n_num[k] > m:
                continue
            else:
                result = max(result, n_num[i] + n_num[j] + n_num[k])
print(result)

'''combinations(조합)을 이용한 풀이
https://duwjdtn11.tistory.com/297참고'''
n, m = map(int, input().split()) #카드개수, 최대값
n_num = list(map(int, input().split()))
result = 0

for i in combinations(n_num, 3): #combinations를 list()로 감싸면, 튜플()값을 빼기 어려우니까
    temp = sum(i)                #for문으로 원소값을 추출하여 합을 임시temp에다 넣어주고 부등식조건 달기
    if result < temp <= m:
        result = temp
print(result)


#분해합 2231
'''다시풀기'''
'''map(int, str(i))의 의미 알기'''
#198의 분해합 = 198+1+9+8 = 216
#n = m + m//100 + m//10 + m%10 (X 접근방식이 잘못됌)
n = int(input()) #216

for i in range(1, n+1): #(n):이면 오류
    nums =  list(map(int, str(i))) #'''map(int, str(i)): 문자열의 각 자리수를 정수로 변경해주는 코드 ex)'123'->1, 2, 3'''
    result = i + sum(nums) #분해합result = 생성자i + 각자리수 합sum(nums)

    if result == n:
        print(i)
        break
    if i == n: #생성자 없는 경우, 0출력
        print(0)


# 수학은 비대면강의입니다 19532
a,b,c,d,e,f = map(int, input().split())

for x in range(-999,1000):
    for y in range(-999,1000):
        if a*x + b*y == c and d*x + e*y == f:
            print(x,y,end=' ')
            break

''' numpy 사용 시, 런타임에러발생
import numpy as np
A = np.array([[a,b],[d,e]])
B = np.array([c,f])
C = np.linalg.inv(A) #파이썬 역행렬 구하는 함수: np.linalg.inv()
D = np.dot(C,B)      #행렬의곱 구하는 함수: np.dot(A,B)
for i in D:
    print(round(i), end=' ')
'''
''' 행렬식
ax + by = c
dx + ey = f
    ae-bd != 0
x = e -b )(c = ce-bf
y  -d  a   f = -cd-af
'''


#체스판 다시 칠하기 1018
'''어려움'''
'''나중에 다시 풀기'''
n, m = map(int, input().split()) # MxN

row = []
for i in range(n):


#영화감독 숌 1436
#666이 들어가는 n번째 수 찾기 ex) 5666 다음 큰 수는 6660 이다.
'''핵심은 if 666 in str(EndNum)의 의미 파악'''
n = int(input())

cnt = 0
EndNum = 666 #int(종말번호)

while True:
    if '666' in str(EndNum): #str(종말번호) 안에 666이 포함되어 있다면
        cnt += 1
    if cnt == n: #카운트값이 입력값과 같다면
        print(EndNum) #종말번호 출력
        break #while문 탈출
    EndNum += 1 #종말번호 1씩 증가: 667 668 .. 1666 .. 5666 .. 6000 .. 6660 ..
        row.append(input())
        

#설탕 배탈 2839
'''cnt=[5,3]으로 하는 것은 봉지별 개수 구할 때나 사용'''
n = int(input()) #18
cnt = 0
while n >= 0: #설탕이 0kg이상 일때까지 반복
    if n%5 == 0:
        cnt += n//5
        print(cnt)
        break
    n -= 3 #5의 배수가 될 때까지 설탕-3kg, 봉지+1개
    cnt += 1
else: #설탕이 0이 될때까지 나누어 떨어지지 않은 경우 else문 출력
    print(-1)
반응형