본문 바로가기
카테고리 없음

백준28932🐨Префиксы-суффиксы (접두사-접미사) 파이썬 str.startswith()

by redcubes 2024. 11. 3.

Префиксы-суффиксы (접두사-접미사)

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
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

5
11 12 13 14 15

예제 출력 1

3 1

예제 입력 2

2
123456 123123

예제 출력 2

1 2

예제 입력 3

1
1

예제 출력 3

1 1
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: (선택적) 검사할 문자열의 종료 위치를 지정한다.

특징 및 다양한 활용

  1. 단일 접두사 검사
    • 기본적인 startswith 사용법으로, 문자열이 특정 접두사로 시작하는지 단일 검사를 할 수 있다.
    text = "Hello, World!"
    result = text.startswith("Hello")  # True
    
  2. 다중 접두사 검사
    • 여러 개의 접두사를 한 번에 검사할 수 있으며, tuple 형태로 여러 접두사를 전달하면 문자열이 주어진 접두사 중 하나로 시작하는지 확인한다.
    text = "Hello, World!"
    result = text.startswith(("Hi", "Hello"))  # True
    
  3. 문자열의 특정 위치에서 검사
    • startend 인덱스를 통해 특정 위치에서 접두사 검사를 수행할 수 있다. start는 시작할 위치, end는 종료할 위치를 의미한다.
    text = "Hello, World!"
    result = text.startswith("World", 7)  # True (7번째 인덱스에서 시작)
    
  4. 접두사가 아닌 다른 문자열 형태로도 응용 가능
    • startswith는 특정 문자열을 기준으로 여러 조건을 쉽게 검사할 때 유용하다. 예를 들어, 파일 확장자가 특정 값으로 시작하는지 확인하거나, HTTP나 HTTPS 등으로 시작하는 URL인지 확인할 때 사용할 수 있다.
    url = "https://www.example.com"
    is_secure = url.startswith("https")  # True
    
  5. 파일 경로 필터링 등 다양한 데이터 처리에 유용
    • 파일 목록에서 특정 경로로 시작하는 파일만 걸러내는 등 다양한 데이터 필터링 작업에 자주 활용된다.
    file_names = ["report.doc", "image.png", "data.csv"]
    csv_files = [file for file in file_names if file.startswith("data")]
    
  6. 접두사 비교가 실패할 경우 False 반환
    • startswith는 접두사가 일치하지 않는 경우 False를 반환한다. 이 기능을 조건문에 활용해 특정 조건을 만족하는 경우에만 코드가 실행되도록 할 수 있다.
    filename = "sample.txt"
    if filename.startswith("sample"):
        print("This is a sample file.")
    
  7. 문자열의 효율적인 부분 매칭을 위한 최적화
    • startswith는 내부적으로 최적화되어 있으므로 문자열의 특정 접두사를 확인하는데 효율적이다. 대규모 텍스트 데이터 처리 시 활용도가 높다.
  8. 매개변수 prefix로 전달할 수 있는 값의 유형
    • prefix로는 문자열뿐만 아니라 tuple 형태로 여러 문자열을 전달할 수도 있다.

https://docs.python.org/ko/3/library/stdtypes.html#str.startswith

 

Built-in Types

The following sections describe the standard types that are built into the interpreter. The principal built-in types are numerics, sequences, mappings, classes, instances and exceptions. Some colle...

docs.python.org

 

https://m.blog.naver.com/regenesis90/222387142436

 

[Python] startswith(), endswith() : 문자열 시작 문자, 끝 문자로 검색하는 함수

* 본 포스팅은 Python 3.8.6, Jupyterlab >= 3.0 의 환경에서 만들어졌습니다. 1. startswith()...

blog.naver.com

https://security-nanglam.tistory.com/429

 

[python] startswith() 사용방법 정리 @.@

 

security-nanglam.tistory.com