알고리즘

백준 10820번 문제 풀이

kimhyeji 2025. 4. 1. 17:15

문제

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)
}

개선된 점

  1. 문자 비교 로직
    • 개선 전
      • switch문을 통해 아스키코드로 비교
    • 개선 후
      • if..elseif문을 통해 내장변수로 true/false 확인
    • if..elseif문으로 조건을 확인할 경우 최악의 경우 모든 조건식을 다 거쳐야 할 수 있기 때문에 switch문을 통해 해당되는 케이스를 확인하고 바로 해당 코드 블록을 실행함으로써 실행속도 단축을 기대했습니다. 그러나 조건 판단을 거치는 것을 병목으로 보지 않으며, 문제의 조건 중 “한줄의 문자열 길이는 100을 넘지 않는다”는 전제조건으로 인해 체감상 큰 차이가 없다는 지피티의 답변을 받았습니다.
      Swift에서 switch문이 비교적 간단하다면 jump table 방식이 아닌 조건 순회 방식으로 해당되는 케이스의 코드 블럭을 실행하기 때문에 if-else문과 차이가 없다면 가독성이 더 좋은 방향으로 수정하는 것이 최적화라고 생각했습니다!
  2. 결과값 저장 타입
    • 개선 전
      • 배열을 통해 “소문자, 대문자, 숫자, 공백” 순서대로 저장(인덱스를 통해 구분한다고 생각함)
    • 개선 후
      • 각 결과값을 변수로 선언해서 저장
    • 배열이나 변수나 공간복잡도는 O(1)으로 동일하지만 가독성을 향상시켜 코드 표현력을 최적화했습니다.
반응형