[ํ๋ก๊ทธ๋๋จธ์ค] (Swift) Kakao - [3์ฐจ]์์ถ
๐ TIL (ํด๋น ๋ฌธ์ ๋ฅผ ํ๋ฉฐ ๋ฐฐ์ด์ )
โค๏ธ๐ฅ swift ๋์ ๋๋ฆฌ์์ ํน์ ๋ฌธ์๋ฅผ ์ฐพ๊ธฐ (๋์ ๋๋ฆฌ contain ์ฌ์ฉ๋ฒ)
๋์ ๋๋ฆฌ์์ ํน์ ๋ฌธ์๋ฅผ ๊ฐ์ง key ๊ฐ์ ๊ฒ์ํ๊ธฐ ์ํด์๋ contain์ ์ฌ์ฉํ๋ฉด ๋๋ค.ํ์ง๋ง, ๋์ ๋๋ฆฌ ์๋ฃํ์์๋ 'ํด๋ก์ '๋ฅผ ํตํด์ ์์๋ณผ ์ ์๋ค.
func wcCheckInDict(_ w: String, _ c: String, dict: [String:Int]) -> Bool {
let wc = w+c
let isinDict = dict.contains { $0.key == wc }
return isinDict
}
์ ์ฝ๋ ์ฒ๋ผ, dict์์ contain์ ์ด์ฉํ๊ธฐ ์ํด์๋ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ๊ณ , key๋ value๋๋ฅผ ๊ฒ์ํ๋ฉด ๋๋ค.๋ง์ฐฌ๊ฐ์ง๋ก Bool๊ฐ์ ๋ฆฌํดํ๋ค!
๐ ๋ฌธ์ ๋งํฌ
https://school.programmers.co.kr/learn/courses/30/lessons/17684
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๐ ๋์ ํ์ด
์คํจํ ๋ฐฉ๋ฒ
- w์ c๋ฅผ ์๋ถํฐ ์ ํ
- input์์ w๋ฅผ ์์ ์ค (input๋ฐฐ์ด์๋ ํ์ฌ ์์ถํ๋ ค๋ ๋ฌธ์๋ ์๊ณ , ๋ค์ ๋ฌธ์๋ถํฐ ๋ด๊ฒจ์๊ฒ ๋๋ค.)
- w+c ๊ฐ dict์ ์๋์ง ํ์ธ
- ์๋ค๋ฉด w์ value๋ฅผ answer์ ์ถ๊ฐ / w+c๋ฅผ dict์ ์ถ๊ฐ
- ์๋ค๋ฉด ๋ค์ ๋ฐ๋ณตํด์ w+c+c+c,,,,๊ฐ dict๋ด๋ถ์ ์์ ์ ์์ผ๋๊น ๋ฐ๋ณต
- ๊ทธ๋๋ ์๋ค๋ฉด w๋ฅผ answer์ ์ถ๊ฐ / w+c๋ฅผ dict์ ์ถ๊ฐ
์ด๋ ๊ฒ ํ๋๊น, input์ ๊ธธ์ด๊ฐ 0์ผ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๊ฒ ๋๊ณ , ์ด๋ด ๊ฒฝ์ฐ์ ์์์ด ์์ธ์ฒ๋ฆฌ๋ก if ๋ฌธ์ ์ ๋ ฅํด์ผํ๋ค. ์๋๋ฉด ๋๋ removeFirst ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ๊ฒ์ํด์ input ๋ด๋ถ์ ์๋ value๋ค์ ๋บด๋ด๊ณ ์์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๊ณผ์ ์์ ์๊ณ ๋ฆฌ์ฆ์ด ์์ ํ... ๊ผฌ์ด๊ฒ ๋๋๋ฐ.....
(์ ๋ต ์ฝ๋์ ํ์ด ๋ฐฉ๋ฒ์ ๋ฐ์ ์ ์ด๋จ์ต๋๋ค)
๐ ์ฒซ๋ฒ์งธ ํ์ด (์คํจ) - ์ฝ๋ ์ ์ด๋
์๋ ์ ์ ๊ธ์์ ์คํจํ ์ฝ๋๋ฅผ ์ดํด๋ณผ ์ ์๋ค.
์คํจ ์ฝ๋
import Foundation
func solution(_ msg:String) -> [Int] {
// 1. dictionary ์์ฑ
var 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]
var valueNum = 27
var input = msg.map { String($0) }
var w = input[0]
var c = input[1]
input.removeFirst()
var answer = [Int]()
while input.count >= 0 {
// w+c๊ฐ dict์ ์์ผ๋ฉด wc ๊ฐฑ์ ํด์ฃผ๊ณ , ๋ค์์ผ๋ก ๋๊ฒจ์ผํจ
let isinDict = wcCheckInDict(w, c, dict: dict)
if isinDict {
w = w+c
input.removeFirst()
if input.count == 0 {
continue
}
c = input[0]
continue
} else if input.count == 0 { // ๋ง์ง๋ง ์ธ๊ฒฝ์ฐ
answer.append(dict[w]!)
break
} else { // ์์ผ๋ฉด w+c๋ฅผ dict์ ๋ฃ์ด์ค ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ w์ c๋ฅผ ๋ฐ๊ฟ์ค์ผํจ
dict[w+c] = valueNum
valueNum += 1
answer.append(dict[w]!)
w = input.removeFirst()
if input.count == 0 {
continue
}
c = input[0]
}
}
return answer
}
func wcCheckInDict(_ w: String, _ c: String, dict: [String:Int]) -> Bool {
let wc = w+c
let isinDict = dict.contains { $0.key == wc }
return isinDict
}
์ด๋ ๊ฒ ์ด ๋ค์ฏ ๊ฐ์ case ์์ ์คํจ๋ฅผ ํ๋ค. "signal: illegal instruction (core dumped)"๊ฐ ๋ญ๊น?
์ด๊ฑด ์ธํฐ๋ท ์์นญ ๊ฒฐ๊ณผ, 'index out of range' ์๋ฌ์ด๊ฑฐ๋ ๋์ค์ nil ๊ฐ์ด ์์ฑ๋์๋ ์๊ธฐ๋ ์๋ฌ๋ผ๊ณ ํ๋ค.
์ด๋ค ๋ถ๋ถ์์ ์๋ฌ๊ฐ ์๊ฒผ๋์ง ๊ณ ๋ฏผํด๋ด์ผํ๋ค.
๐ ๋๋ฒ์งธ ํ์ด (ํ๋ฆผ) - ์ฝ๋ ์ ์ด๋
์คํจํ ์ฝ๋
import Foundation
func solution(_ msg:String) -> [Int] {
// 1. dictionary ์์ฑ
var 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]
var valueNum = 27
var input = msg.map { String($0) }
var w = input[0]
var c = input[1]
input.removeFirst()
var answer = [Int]()
while input.count >= 0 {
// w+c๊ฐ dict์ ์์ผ๋ฉด wc ๊ฐฑ์ ํด์ฃผ๊ณ , ๋ค์์ผ๋ก ๋๊ฒจ์ผํจ
let isinDict = wcCheckInDict(w, c, dict: dict)
if isinDict {
w = w+c
input.removeFirst()
if input.count == 0 {
continue
}
c = input[0]
continue
} else if input.count == 0 { // ๋ง์ง๋ง ์ธ๊ฒฝ์ฐ
answer.append(dict[w]!)
break
} else { // ์์ผ๋ฉด w+c๋ฅผ dict์ ๋ฃ์ด์ค ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ w์ c๋ฅผ ๋ฐ๊ฟ์ค์ผํจ
dict[w+c] = valueNum
valueNum += 1
answer.append(dict[w]!)
w = input.removeFirst()
if input.count == 0 {
c = "9999"
continue
}
c = input[0]
}
}
return answer
}
func wcCheckInDict(_ w: String, _ c: String, dict: [String:Int]) -> Bool {
let wc = w+c
let isinDict = dict.contains { $0.key == wc }
return isinDict
}
16๋ฒ ํ๋๋ฅผ ๋ง์๋ค.. ์ ... ํ๊ฐ๋ผ๋ ์ด๋์ผ
์์ธ์ ์๋์ ๊ฐ์๋ค.
else { // ์์ผ๋ฉด w+c๋ฅผ dict์ ๋ฃ์ด์ค ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ w์ c๋ฅผ ๋ฐ๊ฟ์ค์ผํจ
dict[w+c] = valueNum
valueNum += 1
answer.append(dict[w]!)
w = input.removeFirst()
if input.count == 0 {
c = "9999"
continue
}
c = input[0]
}
ํ๋ฆฐ์ฝ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฌ๊ธฐ์ c = "9999" ๋ง ์ถ๊ฐํด์ฃผ์๋๋ฐ, ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค. ๋ง์ฝ w์๋ค๊ฐ ๋ง์ง๋ง ๊ฐ์ ๋ฐฐ์ ํ๊ณ , ๋จ์ input์ด ์์ ๊ฒฝ์ฐ, c๋ฅผ ๊ธฐ์กด์ ๊ฐ์ผ๋ก ๊ทธ๋ฅ ๋๊ฒ ๋๋ค๋ฉด, ์ฐ์ฐ์ ์ผ์น๋ก ๋งจ ์์์ ๊ฒํ ํ ๋ w+c๊ฐ์ด ๋! dict์ ์กด์ฌํ๋ค๊ณ ํ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋๊น
- input = ["A"]
- w = "A" ๋ก ๋ฐฐ์ ๋ฐ์ (removefirst๋ฅผ ํตํด์)
- ๊ธฐ์กด์ c ๋ ๋ง์ฝ Z์์
- ๊ทธ๋ผ, ๋ค์ while๋ฌธ ํต๊ณผ๋ฅผ ์ํด ๋งจ ์๋ก ์ฌ๋ผ๊ฐ์ ๊ฒฝ์ฐ, w+c = "AZ"๊ฐ ๋๊ณ , A์ ๋ํ ๊ฐ์ ์ถ๋ ฅํด์ผํ๋๋ฐ AZ์ ๋ํ ๊ฐ์ ์ถ๋ ฅํ๊ฒ ๋๋ ์ค๋ฅ๊ฐ ์๊ธฐ๊ฒ ๋จ. ๊ทธ๋์ ์์ ์ธ์์ด ๋ถ๊ฐ๋ฅํ ์ซ์ ๋ฌธ์์ด๋ก ๋ฐ๊ฟ์ฃผ์๋ค.
๐ ์ธ๋ฒ์งธ ํ์ด (์ ๋ต์ฝ๋)
https://github.com/deslog/Algorithm/tree/main/Algorithm/Programmers
GitHub - deslog/Algorithm: โจ ๋ฐฑ์ค, ํ๋ก๊ทธ๋๋จธ์ค Swift ๋ฌธ์ ํ์ด โจ
โจ ๋ฐฑ์ค, ํ๋ก๊ทธ๋๋จธ์ค Swift ๋ฌธ์ ํ์ด โจ. Contribute to deslog/Algorithm development by creating an account on GitHub.
github.com
์,,, ์์์ ์ ์ค์ํ๋ ์ง์ง ์ง๊ธ ์ธ์๊ฐ์ ๋ ์จ๋ฆํ๊ฒ ๊ฐ๋ค. ์ ๋ง ์ง๋ฆฌ๊ณ ์ง๋ฆฌ๊ณ ์ง๋ฆฐ๋ค!!!!
๊ฒฐ๊ตญ, ํน์ case ์์ out of index ๊ฐ ๋ฐ์ํ๊ฑฐ๋, nil๊ฐ์ด ๋ฐ์ํ๊ฑฐ๋, ์ด์จ๋ index๊ฐ ๋ฌธ์ ์ธ๊ฒ ๊ฐ์๋ค. ์๋๋ฉด, ์์ ๋๋ฒ์งธ ํ์ด์์ ๋ณด๋ฉด, if๋ฌธ์ ํตํด์ ์ผ๋ถ๋ก w์ c๊ฐ์ ๊ณ์ ์กฐ์ ํด์ฃผ๊ณ , input์์ removeFIrst๋ฅผ ํด์ฃผ๋ฉด์, ๋ง์ฝ input์ด ๋น์์ผ๋ฉด~ c์๋ค๊ฐ๋ ์ด๋ ๊ฒ ๋๊ณ ,,,,, ์ ๋ง ๋ฐ๋ณด๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ด์๋ค. ๊ทธ๋์ ๊ณ์ input์ด ๋น์ด์๋ ์ํ์์ removefirst๋ฅผ ํ๊ฒ ๋์ด index ์๋ฌ๊ฐ ๋ฌ๋ ๊ฒ์ด๋ค...
๊ทธ๋์ ์ฒ์๋ถํฐ ๋ค์ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐํ๋ค.
์ฐ์ , ๋ ๋ด๊ฐ ๊ณ ๋ คํ์ง ๋ชปํ๋ ๊ฒ์ด ์์๋ค. ๋ฐ๋ก , ์์ถํ ๋ ค๋ ๋ฌธ์๊ฐ ์ ๋ ฅ๋ ๋ฌธ์๋ณด๋ค ์ปค์ง๋ ์ํฉ์ ๊ณ ๋ คํ์ง ์์๋ค. ์์ถํด์ dict์ ๋ฃ์ผ๋ ค๊ณ ํ๋ ๋ฌธ์์ด์ด ์ฌ์ค input์์ ๋ค์ด์จ ๊ธธ์ด๋ณด๋ค ํฌ๋ฉด, ์๋ฏธ๊ฐ ์๊ฒ ๋๋ค. ์ด๋ฐ ์ฒ๋ฆฌ๋ ๋ฐ๋ก ํ์ํ๋ค.
๊ทธ๋์ while๋ฌธ์ ๋๋ฆด ๋, input์ ๊ธธ์ด๋งํผ ๋๋ฆฌ๊ธฐ๋ก ํ๋ฐ. ์ด๋ count๋ก ์กฐ์ ํ๊ณ , while๋ฌธ์ ํ๋ฒ ๋๋๋ง๋ค count์ 1์ ๋ํด์ค๋ค. ์ฆ ์ ๋ ฅ์ด "KAKAO"์ด๋ฉด, count๊ฐ 5 ์ดํ์ฌ์ผ ๋์๊ฐ๋ค, ์ฆ, Kํ๋ฒ๋๊ณ A ๋๊ณ , K,, A,, ์ด๋ ๊ฒ ๋ค๋ฒ ๋๊ณ while๋ฌธ์ ํ์ถํ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋งจ ๋ง์ง๋ง O๋ while๋ฌธ์ ํ์ถํ๊ณ ํ๋ฒ ๋ append ๋ก anser์ ๋ฃ์ด์ค๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ์ ๋ต..... ํ... ์ง์์ KAKAO ๋ผ๋ ์ ๋ ฅ์ด๋ฉด, ์ด ๊ธธ์ด๋งํผ ๋๋ฆฌ๋ฉด๋๊ฒ๊ตฌ๋! ๋ฅผ ์๊ฐํ์ด์ผ ๋นจ๋ฆฌ ํ๋ ธ์ ๊ฒ ๊ฐ๋ค ใ ์ input์ ๋ง ๋ฃ์๋ค๊ฐ ๋บ๋ค๊ฐ ํ์๊น ใ
func solution(_ msg:String) -> [Int] {
var 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]
let input = msg.map { String($0) }
var answer = [Int]()
var count = 0 // count ํด๊ฐ๋ฉด์ while๋ฌธ์ ๋๋ฆด ๊ฑฐ์
var w = "" // str์๋ค๊ฐ ๋ํด๊ฐ๋ฉด์ ์งํ
while count < input.count {
let c = input[count] // ๋ค์๊ธ์
let tempwc = w + c
let isinDict = wcCheckInDict(w, c, dict: dict)
if !isinDict { // dict์ ์กด์ฌํ์ง ์์ผ๋ฉด
dict[tempwc] = dict.count + 1 // ์ผ๋จ dict ์ w+c ์ถ๊ฐ
answer.append(dict[w]!) // ๊ทธ๋ฆฌ๊ณ answer์๋ w value ์ถ๋ ฅ
w = ""
continue
}
w += c
count += 1
}
answer.append(dict[w]!)
return answer
}
func wcCheckInDict(_ w: String, _ c: String, dict: [String:Int]) -> Bool {
let wc = w+c
let isinDict = dict.contains { $0.key == wc }
return isinDict
}
// ํ
์คํธ ๋๋ ค๋ณด๊ธฐ
let msg = "TOBEORNOTTOBEORTOBEORNOT"
// ๊ฒฐ๊ณผ [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]
let a = solution(msg)
print(a)
โค๏ธ๐ฅ ๋ค๋ฅธ์ฌ๋์ฝ๋์์ ๋ฐฐ์ ๋ ์ !!
๋๋ dict์ ๊ตฌ์ฑํ ๋ A๋ถํฐ Z ๊น์ง ์๊ธฐ๋ก ๋ฃ์ด์ฃผ์๋ค.์๋นํ ๊ท์ฐฎ์๋ค.. ๊ทผ๋ฐ ์ด๊ฒ์ ์ฐ๋ฆฌ ์คํฐ๋์ ์ค ํ ๋ถ์ด Unicode๋ฅผ ์ด์ฉํด์ ๋ณํํ๊ณ , ์ด๋ฅผ for๋ฌธ์ผ๋ก ๊ฐ๋จํ๊ฒ ๋ฑ๋กํ์ จ๋ ๊ฒ์ด๋ค.. ์ฒ์ฌ๋ค.. ๋งค๋ฒ ๋ฌธ์์ ์ซ์์ฌ์ด์์ ๋ณํํ ๋ ์ ๋์ฝ๋ ๊ฐ๋ ์ ๊น๋จน๋๋ฐ ๊ผญ ๊ธฐ์ตํ๊ณ ๋์ค์ ์จ๋จน์ด๋ณด์.
for i in (1...26) {
dic[String(UnicodeScalar(i + 64)!)] = i
}