You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
저희가 이전에 이야기 나누기를 struct내부에서 mutating이 너무 빈번히 일어나면 차라리 class가 더 빠르다 라고 결론을 지었던 내용이 있었는데요
이번에 DSLR을 풀면서 이게 또 반드시 그런 건 아닌가? 하는 생각이 들어서 기록을 위해 남겨놓습니다. 스위프트를 참 알다가도 모르겠네요 ㅋㅋ
문제는 큐를 struct로 구현하는지 class로 구현하는지에 따라 시간이 굉장히 많이 차이가 나고, 특히 struct가 더 빨랐습니다. struct로 구현하게 되면 큐의 enqueue과 dequeue가 mutating이 붙어야만 하기 때문에 기존의 결론처럼 오히려 class로 구현하는 것보다 느리지 않을까 싶었는데, 반대로 훨씬 빠르네요.
로직에 문제가 있는 건지 제 눈으로는 파악이 잘안되어서 아래에 제가 구현한 코드도 함께 남겨놓습니다~
typealiasDSLR=(_ n:Int)->Intfunc D(_ n:Int)->Int{return(2* n)%10000}func S(_ n:Int)->Int{return n ==0 ? 9999: n-1}func L(_ n:Int)->Int{letpulledN=(n %1000)*10letlast= n /1000return pulledN + last
}func R(_ n:Int)->Int{letpushedN= n /10letfirst=(n %10)*1000return first + pushedN
}letdirections:[(DSLR,String)]=[(D,"D"),(S,"S"),(L,"L"),(R,"R")]
if let inputLength =readLine().flatMap(Int.init){varresult=""
for _ in 0..<inputLength {
guard let input =readLine()?.split(separator:"").compactMap({Int($0)})else{
break
}letstartNumber=input[0],targetNumber=input[1]varqueue=Queue<(number:Int, flag:String)>()
queue.enqueue((number: startNumber, flag:""))vareverVisitied=Array(repeating: false, count:10000)everVisitied[startNumber]= true
varinProgress= true
while inProgress {
guard let(number, currentFlag)= queue.dequeue()else{ break }
for (dslr, flag) in directions {letnumber=dslr(number)
if everVisitied[number]{
continue
}letflag= currentFlag + flag
if number == targetNumber {
result += flag +"\n"
inProgress = false
break
}else{everVisitied[number]= true
queue.enqueue((number: number, flag: flag))}}}}print(result)}// MARK: - struct queuestructQueue<Element>{privatevarlist=[Element]()privatevarindex=0varisEmpty:Bool{return index >= list.count
}mutatingfunc enqueue(_ element:Element){
list.append(element)}mutatingfunc dequeue()->Element?{
if isEmpty {returnnil}defer{
index +=1}returnlist[index]}}// MARK: - class queue//class Queue<Element> {// private var list = [Element]()// private var index = 0//// var isEmpty: Bool {// return index >= list.count// }//// func enqueue(_ element: Element) {// list.append(element)// }//// func dequeue() -> Element? {// if isEmpty {// return nil// }//// defer {// index += 1// }//// return list[index]// }//}
The text was updated successfully, but these errors were encountered:
저희가 이전에 이야기 나누기를 struct내부에서 mutating이 너무 빈번히 일어나면 차라리 class가 더 빠르다 라고 결론을 지었던 내용이 있었는데요
이번에 DSLR을 풀면서 이게 또 반드시 그런 건 아닌가? 하는 생각이 들어서 기록을 위해 남겨놓습니다. 스위프트를 참 알다가도 모르겠네요 ㅋㅋ
문제는 큐를 struct로 구현하는지 class로 구현하는지에 따라 시간이 굉장히 많이 차이가 나고, 특히 struct가 더 빨랐습니다. struct로 구현하게 되면 큐의 enqueue과 dequeue가 mutating이 붙어야만 하기 때문에 기존의 결론처럼 오히려 class로 구현하는 것보다 느리지 않을까 싶었는데, 반대로 훨씬 빠르네요.
로직에 문제가 있는 건지 제 눈으로는 파악이 잘안되어서 아래에 제가 구현한 코드도 함께 남겨놓습니다~
The text was updated successfully, but these errors were encountered: