[Swift]BOJ-1406

BOJ-1406, 에디터

문제 📑

https://www.acmicpc.net/problem/1406

 

1406번: 에디터

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수

www.acmicpc.net

문제 정리 ▾

BOJ-1406

  • 문장을 입력 받고, 명령어의 개수도 개행으로 입력받는다.
  • 각각의 명령어들이 입력이 되고, 그 명령어의 맞게 출력을 해주면 된다.

 

접근 🚶🏻

나의 생각 ▾

  • 처음 문제를 봤을 때 커서를 인덱스로 다루고, 인덱스를 이용해 명령어들을 실행시키려고 했다.
  • 예상외로 인덱스를 이용하는데 여러 문제들이 있어서 다른 String객체(Rstr)를 만들어 왼쪽으로 이동할 때마다 오른쪽의 값들을 Rstr변수에 넣어주었다.

내 코드(인덱스 이용_ 미해결) ▾

func solution() {
    var data = readLine()!.map{ String($0) }
    let cnt = Int(readLine()!)!
    var idx = data.count - 1
    for _ in 0..<cnt {
        let input = readLine()!.split(separator: " ")
        switch input[0] {
        case "L":
            if idx > 0 {
                idx -= 1
            }
            print("L idx = \(idx)")
        case "R":
            if idx <= data.count-1 {
                idx += 1
            }
            print("R idx = \(idx)")
        case "B":
            if idx > 0 {
                data.remove(at: idx)
                idx -= 1
            }
            print("B idx = \(idx)")
        default:
//            idx += 1
            data.insert(String(input[1]), at: idx)
//            idx += 1
            print("P idx = \(idx)")
        }
    }
    print(data.joined(separator: ""))
}
solution()
  • 구현하다가 포기한 코드이다.
  • 나름 생각은 괜찮았다고 생각했는데 끝까지 했다면 구현이 가능했으나 코드가 길어짐에 따라 생각을 바꾸기로 했다.

 

나의 해결 ▾

func solution() {
    var Lstr = readLine()!
    var Rstr = ""
    
    for _ in 0..<Int(readLine()!)! {
        let order = readLine()!
        switch order {
        case "L":
            if !Lstr.isEmpty {
                Rstr.append(Lstr.popLast()!)
            }
            
        case "D":
            if !Rstr.isEmpty {
                Lstr.append(Rstr.popLast()!)
            }
            
        case "B":
            if !Lstr.isEmpty {
                Lstr.removeLast()
            }
            
        default:
            Lstr.append(order.last!)
        }
    }
    print(Lstr + Rstr.reversed())
}
solution()
  • 코드에 관한 내용은 밑에서 살펴보자 😆

 

코드 리뷰 ▾

for _ in 0..<Int(readLine()!)! {
        let order = readLine()!
        switch order {
        case "L":
            if !Lstr.isEmpty {
                Rstr.append(Lstr.popLast()!)
            }
            
        case "D":
            if !Rstr.isEmpty {
                Lstr.append(Rstr.popLast()!)
            }
            
        case "B":
            if !Lstr.isEmpty {
                Lstr.removeLast()
            }
            
        default:
            Lstr.append(order.last!)
        }
    }
  • 명령어의 개수만큼 실행할 수 있게 for문을 큰 틀로 잡았다.
  • 이후 명령어에 따라 switch문을 이용해 각각의 케이스에 맞게 넣어주었다.
    • L: Rstr에 넣어줌(임시 저장)과 동시에 기존 입력받은 변수의 마지막 값을 삭제(왼쪽 이동)
    • D: 왼쪽으로 이동한 경우가 없다면, 기존 변수에 Rstr의 마지막 값을 다시 넣어주었다. (오른쪽 이동)
    • B: 커서 기준 왼쪽 삭제이므로, 마지막 값을 삭제해주면 된다. (커서 기준 왼쪽 값 삭제)
    • P: 기존 Lstr에 추가를 해준다. (커서 기준 왼쪽 값 추가)

print(Lstr + Rstr.reversed())
  • 임시저장 변수(Rstr)은 스택처럼 데이터가 들어가있으므로, 역순으로 바꿔주어 마지막 들어온것부터 나갈 수 있도록 해주었다.

 

Additional 📂

  • 나름 쉬운 문제였다.
  • 인덱스를 이용해 다시 풀어보려고 한다.
  • 그래도 코드는 직관적이고 효율적인게 더 좋다고 생각하기에 두 번째 풀이도 나름 만족한다. 😀

'Algorithm.zip' 카테고리의 다른 글

[Swift]BOJ-17413  (0) 2022.02.03
[Swift]BOJ-10845  (0) 2022.02.02
[Swift]BOJ-9012  (0) 2022.01.31
[Swift]BOJ-9093  (0) 2022.01.31
[Swift]BOJ-10828  (0) 2022.01.30