본문 바로가기

Mobile/Swift

[코딩테스트 입문] Swift - Day 6

반응형

1. 직각삼각형 출력하기
Q. "*"의 높이와 너비를 1이라고 했을 때, "*"을 이용해 직각 이등변 삼각형을 그리려고합니다. 정수 n 이 주어지면 높이와 너비가 n 인 직각 이등변 삼각형을 출력하도록 코드를 작성해보세요.

import Foundation

let n = readLine()!.components(separatedBy: [" "]).map { Int($0)! }
(1...n[0]).forEach { print(String(repeating:"*", count:$0))}

2. 외계행성의 나이
Q. 우주여행을 하던 머쓱이는 엔진 고장으로 PROGRAMMERS-962 행성에 불시착하게 됐습니다. 입국심사에서 나이를 말해야 하는데, PROGRAMMERS-962 행성에서는 나이를 알파벳으로 말하고 있습니다. a는 0, b는 1, c는 2, ..., j는 9입니다. 예를 들어 23살은 cd, 51살은 fb로 표현합니다. 나이 age가 매개변수로 주어질 때 PROGRAMMER-962식 나이를 return하도록 solution 함수를 완성해주세요.

// 반복문을 이용한 방법
func solution(_ age:Int) -> String {
    var alphabets: [String] = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
    var result = ""
    for i in String(age) {
        result += alphabets[Int(String(i))!]
    }
    return result
}
// 고차함수를 이용한 방법
func solution(_ age:Int) -> String {
    let alphabets = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
    return String(age).map{alphabets[Int(String($0))!]}.joined()
}

3. 진료순서 정하기
Q. 외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.

func solution(_ emergency:[Int]) -> [Int] {
    emergency.map {emergency.sorted(by: >).firstIndex(of:$0)!+1}
}

4. 순서쌍의 개수
Q. 순서쌍이란 두 개의 숫자를 순서를 정하여 짝지어 나타낸 쌍으로 (a, b)로 표기합니다. 자연수 n이 매개변수로 주어질 때 두 숫자의 곱이 n인 자연수 순서쌍의 개수를 return하도록 solution 함수를 완성해주세요.

func solution(_ n: Int) -> Int { (1...n).filter { n % $0 == 0 }.count }

5. 개미 군단
Q. 데리고 나가려고 합니다. 장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다. 예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만, 장군개미 네 마리와 병정개미 한 마리를 데리고 간다면 더 적은 병력으로 사냥할 수 있습니다. 사냥감의 체력 hp가 매개변수로 주어질 때, 사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return하도록 solution 함수를 완성해주세요.

func solution(_ hp:Int) -> Int {
    var tempHp = hp
    var result = 0
    for i in [5, 3, 1] {
        result += tempHp / i
        tempHp %= i
    }
    return result
}

위에는 내가 푼 코드이고, 아래는 다른 사람이 푼 코드이다.. 이렇게 쉽게 풀 수 있는 걸 어렵게 생각해서 어렵게 풀어버렸다... 기본적인 원리는 똑같이 생각했는데, 문제가 길다보니 답도 길지 않을까 하는 생각에 어렵게 풀다보니 코드가 길어졌다.

func solution(_ hp: Int) -> Int { hp / 5 + hp % 5 / 3 + hp % 5 % 3 }

문제 길이에 현혹되지 말고 원리를 차근차근 생각해보도록 하자. 단순히 더하기 만으로도 해결할 수 있는 문제가 많이 있다.
6. 모스부호(1)
Q. 머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 문자열 letter가 매개변수로 주어질 때, letter를 영어 소문자로 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.
모스부호는 다음과 같습니다.

모스 부호
morse = [
".-":"a","-...":"b","-.-.":"c","-..":"d",".":"e","..-.":"f",
"--.":"g","....":"h","..":"i",".---":"j","-.-":"k",".-..":"l",
"--":"m","-.":"n","---":"o",".--.":"p","--.-":"q",".-.":"r",
"...":"s","-":"t","..-":"u","...-":"v",".--":"w","-..-":"x",
"-.--":"y","--..":"z"
]
func solution(_ letter:String) -> String {
    var morse = [
        ".-":"a","-...":"b","-.-.":"c","-..":"d",".":"e","..-.":"f",
        "--.":"g","....":"h","..":"i",".---":"j","-.-":"k",".-..":"l",
        "--":"m","-.":"n","---":"o",".--.":"p","--.-":"q",".-.":"r",
        "...":"s","-":"t","..-":"u","...-":"v",".--":"w","-..-":"x",
        "-.--":"y","--..":"z"
    ]
    return letter.split(separator: " ").map {morse[String($0)]!}.joined()
}

