[단계별로 풀어보기] - 부르트 포스

양진혁·2022년 11월 18일
0

백준

목록 보기
11/21

2798_블랙잭

⭕풀이:

N, M = map(int, input().split())  #카드의 개수 N, 목표숫자 M을 입력받는다.
lst = list(map(int, input().split()))  #카드의 숫자 N개를 입력받아 lst에 넣는다.
n_list = []  #N개의 카드를 3번씩 더할 수 있는 모든 경우에서 그 합이 M보다 작은 숫자들을 n_list에 넣기 위해 비어있는 리스트를 만들어 둔다.
for i in range(N):
    for j in range(i + 1, N):
        for k in range(j + 1, N):
            sum = lst[i] + lst[j] + lst[k]  #lst = [5, 6, 7, 8, 9]라면, 순서대로 sum = 5 + 6 + 7, 5 + 6 + 8, 5 + 6 + 9...로 진행된다.
            if sum > M:  #만약, sum이 M보다 클 경우, 구하고자 하는 값(n_list)은 M보다 작거나 같아야 하기 때문에
                continue  #반복을 계속하고,
            else:  #그렇지 않고, sum이 M보다 작을 경우, 
                n_list.append(sum)  #n_list에 넣는다.
print(max(n_list))  #그 중 가장 M과 가까운 숫자를 출력하기 위해 M보다 작거나 같은 숫자들로 이루어진 리스트에서 가장 큰 숫자를 출력하면 된다. 

2231_분해합

⭕풀이:

N = int(input())
result = 0

for i in range(1, N + 1):  #0은 정수가 아니므로, 1 ~ 주어진 값, N까지 i에 대입해 반복한다.
    a = list(map(int, str(i)))  #i를 문자열로 바꿔 각 자릿수(100의 자리 10의 자리 등)를 하나씩 정수로 바꿔 a라는 리스트에 담는다.
    s = i + sum(a)  #s는 i에 a리스트의 총합을 더한 값이다(=i의 분해합을 구한다.)
    if (s == N):  #i의 분해합인 s가 주어진 값 N과 같을 때,(=i가 1 ~ N 사이에 있는 N의 생성자라면,)
        result = i  #1부터 N까지 하나씩 반복해서 N의 생성자를 찾는 과정이기에 1부터 N사이에서 처음으로 나온 N의 생성자 값이 i이고, result = i이다. 
        break

print(result)



📌필요지식

1) 부르트 포스

  • 완전탐색 알고리즘으로 가능한 모든 경우의 수를 모두 탐색하면서 요구조건에 충족되는 결과만을 가져옵니다. 이 알고리즘의 강점으로 예외 없이 100%의 확률로 정답만을 출력합니다.
  • 알고리즘 설계의 가장 기본적인 접근 방법은 해가 존재할 것으로 예상되는 모든 영역을 전체 탐색하는 방법입니다.

7568_덩치


⭕풀이:

people = int(input())
people_list = []


for _ in range(people):  #사람 인원 수만큼 아래를 반복한다.
    x, y = map(int, input().split())  #몸무게와 키를 x와 y에 입력한다.
    people_list.append((x, y))  #(몸무게, 키)형태로 몸무게와 키값을비어 있는 people 리스트에 넣는다.

for i in people_list:  #((몸무게, 키), (몸무게, 키), (몸무게, 키),..)를 i에 (몸무게, 키)를 하나씩 대입해 반복한다.
    rank = 1  #등수는 1부터 시작해 if문의 조건을 통해 1씩 더한다. 
    for j in people_list:  #i와 같은 형태((몸무게, 키), (몸무게, 키), (몸무게, 키),..)로 j에 대입해 반복한다.
        if i[0] < j[0] and i[1] < j[1]:  #i[0]과 j[0]은 사람들의 몸무게 값이고, i[1]과 j[1]은 사람들의 키값이다.
            rank += 1  #i와 j가 people_list의 사람들의 몸무게와 키값을 서로 비교하며 비교당하는 값이 몸무게와 키가 더 작을 때, 덩치가 큰 사람이 나보다 한 사람 있다라는 뜻으로 등수에 1을 더한다.
    print(rank, end='')  #해당 비교당하는 사람의 등수를 end=''를 통해 한 칸씩 띄워 출력해라.

