본문 바로가기
알고리즘

[Swift] 프로그래머스 - 카카오 표 편집

by 고고 2022. 7. 18.

링크: https://school.programmers.co.kr/learn/courses/30/lessons/81303

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

Node 클래스를 만들어 풀었습니다. 삭제/삽입은 연결리스트의 방식과 동일합니다.

맨 처음 노드의 prev은 nil이고 맨 마지막 노드의 next는 nil인 것만 조심하면 됩니다.

import Foundation

class Node {
    let number: Int
    var prev: Node?
    var next: Node?
    var isRemoved = false
    
    init(number: Int, prev: Node?, next: Node?) {
        self.number = number
        self.prev = prev
        self.next = next
    }
}

func solution(_ n: Int, _ k: Int, _ cmds: [String]) -> String {
    var nodes = [Node]()
    
    for i in 0..<n {
        let newNode = Node(number: i, prev: nil, next: nil)
        
        if !nodes.isEmpty {
            let prev = nodes.last!
            prev.next = newNode
            newNode.prev = prev
        }
        nodes.append(newNode)
    }
    
    var currentNode = nodes[k]
    var removed = [Node]()
    
    for cmd in cmds {
        let array = cmd.split(separator: " ")
        
        if array[0] == "U" {
            for _ in 0..<Int(array[1])! {
                currentNode = currentNode.prev!
            }
        } else if array[0] == "D" {
            for _ in 0..<Int(array[1])! {
                currentNode = currentNode.next!
            }
        } else if array[0] == "C" {
            currentNode.isRemoved = true
            removed.append(currentNode)
            
            let prev = currentNode.prev
            let next = currentNode.next
            
            if next == nil { // 삭제된 행이 가장 마지막 행인 경우 바로 윗 행을 선택합니다.
                prev!.next = nil
                
                currentNode = prev!
            } else {
                prev?.next = next
                next!.prev = prev
                
                currentNode = next!
            }
        } else if array[0] == "Z" {
            let last = removed.removeLast()
            last.isRemoved = false
            
            let prev = last.prev
            let next = last.next
            
            prev?.next = last
            next?.prev = last
        }
    }
    
    var result = ""
    
    for i in 0..<nodes.count {
        if nodes[i].isRemoved {
            result.append("X")
        } else {
            result.append("O")
        }
    }
    
    return result
}

댓글