7. 가위 바위 보
Q. 가위는 2 바위는 0 보는 5로 표현합니다. 가위 바위 보를 내는 순서대로 나타낸 문자열 rsp가 매개변수로 주어질 때, rsp에 저장된 가위 바위 보를 모두 이기는 경우를 순서대로 나타낸 문자열을 return하도록 solution 함수를 완성해보세요.

func solution(_ rsp:String) -> String {
    rsp.map {["2":"0", "0":"5", "5":"2"][String($0)]!}.joined()
}
func solution2(_ rsp:String) -> String {
    rsp.map {$0 == "5" ? "2" : $0 == "2" ? "0" : "5"}.joined()
}

8. 구슬을 나누는 경우의 수
Q. 머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.

- 1 try

func solution(_ balls:Int, _ share:Int) -> Int {
    balls - share == 0 ? 1 : (1...balls).reduce(1) {$0 * $1}/((1...balls-share).reduce(1) {$0 * $1} * (1...share).reduce(1) {$0 * $1})
}

- 2 try

func solution(_ balls:Int, _ share:Int) -> Int {
    func factorial(_ n: Int) -> Int {
        if n == 0 || n == 1 { return 1}
        return n * factorial(n - 1)
    }

    return factorial(balls)/(factorial(balls-share)*factorial(share))
}

- 3 try

func solution(_ balls:Int, _ share:Int) -> Int {
    guard balls - share != 0 else {
        return 1
    }
    var a = Set((share+1...balls))
    var b = Set((1...balls-share))
    return a.subtracting(b).reduce(1){ $0 * $1 } / b.subtracting(a).reduce(1) {$0 * $1}
}

위의 두 식은 문제의 힌트를 보고 식대로 만들어 본 코드이다. 테스트가 무난히 통과되었지만 문제가 있었다. 너무 큰 수를 계산하는 테스트에서 오류가 발생하는 것. Int 가 가질 수 있는 크기를 넘었기 때문이다. 이를 해결하기 위해 팩토리얼을 계산하기 전에 분자와 분모를 소거하는 방법을 찾아보았다. 그 결과 아래와 같은 코드를 작성할 수 있었다.

func solution(_ balls:Int, _ share:Int) -> Int {
    // balls 와 share 가 같은 값인 경우 1을 반환
    // 0! 은 1 이기 때문에
    guard balls != share else { return 1 }
    
    // 결과 값을 담을 그릇을 Double 로 선언
    var answer: Double = 1
 	
    // 아래 설명 참고
    for i in 1...share {
        answer *= Double(balls-share+i)
        answer /= Double(i)
    }
    return Int(answer)
}


아래 예시를 보자, balls 가 10, share 가 3인 경우를 식으로 표현했다.

그림1

이를 주어진 힌트에 대입해서 풀어보면 아래와 같은 식이된다. 분자와 분모의 길이는 같다. 그럼 이걸 for 문을 통해 계산하면 어떻게 될까?

// 첫 번째 for문
balls-share+i :  8
* answer :  8.0
i :  1
/ answer :  8.0

// 두 번째 for문
balls-share+i :  9
* answer :  72.0
i :  2
/ answer :  36.0

// 세 번째 for문
balls-share+i :  10
* answer :  360.0
i :  3
/ answer :  120.0

// 출력
최종 answer :  120

"그림1" 에서 분자의 1부터 7까지는 분모에 의해 나누어 떨어진다. 그럼 남는 부분은 분자 8, 9, 10 그리고 분모 1, 2, 3이다. 분모는 결국 share와 같다. 또 분모는 1에서 10까지의 곱 중 1에서 7을 뺀 나머지 8, 9, 10이다. 이를 코드로 만들어주면 위의 코드와 같다.
9. 자릿수 더하기
Q. 정수 n이 매개변수로 주어질 때 n의 각 자리 숫자의 합을 return하도록 solution 함수를 완성해주세요.

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

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

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

11. 제곱수 판별하기
Q. 어떤 자연수를 제곱했을 때 나오는 정수를 제곱수라고 합니다. 정수 n이 매개변수로 주어질 때, n이 제곱수라면 1을 아니라면 2를 return하도록 solution 함수를 완성해주세요.

func solution(_ n: Int) -> Int { sqrt(Double(n)) == floor(sqrt(Double(n))) ? 1 : 2 }



출처: https://school.programmers.co.kr/learn/challenges

반응형