lang/swift

[programemrs] LV0 정리

SHplusR 2022. 11. 19. 00:50

하다가 약간 헤맸던 부분 / 한번 틀리고 다시 시도했던 / 여러가지 방법이 있는 LV0 정리

 

 

1. 각도기

각에서 0도 초과 90도 미만은 예각, 90도는 직각, 90도 초과 180도 미만은 둔각 180도는 평각으로 분류합니다. 각 angle이 매개변수로 주어질 때 예각일 때 1, 직각일 때 2, 둔각일 때 3, 평각일 때 4를 return하도록 solution 함수를 완성해주세요.

 

 

내 소스 :

swift 언어 공부를 전혀 하지 않고 쓴 코드...

import Foundation

func solution(_ angle:Int) -> Int {
    if angle > 90 && angle < 180{
        return 3
    }
    else if angle == 90{
        return 2
    }
    else if angle == 180{
        return 4
    }
    else{
        return 1
    }
}

 

참고하면 좋은 소스 :

import Foundation

func solution(_ angle:Int) -> Int {
    return angle < 90 ? 1 : angle == 90 ? 2 : angle < 180 ? 3 : 4
}

삼항조건부 연산자를 사용함. 

:을 구분자삼아 조건문 ? 리턴값 을 따른다. 위 코드를 해석하면

angle < 90? 1 --> if(angle <90)이라면 return 1

: angle == 90 ? 2 --> if(angle == 90)이라면 return 2

: angle <180 ? 3 --> if(angle <180)이라면 return 3

: 4 --> else 이라면 return 4

 

if bool형이라면 :를 기반으로 앞에 있는게 참 리턴 값, 뒤에 있는게 거짓 리턴값이다.

  1. let contentHeight = 40
  2. let hasHeader = true
  3. let rowHeight = contentHeight + (hasHeader ? 50 : 20)
  4. // rowHeight is equal to 90 

여기선 hashHeader가 참이므로 40+50인 90이 나온다.

 

 

 

 

2. 배열 원소의 길이 

 

문자열 배열 strlist가 매개변수로 주어집니다. 

strlist 각 원소의 길이를 담은 배열을 retrun하도록 solution 함수를 완성해주세요.

 

 

 

내 소스 : 

import Foundation

func solution(_ strlist:[String]) -> [Int] {
    var answer:[Int] = []
    for i in 0..<(strlist.count){
        answer.append(strlist[i].count)
    }
    return answer
}

strlist의 길이( 리스트 원소의 개수) 만큼 for문을 돌리고, 인덱스에 해당하는 strlist의 길이를 answer이라는 list에 append하여 return한다.

 

 

참고하면 좋은 소스 1:

import Foundation

func solution(_ strlist:[String]) -> [Int] {
    var result: [Int] = []
    for str in strlist {
        result.append(str.count)
    }
    return result
}

 

 

왜 굳이 for문을 돌렸던걸까??? swift가 쉽게 길을 내줬는데 내가 굳이굳이 돌아가고있었다...

몰랐던 점 : 

(1) 굳이 index로 접근하지 않아도 

for str in strlist로 원소 하나하나에 접근가능하구나

(2) length()이 아니라 .count로 문자열의 개수를 셀 수 있구나.

 

++)

배열의 문자열이 비여있을때 .count ==  0이라고 if문을 줘도 되지만, swift에는  isEmpty라는 편리한 함수가 존재한다

 

 

 

참고하면 좋은 소스 2:

import Foundation

func solution(_ strlist:[String]) -> [Int] {
    return strlist.map({ $0.count })
}

map이란? 

 

https://developer.apple.com/documentation/swift/set/map(_:)-87c44 

 

Apple Developer Documentation

 

developer.apple.com

map은 swift의 고차함수로, 데이터 변환이 가능하다. 예제 코드는 아래와 같다. 

새로운 형태로 저장이 가능하다.

let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let lowercaseNames = cast.map { $0.lowercased() }
// 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"]
let letterCounts = cast.map { $0.count }
// 'letterCounts' == [6, 6, 3, 4]

 

 

 

3. 배열의 유사도

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

 

 

내 소스 : 

import Foundation

func solution(_ s1:[String], _ s2:[String]) -> Int {
    var count = 0
    for i in s1{
        for j in s2{
            if(i == j){
                count+=1
            }
            else
            {

            }
        }
    }
    return count
}​

하하~ swift공부 전 쓴 코드다. 이중for문을 사용했다. 

 

참고하면 좋은 소스 :

import Foundation
// 고차함수 -> 다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수.
// filter는 데이터를 추출할 때 사용한다. 
func solution(_ s1:[String], _ s2:[String]) -> Int {
    return s1.filter{s2.contains($0)}.count
}

filter란?

https://developer.apple.com/documentation/swift/set/filter(_:) 

 

Apple Developer Documentation

 

developer.apple.com

filter는 데이터를 추출할 때 사용되는 고차함수이다. 

아래 예제는 

 cast라는 set의 원소 하나의 길이가 5미만인 요소만 추출하여 shortNames 에 넣는다는 뜻이다.

let cast: Set = ["Vivien", "Marlon", "Kim", "Karl"]
let shortNames = cast.filter { $0.count < 5 }

shortNames.isSubset(of: cast)
// true
shortNames.contains("Vivien")
// false

 

 

4. n의 배수

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

 

내 코드 : 

// import Foundation

