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장인줄 알고 처음부터 코드를 잘못 짠 것 같다.
일단 브루트포스에 대해 확실하게 알고 있는 것 같지 않아서 잘못 짠 것 같고 다시 어떻게 해야할 지는 감이 오지만 지금 시간이 늦었으므로 여기까지만 도전하려고 한다...ㅎㅎ 다음에 다시 도전하겠다!!
(+ 하루 지나서 브루트포스에 대해 찾아보고 풀어보았다. 브루트포스알고리즘이 용어만 생소하지 평소처럼 그냥 모든 데이터들을 돌아보며 조건에 맞는 결과를 출력하는 것이라고 이해했다. 처음에 문자열로 예제를 풀다보니 너무 어렵게 생각했던 것 같다.)
'스터디 1일 1커밋' 카테고리의 다른 글
| 240212 [BOJ/백준] 2606. 바이러스 (+수정) (1) | 2024.02.13 |
|---|---|
| 240211 [BOJ/백준] 11727. 2 x n 타일링 2 (0) | 2024.02.12 |
| 240206. [BOJ/백준] 1110. 더하기 사이클 (0) | 2024.02.06 |
| 240205. [BOJ/백준] 28445. 알록달록 앵무새 (1) | 2024.02.06 |
| 240204. [BOJ/백준] 2167. 2차원 배열의 합 (0) | 2024.02.06 |