문제
https://www.acmicpc.net/problem/14405
피카츄는 "pi", "ka", "chu"를 발음할 수 있다. 따라서, 피카츄는 이 세 음절을 합친 단어만 발음할 수 있다. 예를 들면, "pikapi"와 "pikachu"가 있다.
문자열 S가 주어졌을 때, 피카츄가 발음할 수 있는 문자열인지 아닌지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 문자열 S가 주어진다. 문자열은 알파벳 소문자로 이루어진 문자열이며, 길이는 5000을 넘지 않는다.
출력
문자열 S가 "pi", "ka", "chu"를 이어 붙여서 만들 수 있으면 "YES"를 아니면 "NO"를 출력한다.
풀이
풀이가 그다지 어려운 문제는 아니었다. 들어오는 s의 문자열을 string으로 받은 다음에, 배열에 index를 돌리면서 'pi'또는 'ka' 또는 'chu'를 받았는지 확인하고 맞다면 YES를, 아니라면 NO를 result에 입력해서 최종적으로 마지막에 들어간 result 값을 출력하면 되는 문제였다.
import sys
s = str(input())
data = ["pi", "ka", "chu"]
result = ""
i = 0
while i < len(s):
if i < len(s) - 1 and s[i] == "p" and s[i + 1] == "i":
result = "YES"
i += 2
elif i < len(s) - 1 and s[i] == "k" and s[i + 1] == "a":
result = "YES"
i += 2
elif i < len(s) - 2 and s[i] == "c" and s[i + 1] == "h" and s[i + 2] == "u":
result = "YES"
i += 3
else:
result = "NO"
break
sys.stdout.write(result)
i(index)가 제대로 가리킬 수 있도록 하는게.. 이 코드를 작성하면서 가장 고민했던 부분인데, 그래서 처음에는 for i in range(len(s))를 했다가... 그러면, 나머지 index들(예를 들면, chu가 들어가있는 걸 확인했으나... 그 이후 다음 인덱스에는 'h'가 들어오는데 이를 어찌 처리해야할지 조금 고민했다)이 애매해지기 때문에 whlie로 틀었다.
그리고 i라는 변수에 이미 내가 처리한 index값들은 넘기도록 설정해줘서 위에 고민했던 부분이 문제되지 않게 해결하였다. 그리고 무엇보다 효율적으로 시간을 쓰기 위해 result에 "NO"가 들어가는 순간 break으로 바로 whlie문을 나오도록 코드를 작성하였다.
시간복잡도
자... 이제 시간 복잡도를 생각해보자... while문이 한 바퀴를 다 도나? 일단 최악의 경우 다 돈다고 생각되기 때문에 O(n)인 것 같다.
'백준 알고리즘' 카테고리의 다른 글
| [python] 백준 4821. 페이지 세기 (0) | 2024.12.23 |
|---|---|
| [python] 백준 17499. 수열과 시프트 쿼리 (1) | 2024.12.19 |
| [python] 백준 25214. 크림파스타 (2) | 2024.12.06 |
| [python] 백준 1448. 삼각형 만들기 (0) | 2024.12.04 |
| [python] 백준 1436. 영화감독 숌 (4) | 2024.11.29 |