[Swift] [37일차] 모음사전

·2025년 1월 13일
0

SwiftAlgorithm

목록 보기
40/105
post-thumbnail

programmers-모음사전

문제 설명

  1. A - AA - AAA - AAAA - AAAAA 이런 순서로 최대길이5
  2. 주어지는 문자열이 몇번째인지 판단
  3. A E I O U 5개만 등장

문제 접근

  1. 사진에 나온대로 이 순서로 더하기를 해주다보면 패턴이 보일 수 있었고, 이게 5자리다보니까 계속 썼을 때 일련의 패턴이 나왔다.
  2. AAAAU에서 U가 5를 의미
  3. AAAU 에서는 U가 25를 의미
  4. AAU에서는 U가 125를 의미하는것을 보고 이제 여기서는 5의 제곱이구나 싶었다. 나올 수 있는 모음이 5개라서 당연한거 같기도한데..
  5. 여튼 그래서 1+625+125+25+5 하면 AUUUU가 781번째라는 것을 알 수 있고 이게 다 자리 올림이 되면은 782 가 E가 됨을 알 수 있다.


문제풀이

그래서 사실 더 멋있게 풀려다가 시간이 많이 끌려서 일단 해결한 풀이를 설명해보자면..

var a: [Character: Int] = ["A": 1, "E": 2, "I": 3, "O": 4, "U": 5]

일단 사실상 모음5개가 해당 숫자로 치환되는거라 이렇게 딕셔너리를 세팅해주고 시작을 했다.

그리고 이게 계산을 하면 등자가 1부터 5의 제곱으로 늘어나는 구조라서 등차를 선언해줬다.

var 등차 = [1, 6, 31, 156, 781]

이게 특이하게도 "A"는 그냥 숫자에 구애받지 않는 1이기 때문에, idx랑 잘 조절하면서 현재 자리에,
각 자리마다의 E가 등차+1(A만큼)이기 때문에등차 * (현재알파벳(E)부터)
현재 알파벳 E 부터 계산해주기 위해서 a[chr]! -2 를 해줬다 이미 초항 계산한게 E라서, I면은 거기에 등차를 한번 곱한값이 나오게끔 유도한 것이다.

최종코드

import Foundation

var a: [Character: Int] = ["A": 1, "E": 2, "I": 3, "O": 4, "U": 5]

func solution(_ word: String) -> Int {
    var answer = 0
    var 등차 = [1, 6, 31, 156, 781]
    등차.reverse()

    for (idx, chr) in Array(word).enumerated() {
        if chr == "A" {
            answer += 1
        }
        else {
            var 자리값 = 등차[idx] + 1
            자리값 += 등차[idx] * (a[chr]! - 2)
            answer += 자리값
        }
    }
    return answer
}

채점 결과

정확성: 100.0
합계: 100.0 / 100.0


타인의 코드

import Foundation

func solution(_ word:String) -> Int {
    var answer = word.count
    var count = 0
    var arr = [781, 156, 31, 6, 1]
    var arr2 = ["A": 0, "E": 1, "I": 2, "O":3, "U":4]

    for ch in word{
        answer += arr2[String(ch)]!*arr[count]
        count += 1
    }
    return answer
}
  1. 1씩 더해줘야하니까 어처피 이걸 그냥 꾸준히 count+1을 해줬고
  2. 그러면서 딕셔너리 해당하는 값을 -1 로 지정해주면서 같은 코드인데도 훨씬 간결하게 풀린걸 볼 수 있었다.
profile
기억보단 기록을

0개의 댓글