[Swift/프로그래머스] 문자열 겹쳐쓰기 ( feat. prefix, suffix )

sonny·2024년 10월 28일
6

TIL

목록 보기
24/48

나의 답)

import Foundation

func solution(_ my_string:String, _ overwrite_string:String, _ s:Int) -> String {

    let first = my_string.prefix(s)
    let second = overwrite_string
    let last = my_string.suffix(my_string.count - overwrite_string.count - s)
    
    return first + second + last
    
}

돌렸는데...

??????

테스트 18번 중에 1개 틀린거면 통과 해주지 ... ㅠ 그마저 시간 초과인데...

설마,, 상수 이름이 길어서 그런가 싶어 이름을 간단하게 a, b, c 로만 바꿔서 다시 돌려봤다.

???? 머세요 ㅜ


풀기까지 과정

나는 처음에 이 문제를 머리론 알겠는데 가슴은 왜 지맘대론지 이해가 될 듯 말 듯 했는데, 딱히 무슨 공식을 이용해야 할 지 생각나지 않았다.

그래서 문제를 그대로 복사해 채찍피티에게 넘기며 답은 알려주지말고 힌트를 달라고 해봤더니 이렇게 답했다.

접두사랑 접미사..? 아 ^^ 먼저 공부를 해야겠다 싶었다. 이렇게 코딩테스트를 풀면서 성장하나보다.

  • prefix 공식문서 바로가기
  • suffix 공식문서 바로가기

공식문서를 보니 영어라서 번역을 돌려봤다.

접두사(prefix) 는 예시를 보니 이해하기 쉬웠다.

그러니까 prefix(a) 를 쓰면 a 숫자만큼만 출력한다는 것 아니냐

OK

다음 접미사(suffix) 는 예시를 보니 아하! 지정한 숫자만큼 뒤에서 부터 출력을 하는 거구나 !

그렇다면

테스트 문제가 my_string 의 글자에 overwrite_strings 번째부터 시작한다라는 거니까..

예를 들어
my_string.count = 10
overwrite_string = 3
s = 3

계산하면 10 - 3 - 3 = 4

suffix 를 이용해서 my_string의 마지막 네 문자를 가져오면 될 것 같다.

suffix 메서드는 주어진 길이만큼의 문자열을 my_string의 끝에서부터 가져오니까 !

그렇게 코드를 작성해봤다.

let first = my_string.prefix(s)

my_string.prefix(s)my_string의 시작 부분에서 인덱스 0 부터 s 까지의 문자열을 가져올 것이다.

예를 들어 my_string"abcdefgh" 이고 s3 이라면, first"abc" 가 되는 것.

let second = overwrite_string

이 줄은 overwrite_string 을 그대로 second 변수에 할당하는 것.

let last = my_string.suffix(my_string - overwrite_string - s)

이 코드는 원본 문자열인 my_string 에서 대체할 문자열인 overwrite_string 이 들어간 후 남는 문자열(접미사) 을 가져오는 역할을 한다.

return first + second + last

first, second, last를 결합하여 최종 문자열을 만들어준다..

돌려봤다!!!!!!

어... 뭐가 문제지? 계산은 맞았다.. 내용을 보고 처음엔 뭔 말인지 했는데,

번역기를 돌려보고 구글링해보니 오류 메시지는 my_string - overwrite_string - s 와 같이 문자열끼리 빼려고 해서 발생한 것 같았다.

그러고보니 글자 수를 빼는 것이니 count 를 넣어줘야하는데 그저 메서드끼리 빼버리면 되겠지 하고 넘어가니 이런 에러가 발생한 것이었다.

이렇게 코드 실행할 땐 잘 되어서 마지막으로 채점하면 넘어가겠거니~ 하고 채점하기를 눌렀더니 맨 위에 상황이 됐던 것이다.

시간 초과로 인해 틀려버려서 상수를 a, b, c 로 변경 후 채점하니 정답이 되었다...^^

음..

이번 문제를 통해 문자열 조작에 대한 이해가 약간이나마 깊어진 듯 하다. 특히 문자열의 길이를 기반으로 남는 부분을 잘라내는 과정에서 prefixsuffix 를 활용한 부분이 기억에 남았다.

실제로 저 메서드들을 언제 사용해볼지는 모르겠지만, 그래도 이번 코딩테스트 문제 경험으로 공식문서도 참고하며 공부하는 과정을 통해 이런 메서드도 있다는걸 알게 된 것만으로도 충분한 공부라고 생각한다.

그리고 처음에는 count 를 제대로 이해하지 못하고 문자열끼리 빼려다 오류가 발생했는데, 이걸 계기로 내가 데이터 타입에 대한 이해가 아직 부족하다는 것을 알게 되었고 이후 코드를 디버깅하면서 문제를 해결할 수 있었다.

이번 문제를 푼 경험 덕분에 앞으로 이런 비슷한 문자열 문제를 만났을 때에는 이번에 배운 prefix, suffix 를 활용해볼 수 있을 것 같다.

profile
iOS 좋아. swift 좋아.

10개의 댓글

comment-user-thumbnail
2024년 10월 28일

않이외상수이름바꾸기전엔안된거죠이해가안되네

1개의 답글
comment-user-thumbnail
2024년 10월 28일

오.. 이름의 길이가 리소스를 먹어봐야 얼마나 먹겠나 했는데 생각보다 꽤 차이가 존재하나보네요
그래도 abc로는 안 쓰겠지만

1개의 답글
comment-user-thumbnail
2024년 10월 28일

론겸님 왜 오늘은 글에 웃긴짤없어요

1개의 답글
comment-user-thumbnail
2024년 10월 28일

아... 이번 포스터도 스포가 다분한 내용이네요 ㅜㅜ

1개의 답글
comment-user-thumbnail
2024년 10월 29일

늘 발전하는 모습 보기 좋읍니다 ^^~~ 자주 소통하고 뵙고 싶네요

1개의 답글