250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 1 2 3 더하기 풀이
- 백준 2xn 타일링
- swift 2xn 타일링 풀이
- swift 2xn 타일링
- 연속된 부분 수열의 합 swift
- iOS Charts
- swift codility
- swift
- swift 9095 풀이
- MVVM
- swift 연속된 부분 수열의 합
- 백준 2xn 타일링 풀이
- swift 프로그래머스
- 연속된 부분 수열의 합 투포인터
- swift ac 풀이
- swift 2xn 타일링 백준
- ac 투포인터
- swift 알고리즘
- ac swift 풀이
- swift gRPC
- swift 백준 9095
- swift dfs
- ios
- ac 구현 풀이
- swift ac
- rxswift
- 123 더하기 풀이
- swift algorithm
- swift 연속된 부분 수열의 합 풀이
- swift ac 문제풀이
Archives
- Today
- Total
boraBong
[Swift] [3차] 압축 문제 풀이 [Programmers - Level2 (2018 KAKAO BLIND RECRUITMENT)] 본문
iOS/Algorithm
[Swift] [3차] 압축 문제 풀이 [Programmers - Level2 (2018 KAKAO BLIND RECRUITMENT)]
보라봉_ 2023. 3. 30. 20:40728x90
💬 문제
https://school.programmers.co.kr/learn/courses/30/lessons/17684
💬 Idea
- 먼저 msg 문자열을 Array형태로 변환한 뒤 배열을 뒤집는다.
- 가장 첫번째 문자를 popLast()하기 위해 (배열을 뒤집지 않고 removeFirst()를 수행하게 되면 효율성이 아주 떨어지기 때문이다)
1. 현재 입력과 일치하는 가장 긴 문자열을 찾기 위해 msg의 마지막 원소가 있을 때까지 popLast()를 수행한다.
-> popLast()한 값을 word 변수에 더해준다.
✅ 이 때 word + c(msg의 last값)가 사전에 있다면 또 다음 긴 문자를 찾기 위해 반복한다.
✅ 이 때 word + c(msg의 last값)가 사전에 없다면 해당 값을 사전에 등록하고 반복문을 멈춘다.
-> 사전에 등록할 때 사전의 마지막 값을 + 1 하여 업데이트 해준다.
2. 현재 입력과 일치하는 가장 긴 문자열은 word 변수와 일치하므로 ans 배열에 사전의 word 값을 append해준다.
3. msg 배열이 빌 때까지 1,2 과정을 반복한다.
💬 풀이
func solution(msg: String) -> [Int] {
var msg = Array(msg).reversed().map({ String($0) })
var dict: [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]
var dictLastVal = 26
var ans: [Int] = []
while !msg.isEmpty {
var word = ""
while let w = msg.popLast() {
word += w
if let c = msg.last {
if dict[word + c] == nil {
dictLastVal += 1
dict[word + c] = dictLastVal
break
}
}
}
ans.append(dict[word]!)
}
return ans
}
💬 더 나은 방법?
- 문제를 풀면서 사전에 이미 정의되어있는 1개의 단어들을 일일이 초기화해줬는데,
Unicode.Scalar를 통해 숫자를 이용해서 알파벳을 차례대로 표현할 수 있다는 걸 알게되었다.- 대문자 알파벳 A를 Unicode.Scalar(65)로 표현할 수 있다.
- 이후 차례대로 26개의 알파벳을 표현한다.
var dict: [String: Int] = [:]
for i in 1...26 {
if let 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-시간-복잡도-관계
반응형
'iOS > Algorithm' 카테고리의 다른 글
[Swift] 7576번: 토마토 문제 풀이 [BOJ - Gold5] (0) | 2023.04.02 |
---|---|
[Swift] 2178번: 미로 탐색 문제 풀이 [BOJ - Silver1] (2) | 2023.04.01 |
[Swift] MissingInteger 문제 풀이 [Codility - Lesson 4. Counting Elements] (0) | 2023.03.30 |
[Swift] StrSymmetryPoint 문제 풀이 [Codility - Exercise 4. Algorithmic Skills] (0) | 2023.03.30 |
[Swift] LongestPassword 문제 풀이 [Codility - Exercise 1. 2015 Contest] (0) | 2023.03.30 |
Comments