프로그래머스 - 2020 KAKAO BLIND RECRUITMENT

인생노잼시기·2021년 7월 16일
0

😨코딩테스트

목록 보기
14/18

괄호변환

아직 더 구현해야 하는 부분
u의 첫번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙인다

import Foundation

//균형잡힌 괄호 문자열 구하기
func getBalancedIndex(_ w: String) -> Int{
    var count = 0  //왼쪽 괄호의 개수
    
    var index = 0
    for i in 0..<w.count {
        let startIndex = w.index(w.startIndex, offsetBy: i) //시작부터 i까지의 인덱스
        let endIndex = w.index(after: startIndex)   //startIndex의 바로 다음 인덱스
        
        if String(w[startIndex..<endIndex]) == "(" {
            count += 1
        } else {
            count -= 1
        }
        
        if count == 0 {
            index = i
            return index
        }
    }
    return index
}

func checkProper(_ u: String) -> Bool {
    var count = 0  //왼쪽 괄호의 개수
    var proper = true
    
    var index = 0
    for i in 0..<u.count {
        let startIndex = u.index(u.startIndex, offsetBy: i) //시작부터 i까지의 인덱스
        let endIndex = u.index(after: startIndex)   //startIndex의 바로 다음 인덱스
        
        if String(u[startIndex..<endIndex]) == "(" {
            count += 1
        } else {
            if count == 0 { //올바르지 않은 경우
                proper = false
            }
            count -= 1
        }
        
    } 
    return proper
}

func solution(_ p: String) -> String {
    var answer = ""
    let w = p
    if w == "" {
        return answer
    }
    
    //균형잡힌 괄호 문자열의 index 구하기 -> Int값을 가져옴
    let bIndex = getBalancedIndex(w)
    
    let balancedIndex = w.index(w.startIndex, offsetBy: bIndex)
    let u = String(w[...balancedIndex])     //균형잡힌 괄호 문자열
    let v = String(w[w.index(after: balancedIndex)...])
    
    //u가 올바른 괄호 문자열인 경우
    if checkProper(u) {
        answer = u + solution(v)
    } else {    //u가 올바른 괄호 문자열이 아닌 경우
        answer += "("
        answer += solution(v)
        answer += ")"
        //u의 첫번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙인다
        //print(String(u[u.index(u.startIndex)...u.index(u.endIndex)]))
    }
    
    return answer
}

다른 사람들의 풀이를 보니
prefix와 suffix를 사용했다

 let str = "1.asd"
 let findIdx:String.Index = str.firstIndex(of: ".")! //원하는 지점을 정해서
 print("\(str[findIdx...])") // 원하는 지점부터 끝까지 .asd를 출력
 print("\(str.prefix(3))")//앞에서 3개만 보여줘 1.a출력
 print("\(str.suffix(3))")//뒤에서 3개만 보여줘 asd 출력
 
 
 let array = [1, 5, 2, 6, 3, 7, 4]
print(array.suffix(2))          //뒤에서 2개 [7, 4]
print(array.suffix(from: 1))    //1번째자리부터 [5, 2, 6, 3, 7, 4]
print(array.prefix(4))          //앞에서 4개 [1, 5, 2, 6]

suffix 접미사
prefix 접두사

let numbers = [10, 20, 30, 40, 50, 60]
if let i = numbers.firstIndex(of: 40) {
    print(numbers.suffix(from: i))
    print(numbers[i...])
}
// [40, 50, 60]
// [40, 50, 60]


let numbers = [10, 20, 30, 40, 50, 60]
if let i = numbers.firstIndex(of: 40) {
    print(numbers.prefix(upTo: i))
    print(numbers[...i])
}
// [10, 20, 30]
profile
인생노잼

0개의 댓글