이 문제는 결과적으로 엄청 짧은 코드로 해결했지만, 어떻게 접근해야 할지 몰라서 꽤 오랜 시간을 잡아먹었다.
처음에는 그냥 1글자씩 반복을 돌려서 1,2 글자를 비교해서 배열에서 찾으면 되겠다 싶어서 코드를 짯다.
<실패코드>
croatia = ["c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="]
text = input()
count = 0
while(True):
if (len(text) == 0):
break
if (len(text) > 1):
word = text[0] + text[1]
else:
word = text[0]
if word in croatia:
count += 1
text = text.replace(word, "", 1)
else:
count += 1
text = text.replace(text[0], "", 1)
print(count)
그러나 이렇게 짜고 보니 3글자에 대한 처리는 전혀 안되어 있어서 3글자까지 고려하면 코드가 괜히 골때려지겠다 싶어서 코드를 한번 엎었다.
이게 막히자 도저히 생각이 안나서 어떻게 해야할지 10분넘게 고민해봤는데, 코드를 두 번정도 틀린 뒤 답을 맞추는데 성공했다.
<정답코드>
croatia = ["dz=", "c=", "c-", "d-", "lj", "nj", "s=", "z="]
text = input()
for x in croatia:
if x in text:
text = text.replace(x, "?")
count = len(text)
print(count)
풀고 나니 너무 짧게 풀리는 코드였다...
2. 달팽이는 올라가고 싶다.
이 문제는 접근이 아주 쉬웠다.
그래서 엄청 쉬운줄 알았는데, 실행 시간이 0.25초로 러닝타임을 신경 써야 하는 문제였다.
<틀린 코드>
#a,b,v = map(int, input().split())
# a = 낮에 올라가는 높이
# b = 밤에 미끄러지는 높이
# v = 올라갈 높이
a = 100
b = 99
v = 100000
meter = 0
count = 0
while(True):
count += 1
meter += a
if (meter >= v):
break
meter -= b
print(count)
그래서 시간을 어떻게 단축시킬까 고민이 필요했다.
이 연산을 줄이기 위해 나눗셈과 나머지를 활용해보자고 생각했다.
<정답코드>
a,b,v = map(int, input().split())
# a = 낮에 올라가는 높이
# b = 밤에 미끄러지는 높이
# v = 올라갈 높이
meter = 0
count = 0
after_v = v - a
count = after_v / (a-b)
rest = (after_v % (a-b)) + a
while(True):
count += 1
meter += a
if (meter >= rest):
break
meter -= b
print(int(count))
위와 같이 코드를 짜서 정답을 맞추긴 했는데 영 찜찜해서 더 짧게 할 방법이 있을까 생각해보았다.
<정답코드2>
import math
a,b,v = map(int, input().split())
# a = 낮에 올라가는 높이
# b = 밤에 미끄러지는 높이
# v = 올라갈 높이
print(math.ceil((v-b) / (a-b)))
단순히 완전히 내가 푼 것은 아니고, 인터넷 검색을 통해 좀 알아보았다. (백준에서도 정답자 코드를 볼 수 있지만, 이유는 안 써있어서 해설까지 포함된 설명을 보았다)