https://www.acmicpc.net/problem/2839
문제를 처음 봤을 때, n값을 입력받아 5kg가방으로 최대한 채우고 나머지를 3kg 가방으로 채우고 만약 설탕이 남거나 부족하면 -1, 아니면 가방의 개수를 출력하면 될것이라 생각했다.
풀고 나서 에러가 나서 방법을 바꿨다. 코드를 지워버려서 왜 틀렸는지 확인 기억이 나질 않는게 아쉽다... 다음엔 틀린 코드도 따로 보관해놔야겠다.
코드 1
def multiples_of_3(n) :
if n % 3 == 0 :
answer.append(n//3)
def multiples_of_5(n) :
if n % 5 == 0 :
answer.append(n//5)
n = int(input())
answer = []
count = 0
multiples_of_3(n)
multiples_of_5(n)
while n >= 5 :
n -= 5
count += 1
if n % 3 == 0 :
temp = count
temp += n//3
answer.append(temp)
answer.sort()
if len(answer) == 0 :
print(-1)
else :
print(answer[0])
딱 봐도 풀고나서 뜨악! 했다. 코드가 일단 구현해야할 로직에 비해 너무 길었다. 구현하고 나서 함수로 3,5 키로를 따로 계산했어야했을까? 라는 의문이 들었다. 그리고 내가 생각했던 로직과 거리가 있다는걸 볼 수 있다. 생각했던 로직은 5kg 가방을 최대한 많이 쓰는 방법인데 코드에서는 5kg가방 하나당 3kg 몇개를 쓰는지를 계산한다. 어차피 answer리스트에 담아서 제일 적은 수를 출력하기에 결과적으로 답은 나오지만 너무 비효율적이라는 생각을 했다.
코드 2
n = int(input())
count = 0
while n >= 0 :
if n % 5 == 0 :
count += n//5
print(count)
break
n -= 3 # 3kg를 빼는 이유는 5kg가방을 최대한 많이 써야 가방의 갯수를 줄일 수 있기 때문
count += 1
if n < 0 :
print(-1)
그래서 다시 짠 코드이다. 코드 1에서 함수 multiple of 5는 아예 제역할을 못하는 듯해서 없앴고 multiple이 하고 있던 유일한 예외처리가 n이 3일 경우였기 때문에 while문을 0이상으로 바꾸고 생각했던 로직에 맞게 5kg가방을 최대한 소지할 수 있는 방향으로 코드를 구현했다.
이 후에 알게 된건, while-else문의 존재였다. 나는 if문을 사용해서 가방으로 정량을 담지 못했을 경우를 처리했지만 while-else문을 사용할 수 있단걸 알게 되었다. 그치만 while-else와 for-else문은 파이썬에만 존재하는 독특한 문법이라고 해서 조금은 사용을 자제해볼까 한다. 나는 파이썬을 주 언어로 사용할 생각이 없고 코딩테스트할때만 사용하려고 하기 때문에 아직 초보일때는 조금은 정직하게 짜보고 문법의 사용법 정도만 익혔다.
'알고리즘' 카테고리의 다른 글
백준 9012 괄호 파이썬 풀이 (2) | 2024.01.15 |
---|---|
백준 25206 너의 평점은 파이썬 풀이 (2) | 2024.01.14 |
백준 2556번 별 찍기 - 14 파이썬 풀이 (0) | 2024.01.12 |
백준 2440번 별 찍기 - 3 파이썬 풀이 (0) | 2024.01.12 |
백준 4673번 셀프 넘버 파이썬 풀이 (0) | 2024.01.12 |