3324. Find the Sequence of Strings Appeared on the Screen
문제설명
- KEY 1,2중에 시행을 할 것
- KEY1 -> 문자열에 "a"추가, KEY2 -> 문자열을 1레벨업 (a -> b, c->d)
- 그렇게해서 이제 주어진 문자열을 만드는 과정을 배열에 담아서 출력해라 !
문제 풀이
- 지난번 문제처럼 (모음) 알파벳 배열을 선언해주고 시작하면 더 효율적일 것 같았다.
- 이번에는 순서도 중요하므로
SET
말고Array
로 해줬다.var alphabet = Array("abcdefghijklmnopqrstuvwxyz")
- 그래서 지금 얼만큼 레벨업을 거쳐야하는지(KEY2)를 index(of:)로 판단만해주면 쉽게 풀릴듯?했다.
alphabet.index(of: target_arr[cnt])!
class Solution {
func stringSequence(_ target: String) -> [String] {
var answer = [String]()
let target_arr = Array(target)
let alphabet = Array("abcdefghijklmnopqrstuvwxyz")
var tmp = ""
while tmp != target {
let cnt = tmp.count // 현재 길이
// String(target_arr[cnt]) == tmp
// tmp_arr.append("a") // KEY 1
for i in 0 ... (alphabet.index(of: target_arr[cnt])!) { // KEY2 차례 a-> 도착점까지
let nowString = tmp + String(alphabet[i])
answer.append(nowString)
}
tmp = answer.last!
}
return answer
}
}
보면은 알 수 있듯이, 이게
tmp
가 찐 본체고, 문자열을 계쏙해서 누적시키려면a
부터 돌때동안 이전까지 만든걸 터치안하기 위해서nowString
으로 볼 수 있듯이 한 자릿수마다 for문 돌려주면서 tmp에 현재 추가하고자 하는 문자열을 넣어서 그 과정이 쉽게 보일 수 있도록했다.let nowString = tmp + String(alphabet[i])
마지막으로는
tmp
를 방금 반복문이 끝난 상태로 들어간answer.last!
로 최신화 해준것이다.
나머지는 자리마다 반복된다.
속도에 있어서 크게 기대는 안했는데, 높게 나와서 나름 뿌듯했다. 100%에 해당하는 코드를 보자면..
타인의 코드
class Solution {
func stringSequence(_ target: String) -> [String] {
var result = [String]()
var prefix = ""
let allChars: [Character] = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
for c in target {
for c2 in allChars {
result.append(prefix + String(c2))
if c2 == c {
break
}
}
prefix += String(c)
}
return result
}
}
굳이 index를 찾아줄 필요도 엇이 반복문돌면서 같은 문자열 나오면 break해줘서 깔끔하게 처리한걸 볼 수 있었다. 풀면서 느낀건데 이게 다른 더 어려운 문제처럼 위로만 레벨업하는게아니라 아래로도 레벨업하는 문제였으면 좀 더 어려워지겠구나 싶었다.