====== 나는 친구가 적다 (Large) ====== ===== 풀이 ===== * 문제의 요구사항은 간단하다. 문자열에서 숫자를 지우는 것은 너무 간단해서 신경쓸 필요가 없다고 치면, 결국은 어떤 문자열이 특정한 부분문자열을 포함하는지를 찾는 [[ps:문자열 매칭]] 문제이다. * 이 문제는 [[ps:problems:boj:16171]] 에서 입력의 크기가 커진 문제인데, 입력의 크기를 키워서 별개의 문제를 만들었을 때의 의도는 당연히 좀 더 복잡한 풀이를 사용하라는 것이었을 것이다. 원래의 의도는 [[ps:problems:boj:16171]]에서는 나이브한 O(nm) 풀이가 돌고, 여기에서는 [[ps:KMP 알고리즘]] 등의 O(n) 풀이를 사용하라는 의도였을것이고, 초기의 난이도 기여들도 거기에 맞춰 골드1이나 플래티넘5 정도에 형성되었었다. * 하지만, 현재의 파이썬에서는(python 3.10 이상) 단순히 str의 내장 in 연산자가 O(n)에 이 작업을 처리해준다. 따라서 문자열 매칭 알고리즘을 따로 구현할 필요없이 그냥 한줄로 처리된다. 그 결과 boj의 파이썬 버전이 3.10 으로 업데이트 된 이후로 난이도 기여가 브론즈 난이도로 급락했다. 현재는 [[ps:problems:boj:16171]] 과 똑같은 브론즈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() {{tag>BOJ ps:problems:boj:브론즈_2}}