꾸준히 안타치기

14426. 접두사 찾기 💭 (list, startwith()함수사용) 본문

CS/백준

14426. 접두사 찾기 💭 (list, startwith()함수사용)

글자줍기 2022. 7. 18. 10:17
반응형

문제

https://www.acmicpc.net/problem/14426

문자열 S의 접두사란 S의 가장 앞에서부터 부분 문자열을 의미한다. 예를 들어, S = "codeplus"의 접두사는 "code", "co", "codepl", "codeplus"가 있고, "plus", "s", "cude", "crud"는 접두사가 아니다.

총 N개의 문자열로 이루어진 집합 S가 주어진다.

입력으로 주어지는 M개의 문자열 중에서 집합 S에 포함되어 있는 문자열 중 적어도 하나의 접두사인 것의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 문자열의 개수 N과 M (1 ≤ N ≤ 10,000, 1 ≤ M ≤ 10,000)이 주어진다.

다음 N개의 줄에는 집합 S에 포함되어 있는 문자열이 주어진다.

다음 M개의 줄에는 검사해야 하는 문자열이 주어진다.

입력으로 주어지는 문자열은 알파벳 소문자로만 이루어져 있으며, 길이는 500을 넘지 않는다. 집합 S에 같은 문자열이 여러 번 주어지는 경우는 없다.

예제입력 1

5 10
baekjoononlinejudge
startlink
codeplus
sundaycoding
codingsh

baekjoon
star
start
code
sunday
coding
cod
online
judge
plus

출력

첫째 줄에 M개의 문자열 중에 총 몇 개가 포함되어 있는 문자열 중 적어도 하나의 접두사인지 출력한다.

7

💡 이 문제를 보고 내가 생각한 것들, 생각한 순서

문자열의 갯수 N과 M

N - 집합 S에 포함되어 있는 문자열이 N개다. 집합S는 문자열 N개를 포함하고 있다.

M - 검사해야하는 문자열.. 단어들이 10개

위의 다섯개의 단어속에 밑에 10개 접두사가 들어있는지 확인한다.

 

💡 어떤 자료구조를 택했고 그 이유는?

 💡 그 자료구조를 이용해서 구체적으로 문제를 해결하는 로직

풀이 1

startswith 사용하기

파이썬에는 startswith라는 메서드가 있다. A.startswith(B) 를 하면 A 문자열이 B 문자열로 시작하는지 알 수 있다.

n, m = map(int, input().split())
words = [input() for _ in range(n)]
test = [input() for _ in range(m)]
answer = 0
for i in range(m):
    for j in range(n):
        if words[j].startswith(test[i]):
            answer += 1
            break
print(answer)

문자열을 순회하면 일일이 비교한다.

특정문자열을 발견하면 answer를 1증가 시키고 반복문을 빠져나감

n, m = map(int, input().split())  # 문자열갯수, 검사할단어갯수입력받기
words = [input() for _ in range(n)] #문자열입력받기
test = [input() for _ in range(m)] #검사단어입력받기
answer = 0
for i in range(m):
    for j in range(n):#문자열과 검사할단어를 비교
        if words[j].startswith(test[i]): #문자열중에 검사단어로 시작되는 것이 있으면
            answer += 1 #+1을 더한다.
            break
print(answer)

풀이 2  

https://latte-is-horse.tistory.com/363

import string

n, m = map(int, input().split())
words = {x: [] for x in string.ascii_lowercase}
for _ in range(n):
    word = input()
    words[word[0]].append(word)
test = sorted([input() for _ in range(m)])
answer = 0
for i in range(m):
    for word in words[test[i][0]]:
        if word.startswith(test[i]):
            answer += 1
            break
print(answer)

빠른 풀이는 dict 자료구조를 사용한 해싱으로 할 수 있다.

string.ascii_lowercase에는 abc...xyz 의 알파벳 소문자가 들어있다. 이것을 key로 하고 list를 value로 하는 dict를 만든다.

이렇게 하면 test의 어떤 단어를 검사하는데 words의 모든 단어를 검사하는 것이 아니라 words에서 해당 알파벳으로 시작하는 단어만 검사할 수 있게 된다.


https://dpdpwl.tistory.com/119

  • startswith(시작하는문자, 시작지점)
>>> s = '가나다라 마바사아 자차카타 파하'
>>> s.startswith('가')
True
>>> s.startswith('마')
False

>>> s.startswith('마',s.find('마')) #find는 '마' 의 시작지점을 알려줌 : 5
True
>>> s.startswith('마',1)
False

startswith는 문자열이 특정문자로 시작하는지 여부를 알려준다

true나 false 를 반환

 

두번째 인자를 넣음으로써 찾기시작할 지점을 정할수있다.

반응형

'CS > 백준' 카테고리의 다른 글

10952. A+B-5 / 10951. A+B-4  (0) 2022.07.28
2525 -오븐시계  (0) 2022.07.28
1935. 후위 표기식2 (stack)  (0) 2022.07.14
2476 - 주사위게임 / 2480 - 주사위 세개  (0) 2022.07.14
2346 - 풍선 터뜨리기 💭  (0) 2022.07.13
Comments