본문 바로가기

스터디 1일 1커밋

240208 [BOJ/백준] 2798.블랙잭 (+수정)

 

 

https://www.acmicpc.net/problem/2798

 

2798번: 블랙잭

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장

www.acmicpc.net


입력코드

두번째 코드(성공) 

#블랙잭

N, M = map(int, input().split())
data = list(map(int, input().split()))

max_v = 0
for i in range(N):
        for j in range(i+1, N):
            for k in range(j+1, N):
                sum_v = data[i] + data[j] + data[k]
                if  (sum_v <= M) and (sum_v > max_v):
                    max_v = sum_v
print(max_v)

 

첫번째 코드(입력코드1은 제대로 출력되었지만 입력코드2는 틀림)

#블랙잭

N, M = map(int, input().split())
data = list(map(int, input().split()))
data.sort()  #중간에 M을 넘어버리면 False로 바뀌어서 뒤의 카드들을 확인하지 못해 정렬해줌


max_val = 0
found = True
while found:
    for n in range(N-2):   #N-3+1까지의 범위
        sum_val = 0

        for i in range(3):
            sum_val += data[n+i]

        if sum_val > M:
            found = False  # 처음에 found == False를 써서 할당이 아니라 비교로 계속 반복문이 도는 에러가 발생
            break


        if sum_val > max_val:
            max_val = sum_val


print(max_val)

 


결과

백준에 제출은 안했지만 예제에서 틀렸었다가 다시 도전해서 풀었다.


주석에도 달았듯이 처음에 반복문을 빠져 나오지 못하는 상황이 발생했다. 알고보니 found에 False를 재할당한게 아니고 비교? 비슷하게 썼다. 파이참에서 밑줄로 체크된 부분은 꼭 한번 잘 봐야겠다. 그 문제를 해결하고 나니 예제입력1번의 결과는 나왔다.

바로 예제 2번을 입력했지만 출력은 0으로 나왔다. sort()로 정렬을 하지 않아 처음부터 93+181+245에서 500이 넘어서 바로 False가 되며 초기값이 출력됐다. 문제를 알고난 후 sort를 추가했지만 412라는 출력을 얻었다. 문제를 잘못 읽고 연속하는 카드 3장인줄 알고 처음부터 코드를 잘못 짠 것 같다.

일단 브루트포스에 대해 확실하게 알고 있는 것 같지 않아서 잘못 짠 것 같고 다시 어떻게 해야할 지는 감이 오지만 지금 시간이 늦었으므로 여기까지만 도전하려고 한다...ㅎㅎ 다음에 다시 도전하겠다!!

(+ 하루 지나서 브루트포스에 대해 찾아보고 풀어보았다. 브루트포스알고리즘이 용어만 생소하지 평소처럼 그냥 모든 데이터들을 돌아보며 조건에 맞는 결과를 출력하는 것이라고 이해했다. 처음에 문자열로 예제를 풀다보니 너무 어렵게 생각했던 것 같다.)