[python_파이썬_pass]백준_2798번_블랙잭_풀이

2024. 4. 27. 23:20코드리뷰

728x90
반응형

공부하는허딩크 : https://www.youtube.com/live/qRYajWJrQv8?feature=shared

문제는 단순하다.

3장의 카드를 꺼내서 주어진 M대비 같거나 작은 숫자들 중에서 가장 큰 수를 뽑아내면 된다.

itertools 라이브러리가 생각은 나는데 아직 머리속에 정확히 정립이 되지 않아 무식하게 해결해보려고 한다.

3장의 카드를 뽑아내는거니까 삼중 for문으로 돌려서 카드 번호를 리스트로 만들어서 중복카드가 계산되지 않게 조건으로 걸러주고, 또 M보다 큰 경우도 걸러주면 답이 나올 것 같다. 

 

<첫번째 시도 : 정답>

import sys
input = sys.stdin.readline


N, M = map(int, input().split())
A = list(map(int, input().split()))
answer = []

for i in range(N):
    for j in range(N):
        for k in range(N):
            if i == j or j == k or i == k:
                continue
            else:
                if A[i] + A[j] + A[k] > M:
                    continue
                else:
                    answer.append(A[i] + A[j] + A[k])
print(max(answer))

 

<두번째 시도 : 정답>

import sys
input = sys.stdin.readline


N, M = map(int, input().split())
A = list(map(int, input().split()))
answer = []

for i in range(N):
    for j in range(N):
        for k in range(N):
            if i == j or j == k or i == k or (A[i] + A[j] + A[k] > M) :
                continue
            else:
                answer.append(A[i] + A[j] + A[k])
print(max(answer))

 

<다른사람 풀이>

처음에 아래의 반복문이 이해가 가지 않았다. 시간복잡도 개념에서 본 기억이 나는데 이게 뭐지??

다른 사람들은 왜 이렇게 했지? 의문이 들었다.

엑셀로 풀어서 하나씩 살펴보니 시간복잡도때 나온 개념이었고, 내 코드와의 차이는 나는 삼중for문에서 인덱스가 같은 녀석들은 if조건으로 제외하는 방법을 택했다면,

아래의 개념은 인덱스가 같은 녀석들을 아예 제외하는 조건이다.

라이브러리를 제외하고는 이게 내 코드보다 효율적인 것 같다.

import sys
input = sys.stdin.readline

n,m = map(int, input().split())
li = list(map(int, input().split()))

num = 0

for i in range(0, n-2 ):
    for j in range(i+1, n -1):
        for k in range(j+1, n):
            if li[i] + li[j] + li[k] > m:
                continue
            if li[i] + li[j] + li[k] > num:
                num = li[i] + li[j] + li[k]
               
print(num)
728x90
반응형