문제
https://www.acmicpc.net/problem/2839
사용 언어
Python3
풀이 과정
내 머릿속의 로직대로 구현했는데 아무리 봐도 코드가 마음에 안들어... 어쨌든 한 번에 뜬 맞았습니다!!
제출 답안
N = int(input())
if N%5 == 0: # 5의 배수일 경우 바로 최소 봉지
print(N//5)
else:
for i in range(0, 10): # 3의 배수 하나씩 빼면서 5의 배수 여부 확인
if N-3*i < 0: # 음수면 조합 불가능하다는 뜻
print(-1)
break
elif (N-3*i)%5 == 0: # 5의 배수가 됐을 때
if N%3 == 0: # 3의 배수도 맞으면
a = N//3
b = (N-3*i)//5+i
print(min(a, b)) # 두 조합 중 작은 값 출력
break
else: # 3의 배수는 아니면
print((N-3*i)//5+i) # 바로 출력
break
else: # 5의 배수가 아니라면 다음 for문
continue
다른 사람 답안
나도 음수일 때의 조건 때문에 while문으로 바꾸려다가 print(-1)을 넣을 곳이 마땅치 않아 그대로 for문을 사용했는데, 이 분은 while~else문을 사용했다. 이런게 있는줄 몰랐지...
sugar = int(input())
bag = 0
while sugar >= 0 :
if sugar % 5 == 0 : # 5의 배수이면
bag += (sugar // 5) # 5로 나눈 몫을 구해야 정수가 됨
print(bag)
break
sugar -= 3
bag += 1 # 5의 배수가 될 때까지 설탕-3, 봉지+1
else :
print(-1)
출처: https://ooyoung.tistory.com/81
while~else문에서는 while문의 조건식이 거짓으로 판정됐을 때 else절이 수행된다. 만약 break 문에 의해서 반복이 끝난다면 (for 반복문과 마찬가지로) else절은 수행되지 않고 그 바깥으로 빠져나가게 된다.
따라서 구해지지 않는 조합을 편하게 빼주었고 while문을 사용한다고 하더라도 최대 9번까지 실행되는 안에서 값이 나오거나 음수가 되거나 할 것이기 때문에 실행 시간 상 딱히 문제가 없다.
나처럼 설탕 무게를 그대로 두고 괜히 곱하기를 사용해서 코드만 복잡해지고 가독성도 떨어지는 것보다😂,
훨씬 보기 편하고 깔끔한 코드인 것 같다!
'코딩 테스트 스터디 > 백준' 카테고리의 다른 글
[실버 IV] 1120번. 문자열 (0) | 2022.02.16 |
---|---|
[실버 V] 11723번. 집합 (0) | 2022.02.15 |
[브론즈 IV] 10162번. 전자레인지 (0) | 2022.02.10 |
[실버 IV] 1475번. 방 번호 (0) | 2022.02.10 |
[실버 IV] 2108번. 통계학 (0) | 2022.02.06 |