본문 바로가기

Mobile/Swift

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

반응형


1. 주사위의 개수
Q. 머쓱이는 직육면체 모양의 상자를 하나 가지고 있는데 이 상자에 정육면체 모양의 주사위를 최대한 많이 채우고 싶습니다. 상자의 가로, 세로, 높이가 저장되어있는 배열 box와 주사위 모서리의 길이 정수 n이 매개변수로 주어졌을 때, 상자에 들어갈 수 있는 주사위의 최대 개수를 return 하도록 solution 함수를 완성해주세요.

**제한사항
box의 길이는 3입니다.
box[0] = 상자의 가로 길이
box[1] = 상자의 세로 길이
box[2] = 상자의 높이 길이
1 ≤ box의 원소 ≤ 100
1 ≤ n ≤ 50
n ≤ box의 원소
주사위는 상자와 평행하게 넣습니다.
func solution(_ box:[Int], _ n:Int) -> Int {
    Int(box[0]/n) * Int(box[1]/n) * Int(box[2]/n)
}

2. 합성수 찾기
Q. 약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.

A. 문제풀기

// 본인 풀이
func solution(_ n:Int) -> Int {
    var nums1 = Int()

    for i in 1...n {
        var nums2: Int = 0

        for j in 1...i {
            if i % j == 0 {
                nums2 += 1
            }

            if nums2 >= 3 {
                nums1 += 1
                break
            }
        }
    }
    return nums1
}
// 다른 사람 풀이
func solution(_ n: Int) -> Int { 
	(1...n).filter { i in (1...i).filter { i % $0 == 0 }.count > 2 }.count 
    }

다른 사람의 풀이를 보면 내가 했던 풀이를 스위프트 내장함수인 filter를 이용해 쉽게 해결했다. 먼저 1부터 n까지의 숫자를 차례로 i 에 넣고, 다시 1부터 i가지의 숫자를 차례로 필터해준다. 이때 i를 차례로 1부터 i까지 나눠준다. 이들 중 나머지가 0이 되는 수의 개수를 세고, 다시 0이되는 수가 2개 이상인 수를 센다. 그렇게 되면 위에서 본인이 했던 과정과 같은 과정이 된다.


3. 팩토리얼
Q. i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 * 4 * 3 * 2 * 1 = 120 입니다. 정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.
- i! <= n

A. 문제풀기
- 최대값이 10이기 때문에 10까지의 팩토리얼 리스트를 구한다.

// 팩토리얼 값 구하는 방법
var nums = (1...10).reduce(1, *)

// 1!부터 10!까지 값을 리스트로 만드는 방법
var maps = (1...10).map { (1...$0).reduce(1, *)}

 

- 그 중 주어진 n의 값과 비교해 작은 값들만 숫자를 센다.

func solution(_ n:Int) -> Int {
    return (1...10).map { (1...$0).reduce(1, *) }.filter { $0 <= n }.count
}

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

A. 문제풀기
- 모음을 리스트로 만들어서, 포함여부를 체크하고 필터링한다.

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

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

I. 문제 파악하기
- my_string 안에 있는 숫자를 고른다.
- 오름차순으로 정렬한다.
- 리스트로 반환한다.

A. 문제풀기
- 문자열을 하나씩 숫자인지 확인한다.

var strings = "hi12392"
var filters = strings.filter { $0.isNumber }
// "12392"

- 결과로 나온 문자열을 map 함수를 통해 리스트로 바꿔준다. 이 때, 문자열을 map 함수로 하나씩 불러올 때 문자로 들어온다. 이를 해결하기 위해 문자를 문자열로 변경하고 다시 문자열을 정수형으로 변경한다. 또 옵셔널 형태로 들어오기 때문에 강제로 옵셔널을 해제해주는 ! 를 붙여준다.

var filters = strings.filter { $0.isNumber }.map { Int(String($0))! }

- 이제 마지막 조건인 오름차순으로 정리해준다.

var filters = strings.filter { $0.isNumber }.map { Int(String($0))! }.sorted()

6. 숨어있는 숫자의 덧셈 (1)
Q. 문자열 my_string이 매개변수로 주어집니다. my_string안의 모든 자연수들의 합을 return하도록 solution 함수를 완성해주세요.

I. 문제 파악하기
- 문자열에서 숫자를 분리한다.
- 숫자를 합한다.

A. 문제풀기

func solution(_ my_string:String) -> Int {
     return my_string.compactMap{Int(String($0))}.reduce(0,+)
}
compactMap : 1차원 배열에서 nil을 제거하고 옵셔널 바인딩을 해준다.

반응형