스파르타 코딩 클럽 - iOS 스타터 6기/알고리즘 코드카타

21. 스파르타 코딩 클럽 - 4월 14일 코딩테스트 연습 (코드카타)

seongpil Heo 2025. 4. 14. 11:01

❓ 오늘의 문제

1. 옷가게 할인받기

  • 머쓱이네 옷가게는 10만 원 이상 사면 5%, 30만 원 이상 사면 10%, 50만 원 이상 사면 20%를 할인해 줍니다.
    구매한 옷의 가격 price가 주어질 때, 지불해야 할 금액을 return 하도록 solution 함수를 완성해 보세요.

나의 정답 코드

import Foundation

func solution(_ price:Int) -> Int {
    guard price >= 10 && price <= 1000000 else { return 0 }
    if price >= 500000 {
        return price * 80 / 100
    } else if price >= 300000 {
        return price * 90 / 100
    } else if price >= 100000 {
        return price * 95 / 100
    } else {
        return price
    }
}

2. 저주의 숫자 3

  • 3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다.

  • 정수 n이 매개변수로 주어질 때, n을 3x 마을에서 사용하는 숫자로 바꿔 return 하도록 solution 함수를 완성해 주세요.

나의 정답 코드

import Foundation

func solution(_ n:Int) -> Int {
    guard n >= 1 && n <= 100 else { return 0 }
    var count: Int = 0
    var number: Int = 0
    
    while count < n {
        number += 1
        if number % 3 != 0 && !String(number).contains("3") {
            count += 1
        }
    }
    
    return number
}

3. 개미 군단

  • 개미 군단이 사냥을 나가려고 합니다. 개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다. 장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다. 예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만, 장군개미 네 마리와 병정개미 한 마리를 데리고 간다면 더 적은 병력으로 사냥할 수 있습니다. 사냥감의 체력 hp가 매개변수로 주어질 때, 사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return 하도록 solution 함수를 완성해 주세요.

나의 정답 코드

import Foundation

func solution(_ hp:Int) -> Int {
    var result: Int = 0
    var mok5 = hp / 5
    var mod5 = hp % 5
    result += mok5
    var mok3 = mod5 / 3
    var mod3 = mod5 % 3
    result += mok3
    var mok1 = mod3 / 1
    result += mok1
    return result
}

4. 369 게임

  • 머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. 머쓱이가 말해야하는 숫자 order가 매개변수로 주어질 때, 머쓱이가 쳐야 할 박수 횟수를 return 하도록 solution 함수를 완성해 보세요.

나의 정답 코드

import Foundation

func solution(_ order:Int) -> Int {
    guard order >= 1 && order <= 1000000 else { return 0 }
    var ArrayOrder = Array(String(order))
    var count = 0
    for i in ArrayOrder {
        if i == "3" || i == "6" || i == "9" {
            count += 1
        }
    }
    return count
}

 ✓ TIL

이번에는 블로그 글 작성이 조금 밀려서 그동안 4문제를 풀고 TIL을 작성해보려고 한다.

 

1번은 문제 옷가게 문제는 비교적 쉽게 풀었는데 조건문을 줄 때 큰 조건을 위로 올려야

조건식의 검증이 내가 의도한 대로 돌아간다는 것을 알았다.

 

2번은 문제를 풀 때 조금 어렵긴 했다.

while count < n {
        number += 1
        if number % 3 != 0 && !String(number).contains("3") {
            count += 1
        }
    }

로직은 조금 설명하면 주어진 매개변수 n보다 count가 작을 때까지 while 문을 반복하고

number를 1씩 증가시키고 number가 3으로 나누었을 때 나누어 지거나 contains를 사용해서 number에 3이 포함되면 

카운트를 1 증가시켜서 3의 배수와 3이 포함되면 그 숫자를 사용하지 않고 넘기는 로직이다.

 

3번은 일단 최소한의 병력을 구성하여야 하기 때문에 공격력이 큰 순서대로 먼저 나누었다.

var mok5 = hp / 5
var mod5 = hp % 5
result += mok5
var mok3 = mod5 / 3
var mod3 = mod5 % 3
result += mok3
var mok1 = mod3 / 1
result += mok1
return result

주어진 매개변수 hp를 5로 나누고, 몫은 result 변수에 저장하고, 남은 나머지 값을 변수에 저장한 뒤

그 나머지 변수를 다시 3으로 나누고, 몫을 result에 저장, 남은 나머지 값을 다시 변수에 저장한 뒤

마지막으로 나머지 변수를 1로 나누고 몫을 result에 저장하고 return 한다.

 

4번은 먼저 주어진 order 매개변수를 배열로 바꾸고

for i in ArrayOrder {
        if i == "3" || i == "6" || i == "9" {
            count += 1
        }

배열을 for문 돌려서 숫자 하나씩 접근하여

if문으로 그 숫자가 3과 같거나 6과 같거나 9와 같으면 count를 1 증가시켜서

최종적으로 for문을 다 돌고 나오면 count를 return 하도록 구현했다.


 😼 GitHub