ps:problems:boj:16172
목차
나는 친구가 적다 (Large)
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 16172 |
문제명 | 나는 친구가 적다 (Large) |
레벨 | 브론즈 2 |
분류 |
문자열 |
시간복잡도 | O(n) |
인풋사이즈 | n<=200,000 |
사용한 언어 | Python 3.13 |
제출기록 | 33996KB / 52ms |
최고기록 | 32ms |
해결날짜 | 2025/04/03 |
풀이
- 문제의 요구사항은 간단하다. 문자열에서 숫자를 지우는 것은 너무 간단해서 신경쓸 필요가 없다고 치면, 결국은 어떤 문자열이 특정한 부분문자열을 포함하는지를 찾는 문자열 매칭 문제이다.
- 이 문제는 나는 친구가 적다 (Small) 에서 입력의 크기가 커진 문제인데, 입력의 크기를 키워서 별개의 문제를 만들었을 때의 의도는 당연히 좀 더 복잡한 풀이를 사용하라는 것이었을 것이다. 원래의 의도는 나는 친구가 적다 (Small)에서는 나이브한 O(nm) 풀이가 돌고, 여기에서는 KMP 알고리즘 등의 O(n) 풀이를 사용하라는 의도였을것이고, 초기의 난이도 기여들도 거기에 맞춰 골드1이나 플래티넘5 정도에 형성되었었다.
- 하지만, 현재의 파이썬에서는(python 3.10 이상) 단순히 str의 내장 in 연산자가 O(n)에 이 작업을 처리해준다. 따라서 문자열 매칭 알고리즘을 따로 구현할 필요없이 그냥 한줄로 처리된다. 그 결과 boj의 파이썬 버전이 3.10 으로 업데이트 된 이후로 난이도 기여가 브론즈 난이도로 급락했다. 현재는 나는 친구가 적다 (Small) 과 똑같은 브론즈2를 받고 있다.
- 숫자를 제거하는데에 O(n), 부분문자열을 확인하는데에 O(n). 총 O(n)에 해결된다
- 내장함수 딸깍으로 풀 수 있는 것은 꼭 파이썬뿐은 아니라고 한다. c언어의 경우 strstr, cpp의 경우 string::find 와 같은 내장함수를 써서 풀수 있다고 한다.
코드
"""Solution code for "BOJ 16172. 나는 친구가 적다 (Large)".
- Problem link: https://www.acmicpc.net/problem/16172
- Solution link: http://www.teferi.net/ps/problems/boj/16172
"""
def main():
S = input()
K = input()
s_alpha = ''.join(c for c in S if c.isalpha())
print('1' if K in s_alpha else '0')
if __name__ == '__main__':
main()
ps/problems/boj/16172.txt · 마지막으로 수정됨: 2025/04/03 13:59 저자 teferi
토론