[프로그래머스 | Swift | Lv.0] 문자 개수 세기

Juhee Kim·2025년 5월 12일

알고리즘 풀이

목록 보기
8/9

문제 링크


풀이: 이중 forEach문 순회

import Foundation

func solution(_ my_string:String) -> [Int] {
    var result = Array(repeating: 0, count: 52)
    var alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    alpha += alpha.lowercased
    
    my_string.forEach { str in
        alpha.forEach {
            if str == $0 {
                result[Array(alpha).firstIndex(of: $0)!] += 1
            }
        }
    }
    
    return result
}

설명

var result = Array(repeating: 0, count: 52)
  • 배열 선언과 동시에 초기화
  • 52 길이의 배열 생성, 초기값은 0
result[Array(alpha).firstIndex(of: $0)!] += 1
  • Array.firstIndex(of: Element): 반환값은 Int? 이므로 강제언래핑

다른 사람의 풀이

import Foundation

func solution(_ my_string:String) -> [Int] {
    var result = Array(repeating: 0, count: 52)
    
    my_string.forEach {
        result[Int($0.asciiValue!) - ($0.isUppercase ? 65 : 71)] += 1
    }
    
    return result
}

설명

asciiValue

let a: Character = "A"
if let ascii = a.asciiValue {
    print(ascii)  // 출력: 65
}
  • Character 타입에서 제공하는 속성으로, 문자의 ASCII 코드값을 반환한다.
  • UInt8?(옵셔널 UInt8) 타입이다. → Int와 사용 시 형변환 필요
  • ASCII 문자에 대해서만 값을 반환하고, ASCII가 아닌 문자(예: 이모지, 한글 등)에 대해서는 nil을 반환한다.

💡 주요 아스키 코드를 알아두자.

  • 대문자 A-Z: 65-90
  • 소문자 a-z: 97-122
  • 숫자 0-9: 48-57
  • 공백: 32

isUppercase

let a: Character = "A"
print(a.isUppercase)  // 출력: true
  • Character 타입에서 제공하며 문자의 대소문자 여부를 확인한다.

이중 forEach문 코드를 작성하면서도 이게 맞나, 긴가민가했는데 문자를 아스키코드로 바꿔주는 함수가 있다니! 갓위프트..👍 시간복잡도가 훨씬 축약됐다.

배열 선언과 동시에 초기화하는 코드도 많이 사용할 것 같으니 외워두기.

profile
개: 개롭지만 발: 발전하는중

0개의 댓글