본문 바로가기

Develop/Coding Test

코딩테스트 입문 (feat. Day 11 수학, 반복문)

11일차 스탬프

1.  주사위의 개수

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

func solution(_ box:[Int], _ n:Int) -> Int {
    return (box[0] / n) * (box[1] / n) * (box[2] / n)
}

 
A. 상자의 가로, 세로, 높이를 전달 받은 n으로 나눴을 때의 몫을 모두 곱한 값을 반환하여 해결했다.

2.  합성수 찾기

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

func solution(_ n:Int) -> Int {
    var result: Int = 0
    var cnt: Int = 1
    if n == 1 { 
        return 0 
    }
    for i in 2...n {
        (1...(i / 2)).map { 
            if i % $0 == 0 {
                cnt += 1
            }
        }
        if cnt > 2 {
            result += 1
        }
        cnt = 1
    }
    return result
}

 
A. for문으로 2부터 전달 받은 n까지 순회하는 반복문 내에서
고차함수 map을 활용해 1 부터 i / 2 까지 순회하면서 % 연산자를 이용해 약수일 때, cnt의 값을 1씩 더해주었고
cnt의 값이 2보다 클 때 합성수라 판단하여 result의 값을 1씩 더해주었다.
그리고 반복문을 마친 후, result를 반환하여 해결했다.
 
feat.

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

 
다른 풀이를 참고했을 때,
내가 해결한 풀이에서는 이중 반복문으로 코드를 길게 작성해야 했는데,
위 코드는 고차함수 filter를 두 번 활용해 코드를 간결하게 작성한 것을 보고 감탄했다.

3. 최댓값 만들기(1)

Q. 정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

func solution(_ numbers:[Int]) -> Int {
    let sortedArray = numbers.sorted(by: >)
    return sortedArray[0] * sortedArray[1]
}

 
A. 먼저 전달받은 numbers를 sorted(by:)를 활용해 내림차순으로 정렬한 후,
정렬된 배열의 첫 번째 원소(제일 큰 값)와 두 번째 원소(두 번째로 큰 값)를 곱한 값을 반환하여 해결했다.

4. 팩토리얼

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

func solution(_ n:Int) -> Int {
    var value: Int = 1
    var i: Int = 1
    while value <= n {
        i += 1
        value *= i
    }
    return i - 1
}

 
A. while문을 활용해 value가 전달 받은 n보다 작거나 같을 때까지 반복하는 반복문 내에서
i의 값을 1씩 더해주면서 value에 계속 곱해주었다.
그 후, 반복문이 끝나면 value가 n보다 커져서 반복문이 종료된 것이기 때문에
i - 1을 반환하여 해결하였다.


오늘은 문제가 크게 어렵지 않았던 것 같다.
대신 1번을 풀 때, 인터넷 속도가 느려서 그런지 맞는 답안인데도 불구하고 런타임 에러가 났었는데
띄어쓰기 하나 추가하고 다시 채점하니 통과했다.
내 코드에 확신이 들었을 때, 이런 상황도 항상 염두해두면
문제 풀이를 진행할 때 시간 낭비를 줄일 수 있을 것 같다ㅎㅎ
내일도 화이팅!