개발자일걸요..?

2798번 블랙잭 본문

알고리즘코딩/Baekjoon Online Judge

2798번 블랙잭

Re_A 2021. 1. 31. 20:57
728x90
반응형

문제 링크 : www.acmicpc.net/problem/2798

 

2798번: 블랙잭

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

www.acmicpc.net

 

 

 

고려해야할 조건

1. 세 카드를 동시에 뽑기때문에 세 숫자는 모두 다른 수여야 한다.

2. 세 카드의 합이 M을 넘지 않아야 한다.

 

이를 고려하면 경우의 수는 NC3가지가 되고, 이를 list에 넣은 후 M과의 차이가 가장 적은 값을 찾으면 된다.

import sys
N,M = map(int, sys.stdin.readline().split())
index = list(map(int, sys.stdin.readline().split()))

case = []

for i in range (0,N):
    for j in range(i+1,N):
        for k in range(j+1,N):
            case.append(index[i]+index[j]+index[k])

similar = -1;
for i in range(0, len(case)):
    if((case[i]<=M) & (abs(M-case[i]) < abs(M-similar))):
        similar = case[i]

print(similar)

 

list를 짧게 하고자 하면 세 수의 합이 M보다 작은지 확인하는 조건으로 줄일수 있다.

import sys
N,M = map(int, sys.stdin.readline().split())
index = list(map(int, sys.stdin.readline().split()))

case = []

for i in range (0,N):
    for j in range(i+1,N):
        for k in range(j+1,N):
            if((index[i]+index[j]+index[k])<=M):
                case.append(index[i]+index[j]+index[k])

similar = -1;
for i in range(0, len(case)):
    if(abs(M-case[i]) < abs(M-similar)):
        similar = case[i]

print(similar)

 

또한 아예 list를 사용하는 과정을 삭제하면 아래와 같은 더 간단한 코드로 진행할 수도 있다.

import sys
N,M = map(int, sys.stdin.readline().split())
index = list(map(int, sys.stdin.readline().split()))

case = 0;

for i in range (0,N):
    for j in range(i+1,N):
        for k in range(j+1,N):
            this = index[i]+index[j]+index[k]
            if((this<=M)&(abs(M-case) > abs(M-this))):
                case = this

print (case)
반응형

'알고리즘코딩 > Baekjoon Online Judge' 카테고리의 다른 글

7568번 덩치  (0) 2021.02.01
1436번 영화 감독 숌  (0) 2021.02.01
2231번 분해합  (0) 2021.01.31
11729번 하노이 탑 이동순서  (0) 2021.01.30
2447번 별찍기  (0) 2021.01.30
Comments