본문 바로가기

Develop/Coding Test

코딩테스트 입문 (feat. Day 16 문자열, 수학, 배열, 조건문)

16일차 스탬프

1. 편지

Q. 머쓱이는 할머니께 생신 축하 편지를 쓰려고 합니다. 할머니가 보시기 편하도록 글자 한 자 한 자를 가로 2cm 크기로 적으려고 하며, 편지를 가로로만 적을 때, 축하 문구 message를 적기 위해 필요한 편지지의 최소 가로길이를 return 하도록 solution 함수를 완성해주세요.

func solution(_ message:String) -> Int {
    return message.count * 2
}

 

A. 전달 받은 message의 길이에 2를 곱한 값을 반환하여 해결했다. 

2. 가장 큰 수 찾기

Q. 정수 배열 array가 매개변수로 주어질 때, 가장 큰 수와 그 수의 인덱스를 담은 배열을 return 하도록 solution 함수를 완성해보세요.

func solution(_ array:[Int]) -> [Int] {
    var result: [Int] = [0, 0]
    array.enumerated().forEach {
        if result[0] < $1 {
            result[1] = $0
            result[0] = $1
        }
    }
    return result
}

 

A. 전달 받은 array를 enumerated()와 forEach를 통해 index와 value를 순회하면서

result[0]에 저장된 값과 순회하는 값을 비교해 순회하는 값이 더 크면

result[0]에는 값을, result[1]에는 그 수의 인덱스를 저장하는 과정을 반복한 후 result를 반환하여 해결했다.

 

feat.

func solution(_ array:[Int]) -> [Int] {
    return [array.max()!, array.index(of: array.max()!)!]
}

 

다른 풀이 보고난  , max()와 index(of:)를 활용해서

반복문 없이 손쉽게 문제 해결하는 방법을 알게 되었다.

3. 문자열 계산하기

Q. my_string은 "3 + 5"처럼 문자열로 된 수식입니다. 문자열 my_string이 매개변수로 주어질 때, 수식을 계산한 값을 return 하는 solution 함수를 완성해주세요. ( 연산자는 +, -만 존재합니다. )

func solution(_ my_string:String) -> Int {
    var isPlus = true
    var result: Int = 0
    my_string.components(separatedBy: " ").forEach {
        if isPlus {
            result += Int($0) ?? 0
        } else {
            result -= Int($0) ?? 0
        }
        isPlus = $0 == "+" ? true : false
    }
    return result
}

 

A. components(separatedBy:)를 통해 배열로 변환한 my_string을 forEach로 순회하면서

먼저, isPlus가 true인 경우 result에 해당 원소를 더하고 false인 경우 result에 해당 원소를 뺀다.

이 때, 원소가 + 혹은 -면 ?? 연산자를 통해 0을 반환한다.

그리고 해당 원소가 +면 isPlus를 true로 아니면 false로 변경한다.

위 반복문이 끝나면 result를 반환하여 해결했다.

 

feat.

func solution(_ my_string:String) -> Int {
    my_string
        .replacingOccurrences(of: " - ", with: " + -")
        .components(separatedBy: " + ")
        .reduce(0,  { $0 + Int($1)! })
}

 

다른 풀이 중 replacingOccurrences로 my_string의 " - " 연산자를 모두 " + - "로 변경한 후

components(separatedBy:)를 통해 " + "를 기준으로 배열을 반환하고

reduce로 모든 양수와 음수로 더하는 풀이를 보았는데

빼기 연산을 음수의 더하기 연산으로 생각하는 발상이 인상 깊은 풀이었다.

4. 배열의 유사도

Q. 두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.

func solution(_ s1:[String], _ s2:[String]) -> Int {
    return  s1.filter { s2.contains($0) }.count
}

 

A. 전달 받은 s1을 고차함수 filter로 순회하면서 s2에 포함되는 값들의 배열을 구한 후 길이를 반환하여 해결했다.


오늘을 기점으로 티스토리에서 진행하는 오블완 챌린지가 막을 내린다.

처음에는 한 번도 빠지지 않고 쓰리라 다짐했지만..

한 번 안쓰니 흐름이 깨져서 4번이나 빼먹었다..

다짐한 것처럼 꾸준히 쓰지는 못했지만,

그래도 챌린지 덕분에 아무것도 안하는 것보단 의미있는 시간을 만들 수 있어서 좋았던 것 같다!

남은 입문 문제 풀이는 끝까지 써보려고 한다.

내일도 화이팅!