1. 크로아티아 알파뱃
이 문제는 결과적으로 엄청 짧은 코드로 해결했지만, 어떻게 접근해야 할지 몰라서 꽤 오랜 시간을 잡아먹었다.
처음에는 그냥 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)))
단순히 완전히 내가 푼 것은 아니고, 인터넷 검색을 통해 좀 알아보았다. (백준에서도 정답자 코드를 볼 수 있지만, 이유는 안 써있어서 해설까지 포함된 설명을 보았다)
https://yoonsang-it.tistory.com/9
백준 2869번 파이썬 풀이: 달팽이는 올라가고 싶다
백준 2869번 달팽이는 올라가고 싶다 알고리즘 분류: 수학 링크: https://www.acmicpc.net/problem/2869 2869번: 달팽이는 올라가고 싶다 문제 땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대
yoonsang-it.tistory.com
이렇게 간단한 문제를 저렇게 복잡하게 짯었다니 ㅠㅠ...
알고리즘 오늘부터 조금씩 공부해서 올리려고 했는데 귀찮아서 못하고 있다.
문제를 일단 다 풀어보고 막히는 시점에서 공부해도 되지 않을까..?
어차피 항해2주차에도 공부해야 하고 말이다.
그리고 위 블로그 글을 보면서 sys.stdin.readline()을 왜 쓰나 해서 좀 알아보았는데,
파이썬으로 알고리즘 문제를 풀 때에는 input()이 아닌 sys.stdin.readline()으로 하는게 좋다고 한다.
아래글 참고!
[Python 문법] 파이썬 입력 받기(sys.stdin.readline)
파이썬으로 코딩 테스트를 준비한다면, 반드시 알아야 할 입력방식인 sys.stdin.readline()에 대한 정리 입니다.
velog.io
'Algorithm' 카테고리의 다른 글
알고리즘 문제 풀기 - 2 (0) | 2022.04.12 |
---|---|
알고리즘 문제 풀기 - 1 (0) | 2022.04.11 |