Префиксы-суффиксы (접두사-접미사)
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 1024 MB | 236 | 188 | 128 | 78.049% |
문제
기젯은 맥스가 똑똑한 개들만 좋아한다고 생각해서 똑똑한 책들을 읽기로 결심했습니다. 그 중 한 책에서 접두사와 접미사라는 개념을 배웠습니다.
정의:
- 접두사(Prefix): 문자열의 시작 부분과 일치하는 부분 문자열
- 접미사(Suffix): 문자열의 끝 부분과 일치하는 부분 문자열
- "ab"는 문자열 "abacaba"의 접두사 중 하나입니다.
- "25"는 문자열 "ab125"의 접미사입니다.
기젯은 주인의 노트에서 어떤 수열을 발견했고, 그 중에서 한 수의 접두사 중 하나가 다른 수의 접미사 중 하나와 일치하는 수가 두 개(같은 수일 수도 있음) 이상 존재하는지 궁금해졌습니다.
안타깝게도 이 문제는 기젯에게는 너무 어려웠습니다. 기젯이 이 문제를 해결할 수 있도록 도와주세요!
입력
첫 번째 줄에는 노트에 있는 수의 개수 n이 주어집니다. (1 ≤ n ≤ 1000)
두 번째 줄에는 노트에 있는 n개의 수 ai가 주어집니다. (1 ≤ ai ≤ 109)
출력
x번째 수의 어떤 접두사가 y번째 수의 어떤 접미사와 일치하는 두 수의 위치 x와 y를 출력하세요. 만약 그러한 두 수가 존재하지 않는다면 -1을 출력하세요.
예제
예제 입력 1
11 12 13 14 15
예제 출력 1
예제 입력 2
123456 123123
예제 출력 2
예제 입력 3
1
예제 출력 3
def s():
n,*s=open(0).read().split()
n=int(n)
for i in range(n):
for j in range(1,len(s[i])+1):
for k in range(n):
if len(s[k])>=j and s[k][-j:]==s[i][0:j]:
print(i+1,k+1)
exit()
else:print(-1)
s()
구현이 복잡해져서 인덱싱이 잘 돌아가는지 디버깅을 많이 했다.
특히 길이1인 문자에서 제대로 돌아가게 하기 위한 +1을 빼먹어서.
화살촉 코드가 나와서 만들고도 찝찝한 코드가 되었는데
파이썬 문자열 메서드에서 좋은 것을 찾았다.
def s():
n,*s=open(0).read().split()
n=int(n)
for i in range(n):
for j in range(n):
if s[i].startswith(s[j]):
print(i+1,j+1)
exit()
print(-1)
s()
바이트 바이트어레이에도 있는 메서드로 심지어 찾고자하는 접두사를 튜플로 묶어 한 번에 검사할 수도 있다.
startswith
는 Python에서 문자열이 특정 접두사로 시작하는지 여부를 확인하는 데 사용하는 문자열 메서드로, 문자열 비교에 유용하다. Python 공식 문서에 따르면, 이 메서드는 특정 문자열이 주어진 접두사로 시작하는지 확인하는 기능을 제공하며, 다양한 용도로 활용될 수 있다. startswith
메서드의 기본적인 사용 방법과 다양한 특징은 다음과 같다:
기본 문법
str.startswith(prefix[, start[, end]])
prefix
: 검사할 접두사 문자열이다.str
문자열이 이 접두사로 시작하는지 확인한다.start
: (선택적) 검사할 문자열의 시작 위치를 지정한다.end
: (선택적) 검사할 문자열의 종료 위치를 지정한다.
특징 및 다양한 활용
- 단일 접두사 검사
- 기본적인
startswith
사용법으로, 문자열이 특정 접두사로 시작하는지 단일 검사를 할 수 있다.
text = "Hello, World!" result = text.startswith("Hello") # True
- 기본적인
- 다중 접두사 검사
- 여러 개의 접두사를 한 번에 검사할 수 있으며,
tuple
형태로 여러 접두사를 전달하면 문자열이 주어진 접두사 중 하나로 시작하는지 확인한다.
text = "Hello, World!" result = text.startswith(("Hi", "Hello")) # True
- 여러 개의 접두사를 한 번에 검사할 수 있으며,
- 문자열의 특정 위치에서 검사
start
와end
인덱스를 통해 특정 위치에서 접두사 검사를 수행할 수 있다.start
는 시작할 위치,end
는 종료할 위치를 의미한다.
text = "Hello, World!" result = text.startswith("World", 7) # True (7번째 인덱스에서 시작)
- 접두사가 아닌 다른 문자열 형태로도 응용 가능
startswith
는 특정 문자열을 기준으로 여러 조건을 쉽게 검사할 때 유용하다. 예를 들어, 파일 확장자가 특정 값으로 시작하는지 확인하거나, HTTP나 HTTPS 등으로 시작하는 URL인지 확인할 때 사용할 수 있다.
url = "https://www.example.com" is_secure = url.startswith("https") # True
- 파일 경로 필터링 등 다양한 데이터 처리에 유용
- 파일 목록에서 특정 경로로 시작하는 파일만 걸러내는 등 다양한 데이터 필터링 작업에 자주 활용된다.
file_names = ["report.doc", "image.png", "data.csv"] csv_files = [file for file in file_names if file.startswith("data")]
- 접두사 비교가 실패할 경우 False 반환
startswith
는 접두사가 일치하지 않는 경우False
를 반환한다. 이 기능을 조건문에 활용해 특정 조건을 만족하는 경우에만 코드가 실행되도록 할 수 있다.
filename = "sample.txt" if filename.startswith("sample"): print("This is a sample file.")
- 문자열의 효율적인 부분 매칭을 위한 최적화
startswith
는 내부적으로 최적화되어 있으므로 문자열의 특정 접두사를 확인하는데 효율적이다. 대규모 텍스트 데이터 처리 시 활용도가 높다.
- 매개변수
prefix
로 전달할 수 있는 값의 유형prefix
로는 문자열뿐만 아니라tuple
형태로 여러 문자열을 전달할 수도 있다.
https://docs.python.org/ko/3/library/stdtypes.html#str.startswith
https://m.blog.naver.com/regenesis90/222387142436
https://security-nanglam.tistory.com/429