본문 바로가기
알고리즘 문제풀이

[백준 3568] iSharp (Swift)

by SiO2whocode 2025. 2. 20.
728x90

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

 

문자열, 파싱

한줄에 기본 타입과 변수들이 주어지는데, 이 변수들이름 오른쪽에 추가적인 자료형이 붙어있을 수 있다.

이때 각 변수들을 한줄에 하나씩 출력하는데 "기본타입+추가적인 자료형의 역순 변수이름;" 이렇게 출력해야 하는 문제

변수형에는 [], &, * 가 올 수 있고, 변수 이름은 알파벳 소문자 혹은 대문자로 구성

 

접근방법

1. 우선 첫번째 기본 자료형을 defaultType이라는 변수에 저장해두고,

2. 변수들을 하나씩 보면서 isLetter 메서드를 사용해서 이름만 분리했다.

3. 이제 추가적인 자료형을 역순으로 배치하기 위해서, 각 변수에서 isLetter가 아닌 문자들만 필터링했고, 이 문자열을 역순으로 순회하면서 "&" 혹은 "*"인 경우 그대로 defaultType 뒤에 붙여주고, "[", "]" 인 경우 반대쪽 괄호로 바꿔서 넣어줬다. (역순으로 하면 괄호가 반대로 되어야 하기 때문에), 그리고 "," 혹은 ";" 인 경우 무시한다.

4. 타입과 변수명 사이를 띄고 마지막에 ";"를 추가해서 출력하면 끝

 

switch문을 잘 안썼는데 이번에 쓰고 filter랑 map도 썼다. swift는 은근히 String 배열을 반환해주는 경우가 적어서 (ex. substring..등) map으로 String($0)을 해줘야 하는 경우가 많았다.

 

소스코드

import Foundation

func solution() {
    
    // input
    let strings:[String] = readLine()!.split(separator:" ").map { String($0) }
    let defaultType:String = strings[0]
    let variables:[String] = strings[1...].map{String($0)}
        
    for vari in variables {
        var type = defaultType
        let name = vari.filter{ $0.isLetter }
        let addtype = vari.filter { !$0.isLetter }
        for c in addtype.reversed() {
            switch c {
            case "&":
                type += "&"
            case "*":
                type += "*"
            case "[":
                type += "]"
            case "]":
                type += "["
            case ",",";":
                continue
            default:
                continue
            }
        }
        
        print(type, name+";")
    }
    
}

solution()
728x90