본문 바로가기

 𝗔𝗣𝗣𝗟𝗘/ALGORITHM

알고리즘 복습(01)

두 수의 곱

정수 num1, num2가 매개변수 주어집니다.  num1과 num2를 곱한 값을 return 하도록 solution 함수를 완성해주세요.

// Code(01) - 정답 

import Foundation

func solution(_ num1:Int, _ num2:Int) -> Int {
    return num1 * num2
}

 

 

 


 

두 수의 차 

정수 num1과 num2가 주어질 때,  num1에서 num2를 뺀 값을 return하도록 soltuion 함수를 완성해주세요.

// Code(01) - 정답 

function solution(num1, num2) {
    var answer = num1 - num2
    return answer
}
// Code(02) - 오답

function solution(num1, num2) {
    return num1 - num2
}

위 코드를 좀 더 간결하게 바꿀 수 있지 않을까? 라는 생각으로 수정(Code(02))했더니 런타임 에러가 발생했다.

 

💡 코드를 분석해보니 두 함수는 반환 방식에서 차이가 있었다.

에러가 확인된 코드(Code(02))는 결과를 바로 반환하지만, 정답 코드(Code(01))는 결과를 변수에 할당한 후 반환한다는 점이다.

이때 에러가 발생한 코드(Code(02))에서 return num1 - num2와 같이 결과를 바로 반환하면 변수 num1과 num2를 찾을 수 없어 런타임 에러가 발생한다.

 

반면, var answer = num1 - num2와 같이 결과를 answer 변수에 할당한 후에 반환한다면 변수 answer에는 num1 - num2의 결과가 할당되어 있기 때문에 반환할 값이 존재하고 그로 인해 런타임 에러가 발생하지 않는다.

 

 


 

두 수의 합 

정수 num1과 num2가 주어질 때, num1과 num2의 합을 return하도록 soltuion 함수를 완성해주세요.

// Code(01) - 정답 

import Foundation

func solution(_ num1:Int, _ num2:Int) -> Int {
    var answer = num1 + num2 
    return answer
}

 

 


 

몫 구하기 

정수 num1, num2가 매개변수로 주어질 때,  num1을 num2로 나눈 몫을 return 하도록 solution 함수를 완성해주세요.

// Code(01) - 정답 

import Foundation

func solution(_ num1:Int, _ num2:Int) -> Int {
		var answer = num1 / num2
    return answer
}

 


 

나머지 구하기 

정수 num1, num2가 매개변수로 주어질 때,  num1를 num2로 나눈 나머지를 return 하도록 solution 함수를 완성해주세요.

// Code(01) - 정답 

import Foundation

func solution(_ num1:Int, _ num2:Int) -> Int {
    var answer = num1 % num2 
    return answer
}

 


 

두 수의 나눗셈 

정수 num1과 num2가 매개변수로 주어질 때,  num1을 num2로 나눈 값에 1,000을 곱한 후 정수 부분을 return 하도록 soltuion 함수를 완성해주세요.

// Code(01) - 오답

import Foundation

func solution(_ num1:Int, _ num2:Int) -> Int {
    var answer = num1 / num2 * 1000 
    return answer
}

 

단순하게 나누고 곱하는 문제로 생각하고 코드를 작성했을 때 오답 처리가 되었다.

그리고 다시 입출력 된 예를 보니 소수점 이하 부분까지 포함하여 계산해야 한다는 걸 깨달았다.

 

// Code(02) - 정답 

import Foundation

func solution(_ num1:Int, _ num2:Int) -> Int {
    var answer = Int((Double(num1) / Double(num2)) * 1000)
    return answer
}

 

두번째 시도에 정답처리가 되었고, 이 경우에는 왜 Double을 써야하는지에 대해 더 자세히 알아봤다.

 

💡 두 코드의 차이점은 정수형 num1과 num2를 Double로 형변환을 했느냐 였다. 정답처리 된 코드(Code(02))에서는 나눗셈 시 Double로 형변환 후 소수점 이하의 결과값을 얻고 이후 1000을 곱하면서 소수점 이하를 버리지 않고 보존하게 된다.

 

하지만 처음 시도(Code(01))에서는 나눗셈을 정수형으로 진행하기 때문에 소수점 이하를 버린 후 1000을 곱한 값을 반환하며, 이럴 경우 정확한 결과값을 얻을 수 없다.

 

따라서 정확한 결과를 얻기 위해서는 연산 시 소수점 이하까지 고려하여 계산할 수 있도록 Double형을 사용하여 형변환을 진행해줘야 한다. 특히 정수형 나눗셈 결과가 소수점 이하를 버리는 경우, 미리 Double 형으로 형변환하여 나눗셈을 수행하는 것이 좋을 것 같다.

 


 

숫자 비교하기 

정수 num1과 num2가 매개변수로 주어집니다. 두 수가 같으면 1 다르면 -1을 retrun하도록 solution 함수를 완성해주세요.

// Code(01) - 정답 

import Foundation