1018_체스판 다시 칠하기




⭕풀이:

N, M = map(int, input().split())
original = []
count = []

for _ in range(N):  #주어진 값 N은 행렬의 행의 길이로 행의 길이만큼 행을 반복 입력하게 한다.
    original.append(input())  #주어진 값들 모두를 original 리스트에 넣는다.

for a in range(N - 7):  #N*M만큼의 보드를 받아와서 적어도 8*8(체크판의 크기)로 잘라야 하기 때문에 행으로 N-7=a, 
    for b in range(M - 7):  #열로 M-7=b만큼 고정시켜 a는 행, b는 열의 시작점을 가르키고, 하나의 체크판을 검사할 수 있다.
        index1 = 0  #index1은 'W'로 시작할 경우 바뀐 체스 판의 갯수를 세기 위함이고
        index2 = 0  #index2는 'B'로 시작할 경우 바뀐 체스 판의 갯수를 세기 위함이다.
        for i in range(a, a + 8):  #행의 시작점, a
            for j in range(b, b + 8):  #열의 시작점 b를 기준으로 모두 8칸씩 체크한다.
                if (i + j) % 2 == 0:  #체크 중인 현재 행의 번호 i, 현재 열의 번호 j의 합이 짝수이면 시작점의 색깔과 같아야 하고, 홀수이면 시작점의 새깔과 다른 색이어야 한다. 이를 이용하면 만약 (i+j)의 합이 짝수일 경우, W가 아니라면 index1에 1을 더하고, B가 아니라면 index2에 1을 더한다. else문은 (i+j)의 합이 홀수인 경우로, 시작점의 색깔과 다르지 않은 경우를 체크한다.
                    if original[i][j] != 'W':
                        index1 += 1
                    if original[i][j] != 'B':
                        index2 += 1
                else:
                    if original[i][j] != 'B':
                        index1 += 1
                    if original[i][j] != 'W':
                        index2 += 1
        count.append(min(index1, index2))  #'W'로 시작할 경우와 'B'로 시작할 경우 바뀐 체스판의 수 중 작은 수를 count 리스트에 더해준다.
print(min(count))  #모든 경우의 수를 다 체크한 후, count 중 제일 작은 수를 출력하고 프로그램을 종료한다.


출처.
https://bambbang00.tistory.com/43
https://god-gil.tistory.com/62


1436_영화감독 숌


⭕풀이:

n = int(input())  #순번을 n에 입력하고,
cnt = 0  #순서를 세어줄 변수 cnt를 변수선언한다.
six_n = 666  #six_n은 666이 들어가는 숫자 중 가장 작은 숫자이므로, 굳이 1부터 시작할 필요 없이 six_n을 666으로 변수선언해 범위를 줄일 수 있다.

while True:
    if '666' in str(six_n):  #연속된 숫자 666이 whilw문을 통해 반복될 숫자에 포함되어 있는지 확인하기 위해 정수 666이 아닌 문자열 '666'과 정수 six_n이 아닌 문자열 six_n에 '666'이 포함되어 있는지 확인하고, 
        cnt += 1  #있다면, 그 수는 우리가 찾고자 하는 cnt번째 666을 포함한 숫자이므로 cnt에 1을 더한다.
    if cnt == n:  #또한, cnt(666을 포함한 숫자들의 순서)가 주어진 입력값 n(찾고자 하는 n번째)과 같다면
        print(six_n)  #해당 숫자 six_n을 출력해라.
        break  #if문은 그 즉시 종료한다.
    six_n += 1  #위 2개의 if문을 six_n이 충족하지 못할 경우(666을 포함하지 않는 숫자일 경우), 1씩 더해 666을 포함하는 숫자가 나올 때까지 while문을 통해 반복할 것이다.

profile
타이밀크티는 맛있습니다.

0개의 댓글