본문 바로가기

Develop/Coding Test

코딩테스트 입문 (feat. Day 12 문자열, 정렬, 사칙연산, 수학)

12일차 스탬프

1.  모음 제거

Q. 영어에선 a, e, i, o, u 다섯 가지 알파벳을 모음으로 분류합니다. 문자열 my_string이 매개변수로 주어질 때 모음을 제거한 문자열을 return하도록 solution 함수를 완성해주세요.

func solution(_ my_string:String) -> String {
    return my_string.filter { $0 != "a" }.filter { $0 != "e" }.filter { $0 != "i" }.filter { $0 != "o" }.filter { $0 != "u"}
}

 

A. 전달 받은 my_string을 고차 함수 filter를 5번 활용해 모음을 제거한 문자열을 반환하여 해결했다.

 

feat.

func solution(_ my_string:String) -> String {
    return my_string.filter { !["a", "e", "i", "o", "u"].contains($0)}
}

 

문제를 해결하면서 나도 contains()를 활용해 filter를 한 번만 사용해서

효율적으로 코드를 작성하고 싶었는데 자꾸 에러가 발생해 사용하지 못했다...

역시나 다른 풀이를 보니 가장 첫 번째로 위와 같은 풀이가 있었는데

나는 $0.contains(["a", "e", "i", "o", "u"]) 로 코드를 작성해서 에러가 났다는 사실을 알게 되었다!

2. 문자열 정렬하기 (1)

Q. 문자열 my_string이 매개변수로 주어질 때, my_string 안에 있는 숫자만 골라 오름차순 정렬한 리스트를 return 하도록 solution 함수를 작성해보세요.

func solution(_ my_string:String) -> [Int] {
    return my_string.filter { $0.isNumber }.compactMap { Int(String($0)) }.sorted()
}

 

A. 먼저 전달 받은 my_string을 고차함수 filter를 활용하여 숫자만 추출한 배열로 만들고 

그 배열을 고차함수 compactMap을 활용해 Int 배열로 변환한 후,

sorted()를 활용해 오름차순으로 정렬한 리스트를 반환하여 해결했다.

 

feat.

func solution(_ my_string:String) -> [Int] {
    return my_string.compactMap { Int(String($0)) }.sorted()
}

 

위 풀이를 보면, 내가 작성한 코드에서 filter를 과감히 빼더라도 같은 결과를 얻을 수 있다.

다시 생각해보니 고차함수 compactMap은 map과 다르게 non-nil인 결과만 포함해서 return 해준다.

그리고 공식 문서에 따르면, Int는 String을 넣었을 때 nil을 반환할 수 있기 때문에

결과적으로 compactMap에서 String을 Int로 캐스팅 할 때 숫자가 아닌 값들을 걸러낼 수 있기 때문이다. 

3. 숨어있는 숫자의 덧셈 (1)

Q. 문자열 my_string이 매개변수로 주어집니다. my_string안의 모든 자연수들의 합을 return하도록 solution 함수를 완성해주세요.

func solution(_ my_string:String) -> Int {
    return my_string.filter { $0.isNumber }.compactMap { Int(String($0)) }.reduce(0, +)
}

 

A.먼저 전달 받은 my_string을 고차함수 filter를 활용하여 숫자만 추출한 배열로 만들고 

그 배열을 고차함수 compactMap을 활용해 Int 배열로 변환한 후,

고차함수 reduce를 활용해 배열의 모든 수를 합친 값을 반환하여 해결했다.

 

feat.

func solution(_ my_string:String) -> Int {
    return my_string.compactMap { Int(String($0)) }.reduce(0, +)
}

 

위 코드도 2번 문제와 같은 맥락에서 filter를 제거하여 효율적으로 코드를 작성할 수 있다!

4. 소인수분해

Q. 소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 12를 소인수 분해하면 2 * 2 * 3 으로 나타낼 수 있습니다. 따라서 12의 소인수는 2와 3입니다. 자연수 n이 매개변수로 주어질 때 n의 소인수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.

func solution(_ n:Int) -> [Int] {
    var result: [Int] = []
    var value: Int = n
    while value != 1 {
        for i in 2...n {
            if value % i == 0 {
                value = value / i
                if !result.contains(i) {
                    result.append(i)
                }
                break 
            }
        }
    }
    return result
}

 

A. 전달 받은 n을 변환하기 위해 변수 value에 저장하고

value를 소인수들로 나누면 1이 되기 때문에,

while문을 통해 value가 1이 될 때까지 반복하는 반복문 내에서

for문을 통해 2부터 n까지 반복하면서 i가 소수일 때,

value를 i로 나눈 값으로 업데이트 하고

소수 i의 중복 여부를 체크한 후 result에 추가하고

더 이상의 반복을 피하기 위해서 for문을 탈출한다.

그리고 while문이 끝날 때까지 위 과정을 반복한 후, result를 반환하여 해결했다.


어제 글을 다 쓰고 임시저장한 상태로 12:07에 글을 올리게 되어

오블완 챌린지를 21일차까지 달성할 수 없게 되었다..(해야 할 일을 까먹고 미루지 말자)

 

12일차까지 꾸준히 써왔기에 아쉬운 마음이 들 수 밖에 없지만

이미 지난 일이고 어쩔 수 없기에 아쉬움은 뒤로 한채로

입문 문제는 끝까지 풀어 볼 예정이다!

내일도 화이팅!