func solution(_ num1:Int, _ num2:Int) -> Int {
    var answer = (num1 == num2 ? 1 : -1)
    return answer
}
// Code(02) - 이전 코드

import Foundation

func solution(_ num1:Int, _ num2:Int) -> Int {
    return num1 == num2 ? 1 : -1
}

복습하며 풀었던 코드(Code(01))와 처음 풀었던 코드(Code(02))와 비교해 봤을 때 차이가 존재했다.

 

💡 두 코드의 차이점은 변수 할당 여부와 반환 구문의 직접적인 차이가 있었다.

첫 번째 코드(Code(01))에서는 삼항 조건 연산자를 사용하여 answer 변수에 값을 할당한 후에 answer 변수를 반환하지만, 두 번째 코드(Code(02))에서는 삼항 조건 연산자를 바로 반환 구문에 사용한다. 일반적으로 더 간단한 코드가 더 읽기 쉽고 유지보수하기 쉬우나, 변수에 할당하지 않을 경우 런타임 에러가 발생하는 경우가 종종 있다. 상황에 따라 다르겠지만 복잡한 연산과정과 반환값이 불명확한 경우, 예외상황 또는 타입 불일치 등의 문제가 발생할 수 있기 때문에 변수에 할당하여 값을 반환하는 것이 좋을 것 같다.

 

 


 

나이 출력 

머쓱이는 40살인 선생님이 몇 년도에 태어났는지 궁금해졌습니다. 나이 age가 주어질 때, 2022년을 기준 출생 연도를 return 하는 solution 함수를 완성해주세요.

// Code(01) - 정답 

import Foundation

func solution(_ age:Int) -> Int {
    var answer = 2023 - age
    return answer
}

 


 

각도기 

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

// Code(01) - 정답 

import Foundation

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

 


 

짝수의 합 

정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.

// Code(01) - 정답 

import Foundation

func solution(_ n: Int) -> Int {
    var answer = stride(from: 2, through: n, by: 2).reduce(0, +)
    return answer
}

 

n 이하의 짝수를 어떻게 구할 수 있을지에 대해 검색해봤을 때 stride 함수와 reduce 함수를 사용하는 게 좋을 것 같았다.

 

stride 함수: 일정한 간격의 값들을 생성할 때 사용, 특히 순차적으로 증가하는 값들을 다룰 때 유용

reduce 함수: 컬렉션의 모든 요소를 단일 값으로 합칠 때 사용, 주로 컬렉션의 요소를 집계하거나 변환할 때 유용

 

 

💡 stride 함수는 일정한 간격으로 값들을 생성하는 데 사용되며, 시작 값부터 종료 값까지 지정된 간격으로 반복하여 값을 생성한다. from 매개변수는 시작 값을, through 매개변수는 종료 값을, by 매개변수는 간격을 나타내며, stride(from: 2, through: n, by: 2)는 2부터 시작하여 n까지의 모든 짝수를 나타낸다.

reduce 함수는 컬렉션의 각 요소에 대해 제공된 클로저를 실행하여 컬렉션의 값을 단일 값으로 결합하는 데 사용한다. 이 코드(Code(01))에서는 stride 함수를 통해 생성된 모든 짝수를 합산하기 위해 사용되었으며, 초기값이 0으로 설정, 클로저의 결과가 합산되어 최종 결과를 반환한다.

 


 

배열의 평균값 

정수 배열 numbers가 매개변수로 주어집니다.  numbers의 원소의 평균값을 return하도록 solution 함수를 완성해주세요.

// Code(01) - 정답 

import Foundation

func solution(_ numbers:[Int]) -> Double {
    var answer = Double(numbers.reduce(0, +)) / Double(numbers.count)
    return answer
}

(0, +) : reduce 메서드의 초기값과 클로저를 나타냄

  • 0은 초기값, +는 클로저
  • 초기값(0)은 reduce 메서드에서 사용되는 누적값의 초기값으로 사용
  • + 클로저는 두 인자를 가져와서 더하는 연산을 수행

 

💡 numbers.reduce(0, +) 부분은 배열 numbers의 모든 요소를 합산하여 하나의 값으로 줄이는 과정을 의미하며, 이 결과는 정수형이다. 하지만 이 값을 배열의 요수 개수로 나누어 평균 값을 구할 때 정수형으로 나눌 경우 정확한 결과 값을 얻을 수 없다.

 

예를 들어 [1, 2, 3] 배열의 평균을 구할 때, 합은 **6**이고 개수는 3, **6 / 3**으로 계산 시 결과는 **2**가 된다.

 

따라서 정확한 평균을 구하기 위해서는 나눗셈 연산 시 실수형으로 진행해야 한다. 그렇기 때문에 Double형으로 변환하여 나눗셈을 진행했다. 이럴 경우 정수형과 실수형 간의 나눗셈이 이루어져 정확한 평균 값을 얻을 수 있었다.

 

 

Recent Posts
Visits
Today
Yesterday
Archives
Calendar
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31