본문 바로가기

알고리즘

[이것이 코딩테스트다] 실전 - 곱하기 혹은 더하기*

728x90

나의코드*

# 나의코드
# 그리디 알고리즘
number = input()
result=int(number[0])

for i in range(1,len(number)):
	# 해당 수 또는 이전 수가 0이면 더하기
    if int(number[i-1]) in (0,1) or int(number[i]) in (0,1) :
        result += int(number[i])
    else:
        result *= int(number[i])
print(result)

그냥 딱봐도 그리디 알고리즘임을 알 수 있는 문제였다. 곱하기는 더하기보다 당연히 크고 곱하기가 더하기보다 작은 경우는 0과1 밖에 없다.그래서 그런 예외만 처리하면 된다. 

하지만 여기서 난 아주 큰 실수를 했다. 해당 수 이전 값이 중요한게 아니라 이전까지 계산된 결과가 0이냐가 중요한 것이다. 예를 들어, [5,0,2]라면 원래대로라면 (5+0)*2가 최대값일 것이다. 하지만 나의 코드대로라면 5+0+2가된다. 

문제해석 잘하고 이런 실수를 하다니....

 

그래도 원래  in을 써본다는 걸 생각해본 적이 없었는데 이걸 떠올렸다는게 뿌듯하다 ㅎㅎ 부등호로 계산하는게 더 효율적이긴 하지만 그래도 직관적으로는 표현했잖아...ㅎㅎ

 

정답코드

# 정답코드
number = input()
result=int(number[0])
for i in range(1,len(number)):
    if result <= 1 or int(number[i]) <= 1 :
        result += int(number[i])
    else:
        result *= int(number[i])
print(result)

전형적인 그리디 알고리즘 문제였고 직관적으로 솔루션이 보이는 문제였다. 이런 문제를 틀렸다는게 많이 아쉽다ㅜㅜ 

반응형