본문 바로가기

Develop/Coding Test

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

17일차 스탬프

1. 숫자 찾기  

Q. 정수 num과 k가 매개변수로 주어질 때, num을 이루는 숫자 중에 k가 있으면 num의 그 숫자가 있는 자리 수를 return하고 없으면 -1을 return 하도록 solution 함수를 완성해보세요.

func solution(_ num:Int, _ k:Int) -> Int {
    var result = -1
    String(num).enumerated().forEach {
        if result == -1 && Int(String($1))! == k {
            result = $0 + 1
        }
    }
    return result
}

 

A. 전달 받은 num을 String으로 변환한 후 enumerated()를 통해 반복하면서

result가 -1이고 해당 원소가 전달 받은 k일 때, result의 값에 해당 index에 1을 더한 값을 저장한 후

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

 

feat.

func solution(_ num:Int, _ k:Int) -> Int {
    let s = String(num).map{ Int(String($0))! }
    return (s.firstIndex(of: k) ?? -2) + 1
}

 

다른 풀이를 보았을 때,

firstIndex(of:)를 사용하면 손쉽게 문제를 해결할 수 있다는 것을 알게 되었다.

2. n의 배수 고르기

Q. 정수 n과 정수 배열 numlist가 매개변수로 주어질 때, numlist에서 n의 배수가 아닌 수들을 제거한 배열을 return하도록 solution 함수를 완성해주세요.

func solution(_ n:Int, _ numlist:[Int]) -> [Int] {
    return numlist.filter { $0 % n == 0 }
}

 

A. 전달 받은 numlist를 고차함수 filter를 통해 순회하면서 원소를 n으로 나누었을 때, 나머지가 0인 원소들만 배열로 반환하여 해결했다.

3. 자릿수 더하기

Q. 정수 n이 매개변수로 주어질 때 n의 각 자리 숫자의 합을 return하도록 solution 함수를 완성해주세요

func solution(_ n:Int) -> Int {
    return String(n).map { Int(String($0))! }.reduce(0, +)
}

 

A. 전달 받은 n을 String으로 변환한 후 고차함수 map을 통해 순회하면서 각 자리의 문자열을 정수로 변환한 배열을 반환하였고,

해당 배열을 고차함수 reduce를 통해 모두 더한 후 반환하여 해결했다.

4. OX 퀴즈

Q. 덧셈, 뺄셈 수식들이 'X [연산자] Y = Z' 형태로 들어있는 문자열 배열 quiz가 매개변수로 주어집니다. 수식이 옳다면 "O"를 틀리다면 "X"를 순서대로 담은 배열을 return하도록 solution 함수를 완성해주세요.

func solution(_ quiz:[String]) -> [String] {
    var result: [String] = []
    quiz.forEach {
        var value: Int = 0
        var isPlus = false
        $0.components(separatedBy: " ").enumerated().forEach {
            switch $0 {
                case 0:
                    value = Int($1)!
                case 1:
                    isPlus = ($1 == "+")
                case 2:
                    value += isPlus ? Int($1)! : Int($1)! * -1
                case 4:
                    result.append(value == Int($1)! ? "O" : "X")
                default:
                    break
            }
        }
    }
    return result
}

 

A. 전달 받은 quiz를 forEach문을 통해 순회하면서

매번 수식의 결과가 옳은지 판단하기 위한 value를 생성하고 연산자가 +인지 -인지 판별하는 변수isPlus를 생성한다.

그리고 수식을 components(separatedBy:)를 통해 배열로 변환한 후,

enumerated()와 forEach를 통해 index와 value를 접근할 수 있도록 반복하면서 switch문을 통해

첫 번째일 때는 X를 value에 저장

두 번째일 때는 연산자를 판별

세 번째일 때는 연산자에 따라 value에 Y를 연산

네 번째일 때는 등호 연산자임으로 넘어가고

다섯 번째일 때는 연산한 값과 Z의 값을 비교해 result에 "O", "X" 값을 저장한다.

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


오블완 챌린지가 끝나고 글 쓰는게 너무 귀찮아서 계속 미뤄오다가

12월의 첫 평일인 오늘 다시 마음을 잡고 글을 쓰게 되었다.

예상했던 것처럼 한 번 마음을 놓아버리니 계속 놓게 되는 악습관이 있는 것 같은데,,,

남은 문제도 얼른 풀어버릴 수 있도록 다시 한 번 마음을 잡아보자!

내일도 화이팅!