Where who wants to meet someone

특정 문자열로 끝나는 가장 긴 부분 문자열 찾기 본문

프로그래머스 알고리즘 문제 기록/코딩 기초 트레이닝

특정 문자열로 끝나는 가장 긴 부분 문자열 찾기

Lust3r 2024. 2. 14. 12:06
728x90

문제

https://school.programmers.co.kr/learn/courses/30/lessons/181872

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

내 답안 / 다른 사람들의 답안

import Foundation

func solution(_ myString:String, _ pat:String) -> String {
    let index = myString.lastIndex(of: pat.last!)!

    return myString.prefix(through: index).map { String($0) }.joined()
}

- pat의 마지막 글자의 lastIndex를 index에 담고 prefix(through:)를 통해 myString의 처음부터 index까지의 글자를 추출, map과 joined를 사용하여 String으로 만든 후 반환

 

// 풀이 1
import Foundation

func solution(_ myString:String, _ pat:String) -> String {
    var str = myString
    while str.hasSuffix(pat) == false {
        str = String(str.dropLast())
    }
    return str
}

// 풀이 2
import Foundation

func solution(_ myString:String, _ pat:String) -> String {
    guard let range = myString.range(of: pat, options: .backwards) else {
        return ""
    }
    return String(myString.prefix(upTo: range.upperBound))
}

- 내 풀이의 경우 pat이 여러 글자일 때 하나만 마지막에 있어도 예외사항이 발생

- 풀이 1을 사용하면 suffix가 pat이 될 때까지 dropLast를 하는 방식을 사용하여 해결

- 풀이 2는 pat을 포함하는 범위를 뒤에서부터 확인하여 range에 담고, 그것을 사용하여 prefix 메서드 사용
  여기서 upTo와 upperBound를 사용하는 이유는 먼저, range를 prefix에서 사용하기 위해서는 upperBound 또는 lowerBound를
  써야 한다. Range<String.Index> 가 아닌 String.Index가 필요하기 때문.
  lowerBound는 range의 첫부분, upperBound는 끝 부분 다음 인덱스이기에 pat을 다 표현하기 위해서는 upperBound를 쓰되
  불필요한 글자를 제거하기 위해 upTo를 사용하는 것

 

점수: +1