자료구조 및 알고리즘/백준

[python] 2798. 블랙잭

viamemine 2023. 7. 25. 13:57
728x90
반응형

 

  • 문제


 

 

  • 잘못된 풀이
N, M = map(int, input().split())
num = list(input().split())
result = list()

for i in num[:-2]: 
    for j in num[1:-1]:
        for k in num[2:]:
            if i==j or j==k or i==j:
                continue
            # print(i, j, k)
            if int(i)+int(j)+int(k) <= int(M):
                result.append(int(i)+int(j)+int(k))
            else:
                break
print(max(result))

 

해당 문제는 N장의 카드에서 3장을 뽑아 더한 값이 M보다 작으면서 가장 큰 값을 구하는 문제이다.

 

나는 for문의 range를 잘못 설정하였다.

코드를 작성하기 전, 알고리즘을 손으로 구현하였을 때는 올바르게 작성하였지만 코드로 작성할 때 범위를 잘못 설정하였다.

 

j는 i보다 커야하고, k도 j보다 커야함을 간과하고 있었다.

i, j, k를 출력해서 확인해보니 뽑았던 카드를 또 뽑은 문제가 있었다.

따라서 i==j, j==k, i==k로 해결할 수 있다고 생각했지만 이것이 문제가 아니였다.

 

 

 

  • 올바른 풀이
N, M = map(int, input().split())
lst = list(map(int, input().split()))
nlst = []

for i in range(N):
    for j in range(i+1, N):
        for k in range(j+1, N):
            # print(lst[i],lst[j],lst[k])
            three =  lst[i] + lst[j] + lst[k]
            if three > M:
                continue
            else:
                nlst.append(three)
print(max(nlst))

 

따라서 나는 삼중 for문의 범위를 다음과 같이 알맞게 설정하였고, 문제를 해결할 수 있었다.

 

이번 문제는 어렵지 않아서, 빠른 시간 내에 문제점을 찾고 해결할 수 있었다.

 

 

 

728x90

'자료구조 및 알고리즘 > 백준' 카테고리의 다른 글

[python] 19532. 수학은 비대면강의입니다.  (0) 2023.07.26
[python] 2231. 분해합  (0) 2023.07.25
[python] 1149. RGB거리  (0) 2023.03.02
[python] 1912. 연속합  (0) 2023.03.01
[python] 1904. 01타일  (0) 2023.02.20