ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 17413번 : 단어 뒤집기2
    Problem Solving/백준 2023. 2. 15. 23:36

    코딩테스트 대비 문제집에서 뽑아봤다.

    문자열 문제?

    • Swift는 문자열 처리가 성가셔서 연습할 겸 문자열 목록의 추천 문제에서 가져왔다.
    • 근데 사실 문자열보다는 stack과 조건문을 활용한 분기처리 문제였다.
    • 그래도 추천 문제답게 푸는 포람이 있다. 함정도 꽤 많고 조건을 잘 못찾으면 헤맬수도😡
    • 힌트 : 문자열을 배열로 변환해보자!
    var s = readLine()!.map{String($0)} // popLast() 사용을 위해 String 배열로 변환.
    var ans = "" //출력 문자열
    var stack : [String] = [] // 스택으로 활용할 배열
    var meetTag = false // 현재 태그 내부인지 판별.
    
    for i in s {
        switch i {
        case "<" :
            if !stack.isEmpty { // 그 이전까지 단어였다
            while !stack.isEmpty {ans += stack.popLast()!} //뒤에서부터 꺼내기때문에 뒤집혀서 출력
            }
            ans += i // "<"은 이전이 단어 여부에 상관없이 출력
            meetTag = true // 태그 내부에 있다는 의미
    
        case ">" :
            meetTag = false
            ans += i
    
        case " " :
            if !meetTag {while !stack.isEmpty {ans += stack.popLast()!}} //태그 내부의 공백인지 구분
            ans += i
    
        default :
            if meetTag {ans += i} // 태그 내부라면 그대로 출력
            else {stack.append(i)} // 단어라면 스택에 저장
        }
    }
    while !stack.isEmpty {ans += stack.popLast()!} // 단어를 담은 채로 열린 태그나 공백을 만나지 못하는 케이스 고려
    print(ans)

    솔직히 풀고나서 코드가 너무 맘에 들지 않았다. 겹치는 코드를 함수로 빼고 조건을 좀 더 다듬어 보았다.

    var s = readLine()!.map{String($0)} // popLast() 사용을 위해 String 배열로 변환.
    
    var ans = "" //출력 문자열
    
    var stack : [String] = [] // 스택으로 활용할 배열
    
    var meetTag = false // 현재 태그 내부인지 판별.
    
    func pop() {
        while !stack.isEmpty {
            ans += stack.popLast()! //뒤에서부터 꺼내기때문에 뒤집혀서 출력
        }
    }
    
    loop1 : for i in s  {
        switch i {
        case "<" :
            if !stack.isEmpty { // 그 이전까지 단어였다
                pop()
            }
            meetTag.toggle()// 태그 내부에 있다는 의미
    
        case ">" :
            meetTag.toggle()
    
        case " " :
            if !meetTag {pop()} //태그 내부의 공백인지 구분
    
        default :
            if !meetTag {
                stack.append(i)// 단어라면 스택에 저장
                continue loop1 //문자열에도 더해지는걸 방지
            }
        }
        ans+=i //스택에 넣는 경우 제외 문자열에 더해주기
    }
    pop()// 단어를 담은 채로 열린 태그나 공백을 만나지 못하는 케이스 고려
    print(ans)

    스택에서 꺼내는 동작을 pop() 함수로 구현하고 Bool의 toggle() 메서드를 활용했다.

    스택에 넣는 경우를 제외하고는 문자를 출력에 더해줬기 때문에 조건문에 loop로 명명하고 continue로 넘어갔다.

    엣지케이스가 꽤 많아 어려울 수 있는 문제지만 테스트 케이스가 무려 7개라 엣지를 거의 잡아준다.(

    난이도가 실버3인 이유

    )

    난이도가 올라갈수록 참고할 풀이가 없지만, 조금만 신경써도 순위권 안에 들 수 있어 재밌는 언어 Swift, 츄라이 츄라이

     

     

    댓글

Designed by Tistory.