치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다.
쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고,
서비스 치킨에도 쿠폰이 발급됩니다.
시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.
func solution(_ chicken:Int) -> Int {
var result = 0
var coupon = chicken
while coupon < 10 {
var serviceChicken = chicken / 10
result += serviceChicken
coupon = serviceChicken + (chicken % 10)
}
return result
}
while문이 실행이 안됨coupon < 10 이니까 안돌아갔다!!! func solution(_ chicken:Int) -> Int {
var result = 0
var coupon = chicken
while coupon >= 10 {
var serviceChicken = chicken / 10
result += serviceChicken
coupon = serviceChicken + (chicken % 10)
}
return result
}
print(solution(100)) // 11
print(solution(1081)) // 120
while문에서 매개변수 chicken 으로 연산하여 발생한 오류다!coupon 변수를 만들어 놓고 바보같이 매개변수 chicken 으로 연산을 했다.func solution(_ chicken:Int) -> Int {
var result = 0
var coupon = chicken
while coupon >= 10 {
var serviceChicken = coupon / 10
result += serviceChicken
coupon = serviceChicken + (coupon % 10)
}
return result
}
print(solution(100))
print(solution(1081))
chicken 으로 연산을 coupon 으로 연산하도록 변경
과연 지피티는 또 얼마나 코드를 줄일까...
func solution(_ chicken: Int) -> Int {
var (result, coupon) = (0, chicken)
while coupon >= 10 {
result += coupon / 10
coupon = (coupon / 10) + (coupon % 10)
}
return result
}
미치겠다 이걸 줄여...?😳
코드가 전체적으로 깔끔하고 이해하기 쉬워! 하지만 불필요한 var 선언을 줄이고, 반복문을 간결하게 만들 수 있어.
var serviceChicken을 없앰serviceChicken = coupon / 10은 한 번만 쓰이므로 변수 없이 바로 계산var (result, coupon) = (0, chicken)으로 두 변수 선언을 한 줄로 정리result += coupon / 10 → 즉시 서비스 치킨 개수를 누적coupon = (coupon / 10) + (coupon % 10) → 한 줄로 표현 🚀 이제 더 깔끔해졌어!
시간 복잡도는 여전히 O(log chicken) 으로 최적화된 상태야.
오늘도 많이 배웠습니다...

