본문 바로가기

백준 PS일지/String

[백준/Swift] 6550: 부분 문자열 | PS일지

문제

 

6550번: 부분 문자열

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문자열 s 와 t가 빈칸을 사이에 두고 들어온다. s와 t의 길이는 10만을 넘지 않는다.

www.acmicpc.net

간단한 문제 요약

2개의 문자열 s t가 주어졌을 때 s가 t의 부분 문자열인지!! 이 문제에서의 부분 문자열이란 t의 문자열에서 몇 개의 문자들제거 한 후 합쳤을 때 s와 일치해야 하는 경우.

 

문제 풀이 | PS일지

s == needle

t == text

tIdx = 0, nIdx = 0

 

각각의 문자열을 배열로 만든 후에, 각각의 배열에 대해서 따로 따로 탐색할 포인터를 index로 두었습니다.

그리고 text[tIdx] == nIdx[nIdx] 일치하지 않는다면. tIdx값을 증가시키면서 혹은 일치한다면 nIdx를 증가시키면서 각각의 포인터가 해당 배열의 모든 원소를 훑을 때 까지만 비교를 수행했습니다.

 

 

 

문제를 읽긴 했는데.. 왜 처음 풀었을 때 좀 더 빨리 풀려고 소팅을 했을까요,,

그리고 또 이 문제는 답을 제출 할 때 "YES" or "NO" 가 아니라 "Yes" or "No"입니다... 이거때매 두번 틀렸다는 ㅠㅠ

 

코드

while let input = readLine() {
  let temp = input.split{$0==" "}.map{String($0)}
  let (text, needle) = (temp[1].map{String($0)},temp[0].map{String($0)})
  var tIdx = 0, nIdx = 0
  while tIdx < text.count && nIdx < needle.count {
    if text[tIdx] == needle[nIdx] { nIdx += 1 }
    tIdx+=1
  }
  print(nIdx == needle.count ? "Yes" : "No")
}