Computer Science/Algorithm

Swift로 코드 최적화하기

kyxxn 2024. 5. 25. 15:27
728x90

백준/프로그래머스 풀다보면서 얻은 Swift 꿀팁 정리

(다른 언어도 포함일 수도 ㅇㅇ)

 

1. 입력 받을 때 map { Int($0)! } 보다는 map { Int(String($0))! }이 더 빠르다.

let input = readLine()!.split(separator: " ").map { Int($0)! }
vs
let input = readLine()!.split(separator: " ").map { Int(String(($0))! }

2. 함수 단위로 코드를 실행하면 컴파일러 최적화 측면에서 더 효율적이다.

func solve() -> Int {
    var N = Int(readLine()!)!
    var crane = readLine()!.split(separator: " ").map { Int(String($0))! }.sorted(by: >)
    var M = Int(readLine()!)!
    var box = readLine()!.split(separator: " ").map { Int(String($0))! }.sorted(by: >)
    var answer = 0

    if box[0] > crane[0] {
        return -1
    }

    while !box.isEmpty {
        answer += 1
        for i in 0..<crane.count {
            for j in 0..<box.count {
                if crane[i] >= box[j] {
                    box.remove(at: j)
                    break
                }
            }
        }
    }
    return answer
}

print(solve())

 

위 코드를 함수로 감싸지 않고 제출하면 시간초과 뜨는데,

위처럼 함수로 감싸면 통과됨

-> G선생 피셜 (내일 운체 교수님께 여쭤보겠다)

함수로 감싸주었을 때 시간 초과가 해결된 것은 두 가지 가능성이 있습니다:

	1.	코드의 초기화 부분과 실행 부분이 명확히 구분됨: 함수로 감싸면 변수의 스코프가 명확해지고,
    	실행 환경이 초기화되어 재실행시 이전 실행의 영향을 받지 않게 됩니다. 
        이는 특히 재귀 호출이나 여러 테스트 케이스를 처리할 때 중요할 수 있습니다.
	2.	컴파일러 최적화
    	Swift 컴파일러는 함수 내부의 로컬 변수에 대해 더 효율적인 메모리 관리와 최적화를 수행할 수 있습니다.
        함수 밖에서 실행될 때와 함수 내에서 실행될 때 성능 차이가 날 수 있는데,
        이는 컴파일러가 함수의 컨텍스트를 활용해 더 나은 최적화를 수행할 수 있기 때문입니다.

따라서, 함수로 감싸는 것이 직접적인 시간 효율성을 향상시키는 것은 아니지만,
실행 환경의 초기화 및 컴파일러 최적화에서 이점을 얻을 수 있습니다.

 

 

 

참고 링크

https://noguen.tistory.com/41

 

백준 1092번 배 - SWIFT

문제 지민이는 항구에서 일한다. 그리고 화물을 배에 실어야 한다. 모든 화물은 박스에 안에 넣어져 있다. 항구에는 크레인이 N대 있고, 1분에 박스를 하나씩 배에 실을 수 있다. 모든 크레인은

noguen.com