1. 문제 출처
https://www.acmicpc.net/problem/9996
9996번: 한국이 그리울 땐 서버에 접속하지
총 N개의 줄에 걸쳐서, 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 참고로, "DA"는 크로아티어어로 "YES"를, "NE"는 "NO"를 의미한다.
www.acmicpc.net
2. 풀이
2가지 방법이 존재한다.
1. 정규 표현식 미사용
# 테스트 케이스 개수 받기
N = int(input())
# 패턴 받은 후 *을 기준으로 자른다.
pattern = input().split("*")
# 패턴의 길이 구하기
pattern_len = len(pattern[0])+len(pattern[1])
def check():
# 결과 리스트 초기화
result_list = ["NE" for i in range(N)]
# 테스트 케이스 수만큼 반복
for idx in range(N):
input_str = input()
# 만약 문자열이 pattern[0]으로 시작, pattern[1]로 끝나고 문자열의 길이가 패턴의 총길이 보다 크거나 같으면
if input_str.startswith(pattern[0]) & input_str.endswith(pattern[1]) & (len(input_str) >= pattern_len):
# 결과를 "DA"로 바꾼다
result_list[idx] = "DA"
"결과 출력"
for idx in range(N):
print(result_list[idx])
check()
2. 정규 표현식 사용
import re
#위와 동일
N = int(input())
def check_regex():
result_list = ["NE" for i in range(N)]
query = input().split("*")
# 정구 표현식으로 query[0]와 query[1] 사이의 a부터 z까지의 임의의 문자가 한개 이상 존재한다
# 라는 뜻이다.
query = query[0]+ "[a-z]*"+query[1]
for idx in range(N):
input_str = input()
# fullmatch를 사용하여 전체 문자열이 해당 패턴을 만족하는지 구한다.
if re.fullmatch(query ,input_str):
# 만족하면 결과를 "DA"로 바꾼다.
result_list[idx] = "DA"
for idx in range(N):
print(result_list[idx])
check_regex()
쉽다고 생각했다가, ab*bd를 받았을 때 abd를 만족하는 오류를 범하였다. 이 오류를 해결하기 위해 패턴으로 받은 문자열의 개수보다 짧은 문자열 일 때는 "NE"가 되도록 하였다.
그리고 위의 그림과 같이 re를 import 하여 사용한 것이 메모리와 속도에서 안 사용한 것에 밀렸다.
다음 부터는 라이브러리를 가져다 쓰기 전에 없이도 가능한지 생각해 보고 사용해야겠다.
'알고리즘' 카테고리의 다른 글
1439-백준-뒤집기 (0) | 2023.02.13 |
---|---|
2618- 백준 - 경찰차 (0) | 2023.02.10 |
1254-백준-팰린드롬 만들기 (0) | 2023.02.09 |
9536-백준-여우는 어떻게 울지? (0) | 2023.02.06 |
백준-1141-접두사 (0) | 2023.02.04 |