[내일배움캠프 19일차] 알고리즘, 앱 개발 입문 강의3

NH·2025년 3월 27일

내일배움캠프

목록 보기
19/62
post-thumbnail

🏆 1일 1알고리즘

🍗 치킨 쿠폰

  • 프로그래머스 알고리즘 모음 제거 👉 링크 이동

🔹 문제 설명

치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다.
쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고,
서비스 치킨에도 쿠폰이 발급됩니다.
시켜먹은 치킨의 수 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
  • 결과: 원하는 결과가 안나옴
    • 1081을 넣으면 119 가 나옴....🤪

🔹 오류 코드 분석

  • 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 선언을 줄이고, 반복문을 간결하게 만들 수 있어.

🔹 개선 포인트

  1. var serviceChicken을 없앰
    • serviceChicken = coupon / 10은 한 번만 쓰이므로 변수 없이 바로 계산
  2. 튜플을 사용하여 가독성 향상
    • var (result, coupon) = (0, chicken)으로 두 변수 선언을 한 줄로 정리
  3. 반복문 내부를 간결하게 정리
    • result += coupon / 10 → 즉시 서비스 치킨 개수를 누적
    • coupon = (coupon / 10) + (coupon % 10) → 한 줄로 표현

🚀 이제 더 깔끔해졌어!
시간 복잡도는 여전히 O(log chicken) 으로 최적화된 상태야.

오늘도 많이 배웠습니다...


🧐 앱 개발 입문 강의

📱 코드베이스로 카운터 앱 만들기

🔹 실습 1: 카운터 앱 만들기

앱의 요구사항은 다음과 같습니다.

  1. 숫자를 띄울 라벨

    속성요구사항
    숫자 라벨Int 형. 0 부터 시작
    textColorwhite
    fontboldSystem 폰트. size = 45
    textAlignmentcenter
    width80
    constraintsuperView 와 center 가 갖게 설정.
  2. 감소, 증가 버튼

    속성요구사항
    backgroundColor감소 버튼은 red, 증가 버튼은 blue.
    textColorwhite
    width80
    height30
    cornerRadius8
    constraintcenterY 는 모두 숫자 라벨과 같게 설정.
    감소 버튼은 라벨로부터 왼쪽으로 32 떨어지게 설정.
    증가 버튼은 라벨로부터 오른쪽으로 32 떨어지게 설정.
  3. 증가 버튼을 누르면 숫자가 +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)
    }
}

결과 화면


🔹 실습 2: 초기화 버튼 구현

실습 코드

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을 사용하여 오토레이아웃 설정이 익숙해져서 자연스럽게 배치할 수 있었다.
  • offsetinsetSuperview() 와의 제약이 아니고, 뷰끼리의 연결하는 제약은 offsetinset`은 같은 동작을 하게 되는 것을 알게되었다.
profile
iOS 개발 블로그

0개의 댓글