// func solution(_ n:Int, _ numlist:[Int]) -> [Int] {
//     var result:[Int] = []
//     for i in numlist{
//         if i % n == 0{
//             result.append(i)
//         }
//     }
//     return result
// }

import Foundation

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

위 주석처리된 코드는 고차함수 공부하기 전.

아래는 filter라는 함수를 알게 된 후 쓴 코드.

각 요소를 n으로 나눴을때 나머지가 0인 요소만 result라는 int형 list에 append한다는 뜻.

 

참고하면 좋을 소스1 : 

import Foundation

func solution(_ n:Int, _ numlist:[Int]) -> [Int] {
    var result: [Int] = []
    for i in numlist where i % n == 0 {
        result.append(i)
    } 
    return result
}

몰랐던 점 : 

신기하다! sql문 처럼 where 조건절을 써도 되는구나!

 

 

 

참고하면 좋을 소스2 :

import Foundation

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

위에서 배운 filter함수를 사용하면 더 코드를 짧게 사용가능하다!

 

 

 

5. 자릿수 더하기

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

 

 

내 소스 : 

 

import Foundation

func solution(_ n:Int) -> Int {
    var result:Int = 0
    for i in String(n) {
        result += Int(String(i))
    }
    return result
}

n을 string으로 가져와 각 자릿수를 더한다.

 

 

참고하면 좋은 소스 : 

import Foundation

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

reduce란?

 

https://developer.apple.com/documentation/swift/set/reduce(_:_:) 

 

Apple Developer Documentation

 

developer.apple.com

주로 원소를 모두 합칠때 사용이 된다. 

아래 예제 코드에서 

0은 _ initialResult: Result 로 초기 누적값이다.

{x,y in x +y}는 누적 값과 시퀀스의 요소를 새로운 누적 값으로 결합하여 클로저의 다음 호출에 사용되거나 호출자에게 반환되는 클로저이다.

let numbers = [1, 2, 3, 4]
let numberSum = numbers.reduce(0, { x, y in
    x + y
})
// numberSum == 10

 

 

6. 문자열 안에 문자열

문자열 str1, str2가 매개변수로 주어집니다. str1 안에 str2가 있다면 1을 없다면 2를 return하도록 solution 함수를 완성해주세요.

 

 

내 소스 : 

import Foundation

func solution(_ str1:String, _ str2:String) -> Int {
    if str1.contains(str2){
        return 1
    }
    else
    {
        return 2
    }
}

str1에 str을 포함한다면 return 1, 아니면 return2다.

 

참고하면 좋은 소스 : 

import Foundation

func solution(_ str1:String, _ str2:String) -> Int { str1.contains(str2) ? 1 : 2 }

삼항조건부를 사용한다. 

 

 

7. 세균증식

어떤 세균은 1시간에 두배만큼 증식한다고 합니다. 처음 세균의 마리수 n과 경과한 시간 t가 매개변수로 주어질 때 t시간 후 세균의 수를 return하도록 solution 함수를 완성해주세요.

내 소스 : 

 

import Foundation

func solution(_ n:Int, _ t:Int) -> Int {
    return n * Int(pow(2.0,Double(t)))
}

pow란?

 

https://developer.apple.com/documentation/foundation/1779833-pow

 

Apple Developer Documentation

 

developer.apple.com

func pow( _ x: Decimal, _ y: Int ) -> Decimal로, 

예를 들면 pow(2,3)이면 2의 3승인것이다.

위 문제는 1시간에 2배씩 증가하므로 t시간 후의 세균의 수는 n * 2^t이 된다. 그러므로 pow함수를 이용하여 

위와 같이 짜면된다~

8. 피자나눠먹기(1)

머쓱이네 피자가게는 피자를 일곱 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 주어질 때, 모든 사람이 피자를 한 조각 이상 먹기 위해 필요한 피자의 수를 return 하는 solution 함수를 완성해보세요.

 

import Foundation

func solution(_ n:Int) -> Int {
    var result = 0
    if Int(n/7) <= 1{
        result = 1
    }
    else{
        if(Int(n%7) != 0){
            result = (n/7)+1
        }
        else{
            result = n/7
        }
    }
    return result
}

 

나는 위와같이 코드를 짰다. ( 바보같았다!)

 

참고하면 좋은 소스 : 

import Foundation

func solution(_ n:Int) -> Int {
    return n%7 == 0 ? n/7 : n/7+1
}

만약 명수가 7의 배수라면 몫만큼의 피자판이 필요하다.

7의배수가 아닌 수라면 몫 +1판만큼이 필요하다. 3  / 7 = 0...3 이므로, 위와 같이 한줄로 표현 가능하다

삼항연산자를 사용한다!!

 

9. 피자나눠먹기(2)

머쓱이네 피자가게는 피자를 여섯 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 매개변수로 주어질 때, n명이 주문한 피자를 남기지 않고 모두 같은 수의 피자 조각을 먹어야 한다면 최소 몇 판을 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.

import Foundation

func solution(_ n:Int) -> Int {
    func gcd(_ a: Int, _ b: Int) -> Int {
    if b == 0 {
        return a
    } else {
        return gcd(b, a%b)
    }
}
    var m = gcd(n,6)
    return n/m
    
}

모두 같은 조각을 먹어야하므로, n과 6의 최소공배수만큼의 조각이 필요하다. 

그러므로 n에 n과 6의 최대공약수를 나누었을때 몫만큼의 판이 필요하다.