공부할 개념
- 시뮬레이션
- map()
- 문자열 메소드
문제 분석
이 문제는 메세지 에 포함된 필터 단어
을 계속 제거하는 문제입니다. 일반적인 단어를 제거하는 것과 다르게 2가지 조건이 있습니다.
- 단어
가 동시에 여러 개 등장한다면, 그 중 가장 앞에 있는 단어부터 제거하기
- 한 번 제거한 이후에도 필터 단어
가 남아있다면, 더 이상 남아있지 않을 때까지 제거 반복하기
이번 문제에서는 이 조건을 모두 만족할 수 있는 코드를 문자열 메소드를 적극 활용하여 짜보도록 하겠습니다.
map() 으로 한 번에 적용하기
Python에는 map(Function, iterable Data) 이라는 함수가 있습니다. 이 함수는 첫 번째 매개 변수에 함수를 넣고, 두번째 매개 변수에 반복 가능한 자료형을 넣습니다. 구체적으로 map() 함수가 하는 역할은 반복 가능한 자료형의 모든 요소에 첫 번째 매개 변수로 준 함수를 적용한 결과를 반환한 map 객체를 반환합니다. 아래의 코드를 통해서 더 쉽게 이해할 수 있습니다.
# a 정수에 1을 더하는 함수
def add(a):
return a + 1
arr = [1, 2, 3]
# arr의 모든 요소에 add 함수를 적용하는 map 함수
add_arr = map(add, arr)
print(add_arr)
# map 객체이기 때문에 list로 반환
print(list(add_arr))갑자기 왜 map() 함수에 대한 설명이 나왔을까요? 바로 Python에서 여러 개의 정수를 한 번에 입력 받기 위해서 필요하기 때문입니다.
현재 문제처럼 한 줄에 2개의 정수를 받기 위해서 Python은 꽤나 복잡한 작업을 진행해야 합니다. 한 줄 전체를 문자열로 받고, 띄어쓰기 단위로 분리한 뒤, 각각의 변수에 맞게 적절한 값을 넣어줍니다.
# 문자열을 입력받은 후, split()로 뛰어쓰기 단위로 분리한 객체를 list로 변환
n = list(input().rstrip().split())
N = int(n[0])
M = int(n[1])
print(N, M)그러나 항상 이런 방식으로 입력을 받을 수는 없습니다. 한 줄에 10, 100개의 값이 입력이 된다면 반복문을 통해서 작성해야 하므로, 입력만 받는 코드를 짰는데도 힘이 빠져버릴지 모릅니다.
이보다는 아래 코드와 같이 map() 함수를 활용해서 더 깔끔하게 이런 입력을 받을 수 있습니다.
N, M = map(int, input().split())
print(N, M)map() 함수는 입력 이외에도 구현이나, 시뮬레이션을 할 때 유용하게 사용이 됩니다. 다양한 알고리즘을 구현할 때 있어서 자주 사용되는 함수이기 때문에 꼭 활용하는 방법을 익혀두셔야 합니다.
문자열 메소드로 단순하게 해결하기
우선 이 문제는 아래의 코드처럼 반복문과 인덱스 찾기만으로 해결할 수 있습니다. 만약에 메세지 에 단어
가 포함되어 있다면, 계속 그 단어를 찾은 뒤, 그 구간을 문자열에서 지워주면 됩니다.
# 필터 단어 S가 메세지 E에 포함되어 있는 동안 반복
while S in E:
# 현재 필터 단어 S가 가장 처음으로 등장하는 인덱스 추출
idx = E.find(S)
# 문자열에서 idx에 해당하는 인덱스를 지우는 반복문
for _ in range(len(S)):
E = E[:idx] + E[idx + 1:]하지만 메소드를 사용하면 조금 더 간결하고 직관적으로 코드를 작성할 수 있습니다. 굳이 우리가 단어를 찾아서 지우는 대신, str.replace() 메소드를 이용하면 현재 문자열에 등장하는 특정 문자열을 한 번에 모두 제거할 수 있습니다. str.replace(a, b) 는 문자열 str에 등장하는 모든 문자열 a를 문자열 b로 변환한다는 의미입니다. 아래와 같이 b를 빈 문자열로 두면, 삭제하는 연산이 되겠죠?
# 필터 단어 S가 메세지 E에 포함되어 있는 동안 반복
while S in E:
# replace 메소드를 통해서 E에서 S 단어를 계속 삭제
E = E.replace(S, '')
Code.
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
S = input().rstrip()
E = input().rstrip()
while S in E:
idx = E.find(S)
for _ in range(len(S)):
E = E[:idx] + E[idx + 1:]
if E:
print(E)
else:
print("EMPTY")import sys
input = sys.stdin.readline
N, M = map(int, input().split())
S = input().rstrip()
E = input().rstrip()
# 필터 단어 S가 메세지 E에 포함시 코드를 계속 실행
while S in E:
# replace 메소드를 통해서 E에서 S 단어를 계속 삭제
E = E.replace(S, '')
if E:
print(E)
else:
print("EMPTY")