[ Array ] String 을 배열로 쪼개라!

2023. 8. 14. 01:45Algorithm & DataStructure

본론을 시작하기에 앞서, 알고리즘과 나의 인연에 대해 잠깐 언급해보려고한다.
작년부터 백준 브론즈를 풀다가, readLine() 의 쓰임에 익숙치 않았지만, 풀어 나갔었다.
일목요연한 문법과 문법설명이라기 보단, 내가 생각하고 느꼈던 것에 대한 기록이다. 난 알고리즘 왕초보니까..😅

내 힘으로 해결하지 않고 풀다가 다른 사람들의 풀이를 보곤 했었는데, 그렇기엔 내 일시적 궁금증만 해소될 뿐이지 궁극적인 나의 알고리즘 내성력(?) 에 일절 도움이 되지 않았다. 그래도 작년 말부터는 다시 초심으로 돌아가 프로그래머스 코딩테스트 기초부터 풀고 있는중이다. 절대 다른 이들의 풀이법을 보고 싶지 않았다!

 

1. 우선, 문제에서 설명하는 것과 요구하는 것을 먼저 파악했다.

2. 그리고 나서 웬만하면, 제한사항을 두는 조건을 지키려고 solution 함수 내에 작성하려고 했다.

 

입출력 예를 참고하여 문제 이해에 도움을 주었다. 얼른 꾸준히 기초를 다 풀고, 고득점 키트를 풀 예정이다.

 

문자열을 쪼갠다라,, 컬렉션(Collection)도 아니고, String을 어떻게 배열처럼 생각할 수 있을까? C언어에는 문자열이라는 자료형이 없다.

단지 char *string 한다면 가능한 것일뿐, 이렇게보면 오히려 접근방법이 쉬운데 말이다.

 

나도 굳이 어렵게 생각하고 싶지 않았다.문자열의 특정 인덱스까지 return 하는 함수를 작성하라는 문제를 봤기 때문이다.

알고리즘 문제를 풀면서 나는 더 이상 한글로 구글링을 아예 하지 않는다. 온전히 영어로만 검색을 해, 다른 이들의 접근방식을 보고 싶었다. 아무래도 외국인들은 프로그래머스 플랫폼을 모를테니 말이다.

 

문제명을 [ 문자열의 앞의 n글자 ] 라고 치면, 여기서 요구하는 조건은 문자열 my_string과 정수 n 매개변수로 주어질 때, 그 앞의 n 글자로 이루어진 문자열을 return 하는 solution 함수를 작성하시오. 이다.

 

그렇담 반환하는 값의 타입은 String 이다. How to divide the String in Swift 이라고 검색을 하면 substring 에 대한 토픽이나, how to slice array in Swift 라고 검색을 해 ArraySlice 를 참고했다. 웬만하면 무조건 애플 공식문서를 참고하려는 버릇을 들이기로 했다. 그러다보니, prefix나 suffix 에 대한 인스턴스 메소드에 알게되었다.

그리고 Xcode command line in tool 에서 프로젝트를 만들어 코드를 컴파일 해본다. 결과가 비슷하다. 하지만 가끔 프로그래머스에서 오류가 나더라.

버그같은데 친절한 분이 스페이스 띄기를 하면 사라진다고 알려주셨다. 처음엔 인자의 컨벤션이 영향을 주는건가 했다.

ArraySlice

let absences = [0, 2, 0, 4, 0, 3, 1, 0]

let midpoint = absences.count / 2 
print(midpoint)
// print : 4
let firstHalf = absences[..<midpoint]
print(firstHalf)
// print: [0, 2, 0, 4]
let secondHalf = absences[midpoint...]
print(secondHalf)
// print: [0, 3, 1, 0]
print(ArraySlice(arrayLiteral: absences[..<midpoint]))
// [ArraySlice([0, 2, 0, 4])]

absences 상수로 된 배열에 배열 길이를 나누고 그 배열 길이를 기준으로 범위 연산자를 absences 인덱스에 적용해 어떤 인덱스를 기준으로 배열의 요소들을 프린트 할 수 있었다.
코드를 더 단축시키기 위해서 ArraySlice 를 쓰면 간편해진다.

ArraySlice 보다 더 간단한 것이 prefix와 Suffix 였다.

prefix(_:)
접두어라는 영어 뜻도 있다. 컬렉션(array, set, dictionary) 초기 요소를 포함하는 지정된 길이만큼 하위 시퀀스 요소를 반환한다.
suffix(_:)
접미어라는 뜻으로, 컬렉션의 마지막 요소를 포함하는 최대 길이까지 하위 시퀀스를 반환한다.

여기서 포인트는, my_string과 n 의 문자열, 정수 조건을 가지고, 문자열을 return 해줘야하니 타입 변환을 해주기 위해 String으로 감싸주고 제출하면 끝! 자잘한 버그가 있지만, 해결 완료했다. 가끔 프로그래머스는 런타임이나 컴파일 에러가 난다.
꾸준히 많이 풀고 다른 플랫폼도 풀어야지..