[Swift]BOJ-17413

BOJ-17413, 단어 뒤집기 2

문제 📑

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

 

17413번: 단어 뒤집기 2

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져

www.acmicpc.net

문제 정리 ▾

BOJ-17413

  • 문자열을 입력받는다.
  • 저번 단어 뒤집기 문제와 유사하지만 "<", ">" 특수 문자 안에는 문자열이 그대로 존재(역순 x)해야 한다.
  • 특수 문자로 둘러싸지 않은 문자열은 뒤집어 출력이 되어야 한다.

 

접근 🚶🏻

나의 생각 ▾

  • 저번 단어 뒤집기 문제와 유사하기 때문에 특수문자 처리만 잘해주면 된다고 생각했다.
  • 가장 중요했다고 생각하는 부분이 특수문자가 시작되는 경우에 그 뒤 문자열들을 어떻게 넣어줄지였다.

나의 해결 ▾

func solution() {
    let input = readLine()!
    var result: String = ""
    var str: String = ""
    var check: Bool = true
    
    for word in input {
        switch word {
        case "<":
            result += str.reversed()
            result.append(word)
            str = ""
            check = false
            
        case ">":
            result.append(word)
            check = true
            
        default:
            if check {
                if word == " " {
                    result += str.reversed() + " "
                    str = ""
                } else {
                    str.append(word)
                }
            } else {
                result.append(word)
            }
        }
    }
    if !str.isEmpty {
        result += str.reversed()
    }
    print(result)
}
solution()
  • 코드에 관한 내용은 밑에서 살펴보자 😀

 

코드 리뷰 ▾

for word in input {
        switch word {
    }
}
  • 큰 틀부터 보면 input은 입력받은 문자열이고, word를 통해 input의 요소 하나하나를 접근한다.
  • switch문을 통해 word가 어떤 문자인지 체크를 해줄 것이다.

case "<":
    result += str.reversed()
    result.append(word)
    str = ""
    check = false
  • 첫 번째 case부터 보면 특수문자로 시작할 경우이다.
  • 특수문자 안에서는 문자열이 그대로 출력이 되어야 하기 때문에 result라는 string형 변수에 "<"를 넣어준다.
  • 그리고 특수문자 전에 역순으로 넣어진 문자열이 있을 수 있으니 result에 추가해주기 위해 result += str.reversed()를 해주었다.
  • 아래에서 특수문자 시작을 알리기 위해 check라는 변수에 false값을 넣어주었다.

case ">":
    result.append(word)
    check = true
  • 두 번째 case는 특수문자가 닫힐 경우이다.
  • ">"가 result 변수에 들어가면 되기 때문에 넣어줌과 동시에 check 변수형을 true값으로 변경시켜서 아래에서 특수문자 끝을 알려주었다.

default:
    if check {
        if word == " " {
            result += str.reversed() + " "
            str = ""
        } else {
            str.append(word)
        }
    } else {
        result.append(word)
    }
  • 마지막 case는 제일 먼저 check로 시작을 하는데, 이 check는 특수문자 "<"의 시작이 끝이 났는지를 체크하는 부분이다.
  • 앞 코드 블록에서도 설명이 되었지만 ">" 닫힌 태그를 만나야만 check가 true가 된다.
  • check가 ture 일 경우, 문자열들을 임의의 변수 str(역순을 위한 변수)에 넣어주었다.
  • 그리고 띄어쓰기(공백)를 만나면 여태까지 들어갔던 문자열을 가진 str을 역순으로 바꾸어 result 변수에 넣어주었다.

if !str.isEmpty {
    result += str.reversed()
}
print(result)
  • 마지막 이 부분은 임의의 저장공간 변수 str의 문자가 남아있을 경우를 대비해 안 비어있으면 result에 넣어주며 출력을 하고 마무리가 된다.

 

Additional 📂

  • 생각이 좀 필요했던 문제였던 것 같다.
  • 조금이라도 더 간결하고 직관성을 띄는 코드로 구현을 하기 위해 노력은 했는데 아직도 부족은 해 보인다.😅

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

[Swift]BOJ-17298  (0) 2022.02.05
[Swift]BOJ-10799  (0) 2022.02.04
[Swift]BOJ-10845  (0) 2022.02.02
[Swift]BOJ-1406  (0) 2022.02.01
[Swift]BOJ-9012  (0) 2022.01.31