Algorithm

Swift) 백준 5430번: AC

hoonsbrand 2022. 4. 30. 20:09

정말 오랜만에 올리는 포스팅이다!

코로나에 걸려서 증상 때문에 제대로 공부를 못했었다. 이제 다시 슬슬 시작해보려고 한다!

 

 

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

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

문제를 보고 정말 간단하다고 생각했다.

명령어도 두 개밖에 없고 그 명령 자체도 내용이 전혀 복잡하지 않기 때문이다.

D가 나올때는나올 때는 remove를 R이 나올 때는 reverse를 사용하여서 문제를 해결하려 했으나 시간 초과가 났다.

코로나 증상인지는 모르겠으나 집중이 너무 안돼서 중간중간에 쉬다가 생각을 해봤는데 저렇게 간단한 풀이로 풀리는 문제면 정답 비율이 저렇게 낮지 않을 것 같다고 생각하여서 다른 방법을 찾기 시작했다.

그중 내가 찾은 건 투 포인터를 사용하여 remove나 reverse를 그때그때 구현하는 것이 아닌 포인터를 이용해 마지막 출력 시에 최종 인덱스의 범위를 정해 출력을 한다.

그러면 연산과정이 정말 많이 줄어든다.

더 자세한 내용은 그림을 통해 설명해보겠다!

 

 

 

 

 

 

 

소스코드: 정답


import Foundation

let n = Int(readLine()!)!

for _ in 0..<n {
    let command = readLine()!
    let num = Int(readLine()!)!
    let arr = readLine()!.dropFirst().dropLast().split(separator: ",").map{Int(String($0))!}
    
    var head = 0 , tail = num-1
    var isReversed = false
    var isError = false
    
    for i in command {
        if i == "D" {
            if head > tail {
                isError = true
                break
            }
            if isReversed {
                tail -= 1
            } else {
                head += 1
            }
        } else {
            isReversed.toggle()
        }
    }
    
    if isError {
        print("error")
    } else if head > tail {
        print("[]")
    } else {
        let ans = arr[head...tail].map{String($0)}.joined(separator: ",")
        let reverseAns = arr[head...tail].reversed().map{String($0)}.joined(separator: ",")
        if isReversed {
            print("["+reverseAns+"]")
        } else {
            print("["+ans+"]")
        }
    }
}

toggle()은 스위치같은 것이라고 생각하면 쉬운데, true와 false를 오가며 활성화시켜주는 아주 편리한 녀석이다.

false일 때 toggle()은 true로 바뀌고 true일 때는 false로 바뀐다! 

isReversed = !isReversed와 같은 기능을 한다.

 

위에서 언급한것 처럼 head가 tail보다 커진다고 해서 무조건 error를 출력하는 것은 아니고 그 상태가 마지막 명령이라면 빈 배열을 출력한다고 했다.

출력 부분에 head > tail 조건문이 있는 이유가 바로 그것이다.

 

마지막으로, 내용이 있는 배열을 출력하는 부분은 우선 입력 예시에서 나온 R명령에 따라 본래 형태의 배열과 뒤집어진 배열, 이 두 경우의 배열을 요소 사이에 separator를 사용해 쉼표를 넣어준다.

그 후 isReversed를 판별하여 각 상황에 맞는 배열을 사용하여 앞뒤로 "["와 "]"를 붙여주어 출력 예시가 만족하는 배열의 형태로 만들어준다!

 

 

 

 

 

 

 

 

 

 

 


며칠간 신체적인 코로나 증상으로 심한 두통으로 인한 집중력 저하를 경험했다.

나는 사실 집에서 공부를 할 때 밖에서 할 때보다 효율이 많이 떨어지는 편인데 그걸 감안하더라도 평소보다 정말 심하단 걸 느꼈다.

다음 주 월요일 자정이면 격리가 해제되는데 빨리 나가서 최대 효율로 다시 공부리듬을 찾고 싶다!