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
키워드를 함수 앞에 붙이면, 프로퍼티 값을 수정할 수 있게 되어 에러가 발생하지 않게 된다.
이제 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 |