문제
https://www.acmicpc.net/problem/10820
제출 코드
while let input = readLine() {
var result: [Int] = Array(repeating: 0, count: 4)
for char in input {
switch char.asciiValue! {
case 32: // 공백
result[3] += 1
case 48...57: // 숫자
result[2] += 1
case 65...90: // 대문자
result[1] += 1
case 97...122: // 소문자
result[0] += 1
default:
break
}
}
print(result[0], result[1], result[2], result[3])
}
개선 코드
while let input = readLine() {
var isLowercase: Int = 0
var isUpperCase: Int = 0
var isNumber: Int = 0
var isWhiteSpace: Int = 0
for char in input {
if char.isLowercase {
isLowercase += 1
} else if char.isUppercase {
isUpperCase += 1
} else if char.isNumber {
isNumber += 1
} else if char.isWhitespace {
isWhiteSpace += 1
}
}
print(isLowercase, isUpperCase, isNumber, isWhiteSpace)
}
개선된 점
- 문자 비교 로직
- 개선 전
- switch문을 통해 아스키코드로 비교
- 개선 후
- if..elseif문을 통해 내장변수로 true/false 확인
- if..elseif문으로 조건을 확인할 경우 최악의 경우 모든 조건식을 다 거쳐야 할 수 있기 때문에 switch문을 통해 해당되는 케이스를 확인하고 바로 해당 코드 블록을 실행함으로써 실행속도 단축을 기대했습니다. 그러나 조건 판단을 거치는 것을 병목으로 보지 않으며, 문제의 조건 중 “한줄의 문자열 길이는 100을 넘지 않는다”는 전제조건으로 인해 체감상 큰 차이가 없다는 지피티의 답변을 받았습니다.
Swift에서 switch문이 비교적 간단하다면 jump table 방식이 아닌 조건 순회 방식으로 해당되는 케이스의 코드 블럭을 실행하기 때문에 if-else문과 차이가 없다면 가독성이 더 좋은 방향으로 수정하는 것이 최적화라고 생각했습니다!
- 개선 전
- 결과값 저장 타입
- 개선 전
- 배열을 통해 “소문자, 대문자, 숫자, 공백” 순서대로 저장(인덱스를 통해 구분한다고 생각함)
- 개선 후
- 각 결과값을 변수로 선언해서 저장
- 배열이나 변수나 공간복잡도는 O(1)으로 동일하지만 가독성을 향상시켜 코드 표현력을 최적화했습니다.
- 개선 전
반응형
'알고리즘' 카테고리의 다른 글
| leetcode 225. Implement Stack using Queues 문제 풀이 (0) | 2025.04.04 |
|---|---|
| leetcode 232. Implement Queue using Stacks 문제 풀이 (0) | 2025.04.03 |
| 백준 31458번 문제 풀이 (0) | 2025.04.02 |
| 백준 10988번 문제 풀이 (0) | 2025.04.01 |
| 백준 1032번 풀이 (0) | 2025.03.31 |