숫자를 띄울 라벨
| 속성 | 요구사항 |
|---|---|
| 숫자 라벨 | Int 형. 0 부터 시작 |
| textColor | white |
| font | boldSystem 폰트. size = 45 |
| textAlignment | center |
| width | 80 |
| constraint | superView 와 center 가 갖게 설정. |
감소, 증가 버튼
| 속성 | 요구사항 |
|---|---|
| backgroundColor | 감소 버튼은 red, 증가 버튼은 blue. |
| textColor | white |
| width | 80 |
| height | 30 |
| cornerRadius | 8 |
| constraint | centerY 는 모두 숫자 라벨과 같게 설정. |
| 감소 버튼은 라벨로부터 왼쪽으로 32 떨어지게 설정. | |
| 증가 버튼은 라벨로부터 오른쪽으로 32 떨어지게 설정. |
증가 버튼을 누르면 숫자가 +1 , 감소 버튼을 누르면 숫자가 -1 되어 보이도록 구현.
import UIKit
import SnapKit
class ViewController: UIViewController {
private var num: Int = 0
let countLabel = UILabel()
let decreaseButton = UIButton()
let increaseButton = UIButton()
override func viewDidLoad() {
super.viewDidLoad()
count()
}
private func count() {
countLabel.text = String(num)
//countLabel.text = "\(num)"
countLabel.textColor = .white
countLabel.font = .boldSystemFont(ofSize: 45)
countLabel.textAlignment = .center
decreaseButton.backgroundColor = .red
decreaseButton.setTitle("감소", for: .normal)
decreaseButton.setTitleColor(.white, for: .normal)
decreaseButton.layer.cornerRadius = 8
decreaseButton.addTarget(self, action: #selector(decreaseButtonTapped), for: .touchDown)
increaseButton.backgroundColor = .blue
increaseButton.setTitle("증가", for: .normal)
increaseButton.setTitleColor(.white, for: .normal)
increaseButton.layer.cornerRadius = 8
increaseButton.addTarget(self, action: #selector(increaseButtonTapped), for: .touchDown)
[countLabel, decreaseButton, increaseButton]
.forEach { view.addSubview($0) }
countLabel.snp.makeConstraints {
$0.width.equalTo(80)
$0.center.equalToSuperview()
}
decreaseButton.snp.makeConstraints {
$0.width.equalTo(80)
$0.height.equalTo(30)
$0.centerY.equalTo(countLabel.snp.centerY)
$0.trailing.equalTo(countLabel.snp.leading).offset(-32)
}
increaseButton.snp.makeConstraints {
$0.width.equalTo(80)
$0.height.equalTo(30)
$0.centerY.equalTo(countLabel.snp.centerY)
$0.leading.equalTo(countLabel.snp.trailing).offset(32)
}
}
@objc
private func increaseButtonTapped() {
self.num += 1
countLabel.text = String(num)
}
@objc
private func decreaseButtonTapped() {
self.num -= 1
countLabel.text = String(num)
}
}

import UIKit
import SnapKit
class ViewController: UIViewController {
private var num: Int = 0
let countLabel = UILabel()
let decreaseButton = UIButton()
let increaseButton = UIButton()
let initialButton = UIButton()
override func viewDidLoad() {
super.viewDidLoad()
count()
}
private func count() {
countLabel.text = String(num)
//countLabel.text = "\(num)"
countLabel.textColor = .white
countLabel.font = .boldSystemFont(ofSize: 45)
countLabel.textAlignment = .center
decreaseButton.backgroundColor = .red
decreaseButton.setTitle("감소", for: .normal)
decreaseButton.setTitleColor(.white, for: .normal)
decreaseButton.layer.cornerRadius = 8
decreaseButton.addTarget(self, action: #selector(decreaseButtonTapped), for: .touchDown)
increaseButton.backgroundColor = .blue
increaseButton.setTitle("증가", for: .normal)
increaseButton.setTitleColor(.white, for: .normal)
increaseButton.layer.cornerRadius = 8
increaseButton.addTarget(self, action: #selector(increaseButtonTapped), for: .touchDown)
initialButton.backgroundColor = .gray
initialButton.setTitle("초기화", for: .normal)
initialButton.setTitleColor(.white, for: .normal)
initialButton.layer.cornerRadius = 8
initialButton.addTarget(self, action: #selector(initialButtonTapped), for: .touchDown)
[countLabel, decreaseButton, increaseButton, initialButton]
.forEach { view.addSubview($0) }
countLabel.snp.makeConstraints {
$0.width.equalTo(80)
$0.center.equalToSuperview()
}
decreaseButton.snp.makeConstraints {
$0.width.equalTo(80)
$0.height.equalTo(30)
$0.centerY.equalTo(countLabel.snp.centerY)
$0.trailing.equalTo(countLabel.snp.leading).offset(-32)
}
increaseButton.snp.makeConstraints {
$0.width.equalTo(80)
$0.height.equalTo(30)
$0.centerY.equalTo(countLabel.snp.centerY)
$0.leading.equalTo(countLabel.snp.trailing).offset(32)
}
initialButton.snp.makeConstraints {
$0.width.equalTo(80)
$0.height.equalTo(30)
$0.centerX.equalTo(countLabel.snp.centerX)
$0.top.equalTo(countLabel.snp.bottom).offset(100)
}
}
@objc
private func increaseButtonTapped() {
self.num += 1
countLabel.text = String(num)
}
@objc
private func decreaseButtonTapped() {
self.num -= 1
countLabel.text = String(num)
}
@objc
private func initialButtonTapped() {
self.num = 0
countLabel.text = String(num)
}
}
addTarget 을 사용하여 클릭 이벤트를 처리하는 것이 낯설었다.SnapKit을 사용하여 오토레이아웃 설정이 익숙해져서 자연스럽게 배치할 수 있었다.offset과 inset은 Superview() 와의 제약이 아니고, 뷰끼리의 연결하는 제약은 offset과 inset`은 같은 동작을 하게 되는 것을 알게되었다.