본문 바로가기
I can do it on my own!/우당탕탕

[이코테] 13강 문제 '곱하기 혹은 더하기'

by zivvon 2023. 5. 12.
목차 접기

문제

각 자리가 숫자(0부터 9)로만 이루어진 문자열 S가 주어졌을 때, 왼쪽부터 오른쪽으로 하나씩 모든 숫자를 확인하며 숫자 사이에 'x' 혹은 '+' 연산자를 넣어 결과적으로 만들어질 수 있는 가장 큰 수를 구하는 프로그램을 작성하세요. 단, +보다 x를 먼저 계산하는 일반적인 방식과는 달리, 모든 연산은 왼쪽에서부터 순서대로 이루어진다고 가정합니다.

 

예를 들어 02984라는 문자열로 만들 수 있는 가장 큰 수는 ((((0 + 2) x 9) x 8) x 4) = 576입니다. 또한 만들어질 수 있는 가장 큰 수는 항상 20억 이하의 정수가 되도록 입력이 주어집니다.

 

문제 조건

풀이 시간 30분, 시간 제한 1초, 메모리 제한 128MB

 

입력

첫째 줄에 여러 개의 숫자로 구성된 하나의 문자열 S가 주어집니다. (1 <= S의 길이 <= 20)

 

출력

첫째 줄에 만들어질 수 있는 가장 큰 수를 출력합니다.


'문제 접근'

0을 가진 자릿수가 있으면 무조건 더하기 연산을 하고 나머지는 곱하기 연산을 한다.

주어진 풀이 시간은 30분이었는데 로직 짜느라 1시간을 넘겼다.. 아직 코테 초보여서 그렇겠지? :) ..............

제발 언젠가는 문제를 보자마자 코드를 슉슉 써내려갈 수 있길 바란다.

 

무튼 처음에는 result 값을 0으로 초기화 시켜두고, for문으로 리스트의 첫 번째 원소부터 순회하며 연산을 해나가려 했지만 앞뒤 자릿수의 값을 모두 고려하다 뇌가 터져버릴 것 같았다. 그래서 아예 result값을 리스트의 첫 번째 값으로 초기화 하고 다음 자릿수의 값을 고려하며 곱하거나, 더해나가면 편할 것 같아 위처럼 로직을 짰다.

 

단, 주의할 점은 뒷 자릿수의 값이 0이 아니어도 result의 값이 0이면 곱해도 무용지물이기 때문에 꼭 if문을 넣어 result의 값이 0이면 더해준다는 조건을 걸어줘야 한다.

 

S = input()

num = []

for i in S :
  num.append(int(i))

result = num[0]

for i in range(1, len(num)) :
  if num[i] == 0 :
    result += num[i]

  else :
    if result == 0 :
      result += num[i]
    else :
      result *= num[i]

print(result)

 

'돌아보며'

문제 푸는 시간이 이렇게 느리다면 실제 코딩테스트 현장에서는 한 문제도 못 풀 게 분명하다.

여러 유형의 문제들을 많이 접해보고 부딪쳐봐야겠다. 연습만이 살 길이라는 걸 또 뼈저리게 느끼는 하루다. 

파이팅!