[Swift] [49일차] 950_LEET 퐁당퐁당

·2025년 1월 25일
0

SwiftAlgorithm

목록 보기
52/105
post-thumbnail

950. Reveal Cards In Increasing Order


문제 설명

  1. 카드 배열이 제공됨
  2. 카드배열 순서를 내맘대로 조절할 수 있는데,
  3. 주어진 일련의 행동을 따라서 수행할 때 카드 뒤집는 순서가 오름차순으로 되게끔 수행하라

주어진 행동

  1. 맨위 뒤집고 아웃!
  2. 그다음카드 맨아래로
  3. 이것들 반복!

문제 접근

  1. 그러면 이게 일단 퐁당퐁당 점점 커지면되는 것인데,
  2. 한바퀴돌면서 그 다음 추가된 친구를 수행하는 부분을 어떻게 잘 수행할 것인지가 쟁점인듯 보였다.
  3. 일단 한쪽으로 sorting을 하고 시작해야겠다는 생각정도..?

풀면서 알아낸 결과는

[2,3,5,7,11,13,17]은
[2,13,3,11,5,17,7] 형태지만
[2,3,5,11,13,17]은
[2,13,3,11,5,17]가 아니라, [2,11,3,13,5,17]로 꼬임업는 퐁당 배열이다
그래서 결국 알아낸 것은

길이가 짝수면 -> 퐁당

길이가 홀수면 -> 당퐁당배열 두바퀴째의 배열 맨앞은 제일작지않고 그다음작은수다


라고 풀어주다가 무한한 indexOutOfBounds? 여튼 배열 밖으로 계속 인덱스가 팅겨나가는 것에서 이 방향이 아니구나를 느꼈다.
이게 1,2번에서 하라는 시뮬레이션을 반대로 할 생각을 하긴했는데, 결국엔 힌트보니까 이방향이 맞더라..근데 내가 왜 첨부터 안했냐하면...

1. 맨앞뒤집기

2. 다음 맨뒤를 맨아래로 보내기

이거를 거꾸로 한다는게
1. 맨뒤를 맨앞으로?
2. 맨앞에서 다음꺼?
아니면 거꾸로니까 아예 오름차순부터? 등등.. 잡생각이 많아서였는데,

1. 그냥 queue의 형태로 / 맨뒤(제일 큰수)를 정답배열로 옮기고, 그 다음 거기서 맨뒤를 맨앞으로 옮기고

answer.insert(item, at: 0)

2. 그 다음 그 정답배열에서 맨뒤친구를 맨앞으로 또 옮겨줬다.

answer.insert(answer.removeLast(), at: 0)

Q : 역순인데 왜 맨뒤 맨앞추가를 연속으로 ??

원래 시뮬: 맨 위에서 공개 --->> 맨 뒤로 이동
역방향시뮬: 맨 뒤에서 앞으로 이동 --->> 공개된 카드 맨 앞에 추가

최종코드

class Solution {
    func deckRevealedIncreasing(_ deck: [Int]) -> [Int] {
        var a = deck
        a.sort(by: >)
        var answer = [Int]()

        for item in a {
            answer.insert(item, at: 0)

            answer.insert(answer.removeLast(), at: 0)
        }
        answer.append(answer.removeFirst())
        return answer
    }
}
     answer.append(answer.removeFirst())

마지막의 해당 한줄은 이게 반복문 돌리는 과정에서 마지막 한 요소는 포함이 안되느라 완성된 것에서 하나를 맨 뒤로 밀어줬다.

타인의 코드

class Solution {
    func deckRevealedIncreasing(_ deck: [Int]) -> [Int] {
        let sortedDeck = deck.sorted() // O(nLogn)
        var finalDeck = Array(repeating: 0, count: deck.count)

        // Fill my queue
        var queue = [Int]()
        for i in 0 ..< deck.count { // O(n)
            queue.append(i)
        }

        // Place card in the deck
        for num in sortedDeck { // O(n)
            let pos = queue.removeFirst()
            finalDeck[pos] = num
            if !queue.isEmpty {
                queue.append(queue.removeFirst())
            }
        }

        return finalDeck
    }
}

이분의 코드는 정방향시뮬로 푸신 것 같다.
특이한게 정렬된 숫자(num)와 0부터 deck.count까지의 인덱스(queue)를 각각 따로 돌리며 위치를 계산해 나가는 방식이었다.
컴퓨터스럽게 짜여진 코드같았다.
솔직히 직관적으로 확 와닿지는 않았지만, 코드를 따라가다 보니 점점 이렇게도 문제를 풀 수 있구나라는 생각을 했다. 이게 단독으로 돌아가는 queue번호에 퐁당퐁당을 탑승시킨 느낌...?

profile
기억보단 기록을

0개의 댓글