문제 설명
A
-AA
-AAA
-AAAA
-AAAAA
이런 순서로 최대길이5- 주어지는 문자열이 몇번째인지 판단
- A E I O U 5개만 등장
문제 접근
- 사진에 나온대로 이 순서로 더하기를 해주다보면 패턴이 보일 수 있었고, 이게 5자리다보니까 계속 썼을 때 일련의 패턴이 나왔다.
- AAAAU에서 U가 5를 의미
- AAAU 에서는 U가 25를 의미
- AAU에서는 U가 125를 의미하는것을 보고 이제 여기서는 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씩 더해줘야하니까 어처피 이걸 그냥 꾸준히 count+1을 해줬고
- 그러면서 딕셔너리 해당하는 값을 -1 로 지정해주면서 같은 코드인데도 훨씬 간결하게 풀린걸 볼 수 있었다.