문제
각 자리가 숫자(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)
'돌아보며'
문제 푸는 시간이 이렇게 느리다면 실제 코딩테스트 현장에서는 한 문제도 못 풀 게 분명하다.
여러 유형의 문제들을 많이 접해보고 부딪쳐봐야겠다. 연습만이 살 길이라는 걸 또 뼈저리게 느끼는 하루다.
파이팅!
'I can do it on my own! > 우당탕탕' 카테고리의 다른 글
[이코테] 14강 문제 '상하좌우' (0) | 2023.05.18 |
---|---|
[이코테] 13강 문제 '모험가 길드' (0) | 2023.05.12 |
[이코테 2021] 13강 문제 '1이 될 때까지' (0) | 2023.05.12 |
[git] git pull 오류 (0) | 2022.02.07 |
헷갈려서 써놓는 git push 명령어 (0) | 2022.01.23 |