💬 문제
https://school.programmers.co.kr/learn/courses/30/lessons/17684
💬 Idea
- 먼저 msg 문자열을 Array형태로 변환한 뒤 배열을 뒤집는다.
- 가장 첫번째 문자를 스택처럼 popLast하기 위해
- 현재 입력과 일치하는 가장 긴 문자열을 찾기 위해 msg의 마지막 원소가 있을 때까지 popLast()를 수행한다.
- popLast()한 값을 word 변수에 더해준다.
- 이 때 word + c(msg의 last값)가 사전에 있다면 또 다음 긴 문자를 찾기 위해 반복한다.
- 이 때 word + c(msg의 last값)가 사전에 없다면 해당 값을 사전에 등록하고 반복문을 멈춘다.
- 사전에 등록할 때 사전의 마지막 값을 + 1 하여 업데이트 해준다.
- 현재 입력과 일치하는 가장 긴 문자열은 word 변수와 일치하므로 ans 배열에 사전의 word 값을 append해준다.
- msg 배열이 빌 때까지 1-2 과정을 반복한다.
💬 풀이
func solution(msg:String)->[Int]{varmsg=Array(msg).reversed().map({String($0)})vardict:[String:Int]=["A":1,"B":2,"C":3,"D":4,"E":5,"F":6,"G":7,"H":8,"I":9,"J":10,"K":11,"L":12,"M":13,"N":14,"O":15,"P":16,"Q":17,"R":18,"S":19,"T":20,"U":21,"V":22,"W":23,"X":24,"Y":25,"Z":26]vardictLastVal=26varans:[Int]=[]while !msg.isEmpty {varword=""whilelet w = msg.popLast(){
word += w
iflet c = msg.last {ifdict[word + c]==nil{
dictLastVal +=1dict[word + c]= dictLastVal
break}}}
ans.append(dict[word]!)}return ans
}💬 더 나은 방법?
- 문제를 풀면서 사전에 이미 정의되어있는 1개의 단어들을 일일이 초기화해줬는데,
Unicode.Scalar를 통해 숫자를 이용해서 알파벳을 차례대로 표현할 수 있다는 걸 알게되었다.
- 대문자 알파벳 A를 Unicode.Scalar(65)로 표현할 수 있다.
- 이후 차례대로 26개의 알파벳을 표현한다.
vardict:[String:Int]=[:]foriin1...26{iflet scalar =Unicode.Scalar(64+ i){dict[scalar.description]= i
}}
// dict
// ["A": 1, "B": 2, "C": 3, "D": 4, "E": 5, "F": 6, "G": 7, "H": 8, "I": 9, "J": 10, "K": 11, "L": 12, "M": 13, "N": 14, "O": 15, "P": 16, "Q": 17, "R": 18, "S": 19, "T": 20, "U": 21, "V": 22, "W": 23, "X": 24, "Y": 25, "Z": 26]💬 알게된 것
✅ Unicode.Scalar
- 크기가 가변적인 String 문자열을 하나하나 개별적으로 접근하기 위한 방법.
- Unicode기반 21-bit 코드
- UTF-32랑 거의 동일하다.
- 하나 이상의 Unicode Scalar가 모여 Character를 이룬다.
- 숫자 표현에서 직접 유니코드 스칼라 값을 생성할 수 있다.
- Unicode.Scalar(65) // “A”
<참고>
[https://velog.io/@haze5959/Swift-Unicode-Scalar-그리고-문자열-count-시간-복잡도-관계](https://velog.io/@haze5959/Swift-Unicode-Scalar-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%AC%B8%EC%9E%90%EC%97%B4-count-%EC%8B%9C%EA%B0%84-%EB%B3%B5%EC%9E%A1%EB%8F%84-%EA%B4%80%EA%B3%84)
💬 문제https://school.programmers.co.kr/learn/courses/30/lessons/17684
💬 Idea💬 풀이💬 더 나은 방법?Unicode.Scalar를 통해 숫자를 이용해서 알파벳을 차례대로 표현할 수 있다는 걸 알게되었다.
💬 알게된 것✅ Unicode.Scalar
<참고>
[https://velog.io/@haze5959/Swift-Unicode-Scalar-그리고-문자열-count-시간-복잡도-관계](https://velog.io/@haze5959/Swift-Unicode-Scalar-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%AC%B8%EC%9E%90%EC%97%B4-count-%EC%8B%9C%EA%B0%84-%EB%B3%B5%EC%9E%A1%EB%8F%84-%EA%B4%80%EA%B3%84)