[알고리즘 기초] - 500 - 브루트 포스

양진혁·2022년 12월 16일
0

백준

목록 보기
21/21

2309_일곱 난쟁이

⭕풀이:

array = []

for i in range(9):
    array.append(int(input()))

array.sort()
sum_ = sum(array)

for i in range(len(array)):
    for j in range(i + 1, len(array)):
        if sum_ - array[i] - array[j] == 100:
            for k in range(len(array)):
                if k == i or k == j:
                    pass
                else:
                    print(array[k])
            exit()



⭕풀이설명:

sum_ - array[i] - array[j] == 100

문제는 9명 중에 7명을 뽑아서 그 합이 100이면 해당하는 7개의 값을 출력하는 문제입니다.
7개를 무작위로 뽑아서 하나씩 모두 더해 100이 나오면 해당 값을 출력하면 되지만,
좀 더 쉽게 9명 중 2명을 뽑아 해당 값을 전체 합에서 빼서 100이라면 훨씬 줄일 수 있습니다.

9개 중 7개의 합 ( x )
9개 총합에서 2개 뺄셈 ( o )


3085_사탕 게임

⭕풀이:

import sys
input = sys.stdin.readline

def check(arr):
    n = len(arr)
    answer = 1

    for i in range(n):
        # 열 순회하면서 연속되는 숫자 세기
        cnt = 1
        for j in range(1, n):
            if arr[i][j] == arr[i][j - 1]:
                # 이전 것과 같다면 cnt에 1 더하기
                cnt += 1
            else:
                # 이전과 다르다면 다시 1로 초기화
                cnt = 1

            # 비교해서 현재 cnt가 더 크다면 answer 갱신하기
            if cnt > answer:
                answer = cnt

        # 행 순회하면서 연속되는 숫자 세기
        cnt = 1
        for j in range(1, n):
            if arr[j][i] == arr[j - 1][i]:
                # 이전 것과 같다면 cnt에 1 더하기
                cnt += 1
            else:
                # 이전과 다르다면 다시 1로 초기화
                cnt = 1

            # 비교해서 현재 cnt가 더 크다면 answer 갱신하기
            if cnt > answer:
                answer = cnt

    return answer


n = int(input())
arr = [list(input()) for _ in range(n)]
answer = 0

for i in range(n):
    for j in range(n):
        # 열 바꾸기
        if j + 1 < n:
            # 인점한 것과 바꾸기
            arr[i][j], arr[i][j + 1] = arr[i][j + 1], arr[i][j]

            # check는 arr에서 인점한 것과 바꿨을 때 가장 긴 연속한 부분을 찾아내는 함수이다
            temp = check(arr)

            if temp > answer:
                answer = temp

            # 바꿨던 것을 다시 원래대로 돌려놓기
            arr[i][j], arr[i][j + 1] = arr[i][j + 1], arr[i][j]

        # 행 바꾸기
        if i + 1 < n:
            # 인점한 것과 바꾸기
            arr[i][j], arr[i + 1][j] = arr[i + 1][j], arr[i][j]

            # check는 arrd에서 인점한 것과 바꿨을 때 가장 긴 연속한 부분을 찾아내는 함수이다
            temp = check(arr)

            if temp > answer:
                answer = temp

            # 바꿨던 것을 다시 원래대로 돌려놓기
            arr[i][j], arr[i + 1][j] = arr[i + 1][j], arr[i][j]

print(answer)



⭕풀이설명:

함지의 개발일기


1476_날짜 계산

⭕풀이:

E, S, M, cnt = 1, 1, 1, 1

i_E, i_S, i_M = map(int, input().split())

while (True):
    if i_E == E and i_S == S and i_M == M:
        break
    E += 1
    S += 1
    M += 1
    cnt += 1
    if E >= 16:
        E -= 15
    if S >= 29:
        S -= 28
    if M >= 20:
        M -= 19

print(cnt)



⭕풀이설명:

  • while문을 통해, 1씩 증가시켜가며, 문제의 조건에 맞게 1년. 2년. 3년.... 카운팅합니다. (브루트포스)
  • 입력받은 년도가 된다면, break, 출력

1107_리모컨

⭕풀이:

import sys

input = sys.stdin.readline
channel = int(input())
n = int(input())
broken = list(map(int, input().split()))

min_count = abs(100 - channel)

for nums in range(1000001):
    nums = str(nums)

    for i in range(len(nums)):
        if int(nums[i]) in broken:
            break
        elif i == len(nums) - 1:
            min_count = min(min_count, abs(int(nums) - channel) + len(nums))
print(min_count)



⭕풀이설명:

1) 최대 경우의 수
min_count = abs(100 - channel)

현재 채널에서 + 혹은 - 만 사용해 이동하는 최대 경우의 수를 구합니다.

2) 문자열 변수선언
for nums in range(1000001):
	nums = str(nums)

1,000,000의 범위에 있는 모든 수를 문자열로 바꿔 이를 nums로 변수선언합니다.

3) 고장난 숫자 검열
for i in range(len(nums)):
	if int(nums[i]) in broken:
    	break

문자열로 된 모든 숫자 중 고장난 숫자를 포함한 숫자가 있는지 확인 후, 고장 났으면 break로 if문을 중단합니다.

4) min_count 업데이트
elif i == len(nums) - 1:
	min_count = min(min_count, abs(int(nums) - channel) + len(nums))

고장난 숫자가 없는 숫자는 min_count 와 비교 후 min_count 로 업데이트합니다.

+α ) range = 1,000,000인 이유

우선, range를 N의 최대 범위인 500,000이 아닌 그 두 배 1,000,000로 해준 것은, 수빈이가 이동하려는 채널의 범위는 500,000 이하이지만 채널 자체는 무한대라는 점 때문입니다.

따라서, channel과 가장 가까운 숫자를 찾을 때, channel보다 작은 값은 물론이고 channel보다 큰 값도 찾아줘야 하고, 이 값은 500,000 이상도 가능합니다.

만약에 수빈이가 이동하려는 채널이 500,000이고, 리모컨의 숫자 중 1, 2, 3, 4, 5 가 고장났다고 가정해본다면,
range의 범위가 500,000으로 제한되면, 시작점인 100번에서 +만 눌러서 500,000까지 도달하는 총 499,900번 버튼을 클릭하게 할 것입니다.

하지만 이 방법이 최적의 해가 아닙니다.

600,000에서 -를 100,000번 눌러 channel에 도달하는 것이 최적의 해가 될 것입니다.

이러한 이유 때문에 range를 1,000,000까지로 설정해주어야 합니다.


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

0개의 댓글