AngelPlayer`s Diary

링크

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 = 카드들을 합한 최대치 (작거나 같아야한다. 크면 안됨)

 

- 주어지는 내용

: N, M

: card(카드의 종류)

 

 

 

코드

N, M = input().split()
card = input()
M = int(M)

card = card.split()
card = list(map(int, card))
result = 0

for i in card:
    for j in card:
        if i == j:
            continue
        for k in card:
            if k == i or k == j:
                continue
            sum = i + j + k
            if sum > M:
                continue
            elif sum > result:
                result = sum

print(result)

 

 

 

코드해석

입력받은 값으로 각각 N, M, card(카드 목록 리스트)를 만든다.

 

3장의 카드를 고르기 때문에 3중 for문을 이용하였으며 각 for문에서 각각 하나의 카드를 card 리스트에서 선택(i, j, k)한다.

 

이때 i, j, k가 중복이 되면 안되기 때문에 중복이 나타난 경우 continue를 통해 다음 숫자를 선택한다.

 

만약 i, j, k가 모두 다른 값이면 모두 더한(sum) 후, 그 값이 M보다 크다면 마찬가지로 continue를 통해 다음 연산을 수행하고, 그렇지 않다면 기존의 결과 중 가장 큰 값(result)와 비교하여 큰 경우 result에 저장한다.

 

 

 

발생한 문제 & 해결 방안

1) 논리 에러

...
for i in card:
	for j in card:
		if i == j:
			break
			...

원래 설계는 i == j일 때 j가 다음 card를 선택하기를 기대했으나, 처음에 continue 위치에 break를 집어넣어 코드를 구현하여, 설계와 다르게 아예 i가 다음으로 넘어가버리는 현상이 발생하였다.

디버깅을 통해 이를 확인하고 break를 continue로 변경하여 이를 해결하였다.

 

 

2) 클린 코드

N, M = input().split()
M = int(M)

card = input()
card = card.split()
card = list(map(int, card))
...

기존 방식은 우선 입력을 받고 추후 원하는 형태(형변환, split() 등)으로 변환하였다.

 

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

이를 코드를 수정하여 조금 더 간략화하여 코드를 변경할 수 있었다.

 

 

 

 

 

 

 

 

 

 

 

해당 코드는 에디터가 코드 연습을 위해 직접 작성하였습니다.

혹시 오류가 있거나 더 좋은 코드 방향성을 아시는 분은 댓글로 남겨주시면 감사하겠습니다..!

 

공유하기

facebook twitter kakaoTalk kakaostory naver band