본문 바로가기

Develop/Coding Test

코딩 테스트 입문 (feat. Day 2 사칙연산, 조건문, 배열)

2일차   스탬프

1. 두 수의 나눗셈

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

func solution(_ num1:Int, _ num2:Int) -> Int {
    let floatNum1 = Float(num1)
    let floatNum2 = Float(num2)
    var result = floatNum1 / floatNum2 * 1000
    return Int(result)
}

 

A. 입력 받은 Int 값을 Float으로 형변환 후, / 연산자를 통해 몫을 구하고 그 값에 1,000을 구하고

정수 부분만 return 하기 위해 Int로 다시 형변환 한 값을 return으로 반환시켜 해결했다.

 

feat.

문제를 해결하고 다른 사람의 풀이를 보는데,

생각치도 못한 방법으로 깔끔하게 문제를 해결한 방법을 보며 감탄했다.

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

 

위 방식처럼 계산의 순서만 바꾸는 아이디어를 사용하면 번거롭게 형변환을 할 필요 없이 

단순 계산만으로 정수 부분을 구할 수 있다는 사실을 깨달았다.

때문에, 다른 사람들의 풀이도 꼭 보면서

다양한 관점으로 문제를 해결하는 능력을 기르면 좋을 것 같다!

2. 숫자 비교하기

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

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

 

A. 입력 값을 비교한 후, 삼항 연산자인 ?를 사용하여 결과값을 return으로 반환시켜 해결했다.

3. 분수의 덧셈

Q. 첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.

func solution(_ numer1:Int, _ denom1:Int, _ numer2:Int, _ denom2:Int) -> [Int] {
    let denom = denom1 * denom2
    let numer = numer1 * denom2 + numer2 * denom1
    var gcd = 1
    for i in 1...denom {
        if denom % i == 0 {
            for j in 1...numer {
                if numer % j == 0 {
                    if i == j {
                        gcd = i
                    }
                }
            }
        }
    }
    return [numer / gcd, denom / gcd]
}

 

A. 문제 해결을 위해 과정을 두 단계로 나누었다.

1. 두 분수를 덧셈

2. 더한 분수를 기약 분수로 나타내기

먼저, 첫번째 단계를 위해 두 분수의 분모를 곱하여 분모를 동일하게 맞추고 그에 맞는 분자를 구하여 두 분수를 더한 분수의 분모와 분자를 구했다.

그리고 기약분수로 나타내기 위해 반복문을 사용하여 최대공약수를 구하고 그 값을 분자와 분모에 나눈 값을 반환하여 문제를 해결했다.

 

feat.

문제를 해결하면서 기약분수와 최대공약수를 사용했는데

너무 오래전에 배웠던 개념이이라 다시 한 번 짚어보려고 한다.

 

기약분수란?

‘이미 약분이 끝난 분수’라는 의미로, 분자와 분모의 공약수가 1뿐이어서 더 이상 약분되지 않는 분수

최대 공약수란?

두 수가 서로 공통으로 가지고 있는 약수 중 가장 큰 수

 

그리고 변수 이름으로 사용한 영단어들도 정리해보았다.

- numer => Numerator (분자)

- denom => denominator (분모)

- gcd => Greatest Common Divisor (최대공약수)

 

그리고 나는 문제를 해결하면서 반복문을 통해 최대공약수를 구했는데,

다른 사람의 풀이를 보면서 유클리드 호제법이라는 알고리즘에 대해 알게 되었다.

해당 알고리즘은 최대공약수를 구하는 방법 중 하나로 시간복잡도를 줄여주는 알고리즘 같은데

다음 시간에 공부해보고 글을 남기려 한다.

(더 어려운 문제를 해결하기 위해선 꼭 공부해야할 것 같다)

4. 배열 두 배 만들기

Q. 정수 배열 numbers가 매개변수로 주어집니다. numbers의 각 원소에 두배한 원소를 가진 배열을 return하도록 solution 함수를 완성해주세요.

 

func solution(_ numbers:[Int]) -> [Int] {
    return numbers.map { $0 * 2 }
}

 

A. 입력값에 고차함수 map을 사용하여 각 원소에 2를 곱한 값을 배열로 반환하여 해결했다.


확실히 1일차에 비해 문제의 난이도가 약간이지만 상승한 느낌이 들었다.

주말에는 4문제를 수월하게 해결하고 글까지 작성할 수 있을 것 같은데

앞으로 평일에는 4문제를 해결하고 글까지 작성할 수 있을지에 대해 의문이지만

할 수 있는 데까지는 열심히 해보고자 한다.

내일도 화이팅!