책으로 그리디 알고리즘 학습 후 백준 문제를 풀어보기로 하였다.
import sys
expression = [num for num in sys.stdin.readline().rstrip('\n')]
li = []
if len(expression) == 1:
print(int(expression[0]))
else:
# replacing string for int
while expression:
j = 0
term = 0
while True:
i = expression.pop()
if i == '+' or i == '-':
li.append(term)
li.append(i)
break
term += pow(10, j) * int(i)
j += 1
if len(expression) == 0:
li.append(term)
break
li.reverse()
# input parenthesis
newli = []
data = 0
for i in range(0, len(li), 2):
data += li[i]
if i >= len(li) - 1:
newli.append(data)
break
if li[i + 1] == '-':
newli.append(data)
data = 0
result = newli[0]
for i in range(1, len(newli)):
result -= newli[i]
print(result)
그리고 공개된 좋은 답안
e = [sum(map(int, x.split('+'))) for x in input().split('-')]
print(e[0]-sum(e[1:]))
현타가 오지 않을 수가 없었다. 문제를 푸는 것도 중요하지만 좋은 답안에서 활용한 파이썬 툴을 최대한 활용해야겠다.
우선 반복자 활용을 잘 못하는 것 같아서 이를 머리 속에 새겨 놓으려 한다.
import sys
n = int(sys.stdin.readline().rstrip('\n'))
li = []
i = 0
while True:
i += 1
tmp = (i*(i+1)/2)
if tmp > n:
print(i-1)
break
elif tmp == n:
print(i)
break
print(int(((int(input())*8+1)**.5-1)/2))
비교적 쉬운 문제였으나, 점진적으로 올라가면서 반복하는 방법 외에 간단하게 근의 공식으로 풀 수 있던 상황임에도, 코딩스럽게 인위적으로 푸는 것에 치우쳐져서 다소 아쉬운 풀이를 했다.
n, m = input().split()
n = int(n)
odd = ['3', '5', '7', '9']
cnt = 0
while True:
if int(m) == n:
print(cnt+1)
break
elif m[len(m)-1] in odd or int(m) < n:
print(-1)
break
elif m[len(m)-1] == '1':
m = int(m)
m = (m-1)//10
m = str(m)
cnt += 1
else:
m = int(m)
m //= 2
m = str(m)
cnt += 1
len(m)-1 대신에 -1을 쓸 것, odd list를 만들기 보다는 else로 처리할 것.
알고리즘을 소스코드로 구현하는 과정
데이터의 개수와 구현하려는 코드의 big-o complexity를 비교하여 요구하는 실행 시간을 맞춘다.