트랙
/
Swift
Swift
/
연습 문제
/
프리랜서 요율
프리랜서 요율

프리랜서 요율

학습 연습 문제

소개

숫자

Swift는 숫자를 크게 두 가지로 나눠요. 정수와 실수예요.

  • 정수는 0, 1, -1, 42, -273처럼 소수 부분이 없는 수를 나타내요.
  • 실수는 0.0, 3.14, -1.36969e-10처럼 소수 부분이 있는 수를 나타내요.

숫자 리터럴에 밑줄을 넣으면 읽기 쉬워져요. 1_000_000은 1000000과 같아요. 실수 리터럴은 소수점 표기법이나 지수 표기법으로 쓸 수 있어요.

대부분의 경우 정수에는 Int를, 실수에는 Double을 사용해요:

let speed: Int = 42                           // Explicit Int
let pi: Double = 3.14                         // Explicit Double
let giga: Double = 1_000_000_000              // Double with readability underscores
let plancksConstant: Double = 6.62607015e-34  // Double in scientific notation

산술 연산자

Swift는 숫자 계산을 위한 표준 산술 연산자를 제공해요:

Operator Description Example
+ 덧셈 4 + 6의 결과는 10이에요
- 뺄셈 15 - 10의 결과는 5예요
* 곱셈 2 * 3의 결과는 6이에요
Caution

Swift는 타입에 안전해서, 산술 연산에서 서로 다른 숫자 타입을 섞을 수 없어요. Int와 Double을 바로 더하거나 곱할 수 없고, 먼저 한쪽 타입을 다른 쪽에 맞게 변환해야 해요.

나눗셈

/ 연산자는 나눗셈을 해요. 두 피연산자가 모두 정수이면, 정수 나눗셈은 소수 부분을 잘라내요:

5.0 / 2.0 // 2.5 (Double division)
5 / 2     // 2 (integer division truncates the remainder)

0이 아닌 실수를 0으로 나누면 inf 또는 -inf가 돼요. 0.0을 0.0으로 나누면 nan(Not a Number)이 돼요. 반대로 정수를 0으로 나누면 컴파일 시점이나 실행 시점에 오류가 발생해요:

print(5.0 / 0.0)  // Prints inf
print(-5.0 / 0.0) // Prints -inf
print(0.0 / 0.0)  // Prints nan

// The following line will not compile:
// print(5 / 0) // Error: Division by zero

나머지 연산자

나머지 연산자 (%)는 두 정수를 나눈 뒤 남는 나머지를 계산해요:

5 % 2  // 1
-5 % 2 // -1

// Dividing by zero produces an error:
// 5 % 0 // Error: Division by zero
Note

Swift에서 %는 모듈로 연산자가 아니라 진짜 나머지 연산자예요. 결과는 두 번째 피연산자의 부호와 상관없이 항상 첫 번째 피연산자(피제수)의 부호를 따라요:

5 % -2  // 1
-5 % 2  // -1

실수 반올림

rounded() 메서드로 실수를 반올림할 수 있어요. 기본적으로 rounded()는 가장 가까운 정수로 반올림해요. .up이나 .down처럼 특정 반올림 규칙을 지정할 수도 있어요:

let x = 3.14
let y = x.rounded()      // 3.0
let w = x.rounded(.down) // 3.0
let z = x.rounded(.up)   // 4.0

타입 추론

타입 표기 없이 숫자 상수나 변수를 선언하면, Swift가 그 타입을 추론해요:

  • 정수는 기본적으로 Int가 돼요.
  • 소수점이 있는 수는 기본적으로 Double이 돼요.
let x = 42         // Inferred as Int
let y = 42.0       // Inferred as Double
let z: Double = 42 // Explicitly typed as Double

타입 변환

서로 다른 타입의 값끼리 연산하려면, Double(_:)이나 Int(_:) 같은 타입 이니셜라이저로 한쪽 값을 변환해요:

let integerCount = 42
let floatingCount = Double(integerCount)
print(floatingCount) // Prints 42.0

let pi = 3.14
let integerPi = Int(pi)
print(integerPi) // Prints 3 (fractional part is truncated)

지침

이 연습 문제에서는 프리랜서가 고객과 특정 프로젝트의 가격에 대해 이야기할 수 있도록 돕는 코드를 작성해요. 고객을 위한 비용을 빠르게 계산하는 몇 가지 유틸리티 함수를 만들 거예요.

1. 시급으로 일당 계산하기

고객이 프리랜서에게 연락해 요금을 문의해요. 프리랜서는 하루에 8시간을 일한다고 설명해요. 그런데 프리랜서는 프로젝트의 시급만 알고 있어요. 시급이 주어졌을 때 일당을 추정할 수 있도록 도와줘요.

프리랜서의 시급을 담은 인자 hourlyRate를 받는 dailyRateFrom(hourlyRate:) 함수를 구현해요. 이 함수는 시급을 기준으로 일당을 반환해야 해요.

dailyRateFrom(hourlyRate: 60)
// Returns 480.0

반환되는 일당은 Double이어야 해요.

2. 시급과 할인이 주어졌을 때 월당 계산하기

때로는 고객이 프리랜서를 더 오랜 기간 고용하는 데 관심을 보여요. 프리랜서는 고객에게 할인을 제공할 의향이 있지만, 고객이 최소 한 달 이상 고용할 때만 그래요. 한 달에는 총 **근무일 22일**이 있어요. 시급과, 정가에 적용하려는 할인율이 주어졌을 때 월당을 계산하도록 도와줘요. 결과는 가장 가까운 정수로 반올림해요.

프리랜서의 시급을 담은 hourlyRate와, 프리랜서가 고객에게 제공하려는 할인을 담은 withDiscount 인자를 받는 monthlyRateFrom(hourlyRate:withDiscount:) 함수를 구현해요. 이 함수는 가장 가까운 정수로 반올림한 월당을 반환해야 해요.

monthlyRateFrom(hourlyRate: 77, withDiscount: 10.5)
// Returns 12129

3. 예산, 시급, 할인이 주어졌을 때 근무일 수 계산하기

어느 날, 프로젝트 관리자가 프리랜서에게 고정 예산이 있는 프로젝트를 제안해요. 고정 예산과 프리랜서의 시급이 주어졌을 때, 예산이 모두 소진될 때까지 며칠을 일하게 되는지 계산하도록 도와줘요. 이 경우 프리랜서는 고용 기간과 상관없이 항상 할인을 제공할 의향이 있다는 점을 고려해요. 결과는 반드시 가장 가까운 정수로 내림해야 해요.

다음 인자들을 받는 workdaysIn(budget:hourlyRate:withDiscount:) 함수를 구현해요:

  • budget은 프로젝트의 예산을 담고 있어요.
  • hourlyRate는 프리랜서의 시급을 담고 있어요.
  • withDiscount는 프리랜서가 고객에게 제공하려는 할인을 담고 있어요.

이 함수는 프리랜서가 프로젝트에서 일하게 될 근무일 수를 내림해서 반환해야 해요.

workdaysIn(budget: 20000, hourlyRate: 80, withDiscount: 11.0)
// Returns 35.0
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Swift Exercism

프리랜서 요율 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Swift 트랙을 개념 35개연습 문제 116개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.