05.14 (수) iOS 사전 캠프

2025. 5. 14. 21:16·🖋️ TIL Journal
-->

TIL은 편한 말투로 작성됩니다~

 

📍 오늘의 학습 내용
- 프로그래머스(수열과 구간 쿼리 4) 문제 풀이
- mutating이란?


 

✅ [프로그래머스 문제 풀이]


오늘은 프로그래머스 - 수열과 구간 쿼리 4 문제를 풀었다.

 

 

❌ 시간 초과 실패

아래가 처음으로 작성한 코드이다. 보이는 것처럼 "시간초과"로 인해 실패했다.

혹시나 싶어서 아래처럼 코드를 변경해봤더니, 이번에는 성공했다!

매번 루프마다 배열 값에 접근하고 가독성도 별로라 생각이 들어 s, e, k 지역 변수를 만들었고, 연산 코드도 arr[i] += 1로 간결하게 작성했다.

 

혹시 모른다는 생각으로 제출해 봤는 데 성공했다.. 😶 시간 복잡도 자체는 동일하니까 당연히 안될 거라 생각했었는데.. (이게 되네..?)

 

 

💻 다른 사람의 코드 공부

아래 코드는 위 2개의 코드를 작성 후, 찾아본 코드 중 하나이다.

import Foundation

func solution(_ arr:[Int], _ queries:[[Int]]) -> [Int] {
    var arr = arr
    queries.forEach {
        let (s, e, k) = ($0[0], $0[1], $0[2])
        (s...e).forEach { if $0 % k == 0 { arr[$0] += 1 } }
    }
    return arr
}

 

보이는 대로 고차함수와 forEach문을 써서 작성한 코드이다. 보자마자 난 이렇게 작성하는 게 떠오르지 않았기에 이렇게 작성할 생각을 하는게 신기하다고 느꼈다.

 

가독성은 내가 작성한 게 더 좋은 것 같지만, 효율은 아래 코드가 더 좋을지도 모르겠다는 생각도 들었다.

 

요새 이렇게 다른 사람들이 작성한 코드들을 보면서 "이렇게도 작성할 수 있구나", "이런 메서드도 있구나" 라는 생각이 자주 든다.

남의 코드를 보며 공부하는게 왜 좋은지 직접 체감이 되어 공부 시간이 좀 더 들더라도 의미있게 느껴진다.

 

 

mutating 이란?


구조체는 값 타입이며, swift가 구조체 내부의 self를 불변(immutable)으로 취급하기 때문에, 기본적으로 구조체의 인스턴스는 메서드 내에서 수정이 불가능하다.

 

이때 mutating 메서드를 사용하면, 해당 메서드가 인스턴스를 변경할 수 있다는 것을 명시적으로 나타내는 역할을 하므로, 구조체 내부에서 프로퍼티를 수정할 수 있게 된다.

 

단, mutating 메서드를 사용해도 인스턴스를 let으로 선언하면 호출할 수 없으므로, var로 선언해야 한다.

 

추가로 클래스는 참조 타입이라 mutating이 필요가 없다.

 

 

예시 코드

struct CollegeStudent {
    let name: String
    var age: Int
    let studentId: Int

    init(name: String, age: Int, studentId: Int) {
        self.name = name
        self.age = age
        self.studentId = studentId
    }

    func changeAge() {
        age = 23 // 에러 발생
    }
}

위의 코드를 작성하면, 아래처럼 에러가 발생하는 것을 볼 수 있다.

 

에러!

이유는 앞서 말한 것처럼, 값 타입인 구조체 내부의 프로퍼티 값을 수정할 수 없기 때문이다.

 

아래와 같이 mutating 키워드를 함수 앞에 붙이면, 프로퍼티 값을 수정할 수 있게 되어 에러가 발생하지 않게 된다.

 

mutating 키워드 사용

 

 

이제 student.changeAge() 메서드를 호출할 경우 age의 값이 20에서 23으로 변경된 결과를 확인할 수 있다. 👍

테스트

 

결과 확인

 

 

 

🖋️ 오늘 학습을 통해 배운 점
1. 시간 복잡도가 같더라도, 실제 시행 시간은 코드 스타일에 따라 달라질 수 있다.
2. 다른 사람들의 코드를 보며 공부하는게 꽤 많은 공부가 된다는걸 느꼈다.
3. mutating 키워드를 통해 구조체 내부에서 프로퍼티를 수정하는 방법을 공부했다.

 

 

'🖋️ TIL Journal' 카테고리의 다른 글

05.19 (월) 튜터님의 피드백  (0) 2025.05.19
05.16(금) iOS 사전캠프  (0) 2025.05.16
05.13(화) iOS 사전 캠프  (0) 2025.05.13
05.12 (월) iOS 사전캠프  (0) 2025.05.12
05.08 (목) iOS 사전 캠프  (0) 2025.05.08
'🖋️ TIL Journal' 카테고리의 다른 글
  • 05.19 (월) 튜터님의 피드백
  • 05.16(금) iOS 사전캠프
  • 05.13(화) iOS 사전 캠프
  • 05.12 (월) iOS 사전캠프
MoriOS
MoriOS
기억하기 위해 기록하는 공간 🖋️
  • MoriOS
    MoriOS
    MoriOS
  • 전체
    오늘
    어제
    • 분류 전체보기 (37) N
      • 📌 Swift (10)
      • 📱 iOS (4)
      • 💡 Algorithm (1)
      • ❕Data structure (4)
      • 🪙 Python (0)
      • ⚙️ Git (2)
      • 🖋️ TIL Journal (13) N
      • 📝 Etc (3)
  • 블로그 메뉴

    • GitHub
  • 인기 글

  • 태그

    강한 참조
    weak
    weak vs unowned
    swift 수학
    swift 알고리즘 팁
    TiL
    터미널 워킹 디렉토리
    swift 최대 최소
    swift max
    swift 대소문자
    swift
    swift 아스키
    터미널 기본 경로
    joined()
    ios
    Split
    todo앱
    iterm 실행 폴더
    swift ismultiple
    낼배캠
    ios segue
    Components
    swift optional
    todo 앱
    iterm2 기본 경로
    후행클로저
    ios 데이터 저장
    Optional
    낼배캠 사전 캠프
    swift min
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
MoriOS
05.14 (수) iOS 사전 캠프
상단으로

티스토리툴바