๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Problem Solution/Programmers

2018 KAKAO BLIND RECRUITMENT [3์ฐจ] ์••์ถ• Swift

by Fomagran ๐Ÿ’ป 2020. 11. 16.
728x90
๋ฐ˜์‘ํ˜•
 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - [3์ฐจ] ์••์ถ•

TOBEORNOTTOBEORTOBEORNOT [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]

programmers.co.kr

Solution


 

1. ๋Œ€๋ฌธ์ž ์•ŒํŒŒ๋ฒณ์ด ๋‹ด๊ธด ๋ฐฐ์—ด -> var words = (64...90).map({"\(UnicodeScalar($0)!)"})

์•„์Šคํ‚ค์ฝ”๋“œ 65๋ฒˆ๋ถ€ํ„ฐ 90๋ฒˆ๊นŒ์ง€๊ฐ€ A๋ถ€ํ„ฐ Z๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ์—์„œ๋Š” A์˜ ์ธ๋ฑ์Šค๋ฅผ 1๋กœ ํ–ˆ์œผ๋ฏ€๋กœ 64๋ฒˆ์งธ๋ถ€ํ„ฐ๋กœ ์„ค์ •ํ•จ.

 

2. words ์•ˆ์˜ ๋ฐฐ์—ด ์ค‘ ๊ฐ€์žฅ ๊ธด ๋ฌธ์ž๊ธธ์ด์—์„œ 1์„ ๋บ€ ์ˆ˜- > var maxCount = 0

 

3. msg๋ฅผ map์œผ๋กœ ๋‚˜๋ˆ ์ค€ ๋ณ€์ˆ˜ -> let map = msg.map{String($0)}

 

4. ํ˜„์žฌ ๋ฌธ์ž์˜ ์ธ๋ฑ์Šค ๋ณ€์ˆ˜ - >  var x = 0

 

5. ์ถœ๋ ฅ๋  ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด - > var answer = [Int]()

 

while๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ž ์ „์ฒด๋ฅผ ์ˆœํšŒํ•ฉ๋‹ˆ๋‹ค. -> while x <= map.count-1 {

 

for in stride ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ words์˜ ๊ฐ€์žฅ ๊ธด ๋ฌธ์ž๊ธธ์ด -1 ๋ถ€ํ„ฐ 0๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด์คŒ -> for j in stride(from: maxCount, to: -1, by: -1) {

 

๋งŒ์•ฝ x + j ๊ฐ€ ์ „์ฒด ๋ฌธ์ž๋ณด๋‹ค ๊ธธ๋ฉด continue๋กœ j์˜ ๊ธธ์ด๋ฅผ ์ค„์—ฌ์ค€๋‹ค. ->  if  x+> map.count-1 continue }

 

๊ทธ๋ฆฌ๊ณ  x๋ถ€ํ„ฐ x+j๊นŒ์ง€์˜ ๋ฌธ์ž๊ฐ€ words์•ˆ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด -> if words.contains(map[x...x+j].joined()) {

 

words์—์„œ x๋ถ€ํ„ฐ j๊นŒ์ง€์˜ ๋ฌธ์ž ์ธ๋ฑ์Šค๋ฅผ ์•Œ์•„๋‚ด์–ด answer์— ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. -> answer.append(words.firstIndex(of: map[x...x+j].joined())!)

 

x๋ถ€ํ„ฐ j๊นŒ์ง€ ๋ฌธ์ž ๋‹ค์Œ์ด ์ „์ฒด ๋ฌธ์ž๋ณด๋‹ค ๊ธธ์ง€ ์•Š๋‹ค๋ฉด -> if x+j+1 <= map.count-1 {

 

x๋ถ€ํ„ฐ j+1 ๋ฌธ์ž๋ฅผ words์— ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. -> words.append(map[x...x+j+1].joined())

 

์ถ”๊ฐ€๋œ ๋ฌธ์ž์˜ ๊ธธ์ด์™€ ํ˜„์žฌ ๊ฐ€์žฅ ๊ธด ๋ฌธ์ž์˜ ๊ธธ์ด๋ฅผ ๋น„๊ตํ•ด์„œ ๋” ๊ธด ๊ธธ์ด๋ฅผ maxCount๋กœ ์„ค์ • - > maxCount = max(maxCount, j+1)

 

x์˜ ์ธ๋ฑ์Šค๋ฅผ x+j+1๋กœ ๋ฐ”๊ฟ”์คŒ - >  x = x+j+1

 

x์˜ ์ธ๋ฑ์Šค๊ฐ€ ์ „์ฒด ๋ฌธ์ž๋ณด๋‹ค ์ปค์ ธ while๋ฌธ์„ ํƒˆ์ถœํ–ˆ์„ ๋•Œ answer์— ์ €์žฅ๋œ ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•ด์คŒ - > return answer

 

Source Code


 

func solution(_ msg:String) -> [Int] {
//65~90๋ฒˆ์งธ๊นŒ์ง€ ๋Œ€๋ฌธ์ž ์•ŒํŒŒ๋ฒณ (๋ฌธ์ œ์—์„œ index๊ฐ€ 1๋ถ€ํ„ฐ์ด๋ฏ€๋กœ 64๋ถ€ํ„ฐ ์„ค์ •)
var words = (64...90).map({"\(UnicodeScalar($0)!)"})
//์ถ”๊ฐ€๋œ ๋ฌธ์ž์˜ ๊ธธ์ด ์ค‘ ๊ฐ€์žฅ ๊ธด ๊ธธ์ด๋ฅผ ์ €์žฅ
var maxCount = 0
//msg๋ฅผ map์œผ๋กœ ๋‚˜๋ˆ ์คŒ
let map = msg.map{String($0)}
//ํ˜„์žฌ ๋ฌธ์ž์˜ ์ธ๋ฑ์Šค
var x = 0
//์ถœ๋ ฅ๋œ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด
var answer = [Int]()
//x๊ฐ€ ์ฃผ์–ด์ง„ ๋ฌธ์ž index๋ณด๋‹ค ํฌ์ง€ ์•Š๋‹ค๋ฉด
while x <= map.count-1 {
//๊ฐ€์žฅ ๊ธด ๋ฌธ์ž์˜ ๊ธธ์ด๋ถ€ํ„ฐ 0๊นŒ์ง€ ๋ฐ˜๋ณต
for j in stride(from: maxCount, to: -1, by: -1) {
//x๋ถ€ํ„ฐ j๊นŒ์ง€์˜ ๊ธธ์ด๊ฐ€ ์ „์ฒด๋ฌธ์ž๋ณด๋‹ค ๊ธธ๋‹ค๋ฉด
if x+j > map.count-1 {
//๊ทธ๋ƒฅ ํŒจ์Šคํ•˜์„ธ์š”
continue
}
//words์•ˆ์— ๋ฌธ์ž์˜ x๋ถ€ํ„ฐ j๊นŒ์ง€ ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ๋‹ค๋ฉด
if words.contains(map[x...x+j].joined()) {
//words์—์„œ x๋ถ€ํ„ฐ j๊นŒ์ง€์˜ ์ธ๋ฑ์Šค๋ฅผ ์•Œ์•„๋‚ด์–ด answer์— ์ถ”๊ฐ€ํ•ด์คŒ
answer.append(words.firstIndex(of: map[x...x+j].joined())!)
//x๋ถ€ํ„ฐ j๊นŒ์ง€์˜ ๋ฌธ์ž ๋‹ค์Œ์ด ์ „์ฒด ๋ฌธ์ž์˜ ๊ธธ์ด๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด
if x+j+1 <= map.count-1 {
//words์— ์ถ”๊ฐ€ํ•ด์คŒ
words.append(map[x...x+j+1].joined())
//์ถ”๊ฐ€ํ•ด์ค€ ๋ฌธ์ž์˜ ๊ธธ์ด์™€ maxCount ์ค‘ ๋” ๊ธด ๊ฑธ maxCount๋กœ ์„ค์ •
maxCount = max(maxCount, j+1)
//x๋ถ€ํ„ฐ j๊นŒ์ง€ ๋ฌธ์ž์˜ ๋‹ค์Œ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ๋„˜๊น€
x = x+j+1
}else{
return answer
}
break
}
}
}
return answer
}
view raw ์••์ถ•.swift hosted with โค by GitHub
728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€