250x250
반응형
05-12 21:18
Today
Total
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Notice
Recent Posts
Recent Comments
Link
Archives
관리 메뉴

Bill Kim's Life...

[Swift] 프로그래머스 연습 문제(Level 2) : 올바른 괄호 본문

CS(컴퓨터 과학)/Coding Test

[Swift] 프로그래머스 연습 문제(Level 2) : 올바른 괄호

billnjoyce 2022. 3. 29. 11:32
728x90
반응형
실제 코딩테스트의 문제를 통하여 알고리즘 분석과 코딩 능력을 향상시킵니다.

 

 

#. 구독 대상

  • 기본 알고리즘을 코딩 테스트 문제를 통하여 학습하고 싶으신 분
  • 취업 및 이직을 준비하고 계신 개발자
  • Swift를 통하여 코딩 테스트 문제를 살펴보고 이해를 하고 싶으신 분
  • 코딩 테스트에 대한 거부감을 없애기 위하여 기초부터 하나씩 공부해보고 싶으신 분
  • 기타 알고리즘과 문제 해결 능력에 대해서 관심이 있는 모든 개발자분
참고 사항

본 코딩 테스트 문제에 대한 설명 및 해결 방안은 최적의 답이 아닐 수 있습니다.

본 강의에서 지향하는 목표는 바로 특정 문제에 대한 최적의 해결 방법을 찾기보다는 특정한 문제에 대해서 충분히 이해할 수 있고 다양한 방법을 통하여 해결하는 방법을 찾고 향상시키는데 그 목적이 있습니다.

좀 더 좋은 알고리즘 및 코드가 있으시다면 언제든지 본 게시물의 댓글을 통해서 제시해주시면 감사하겠습니다.

 

 

 


 

 

 

코딩 테스트 문제

 

먼저 오늘 살펴볼 문제에 대해서 먼저 살펴보겠습니다.

 

https://programmers.co.kr/learn/courses/30/lessons/12909#_=_

 

코딩테스트 연습 - 올바른 괄호

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어 "()()" 또는 "(())()" 는 올바른 괄호입니다. ")()(" 또는 "(()(" 는 올바르지 않은

programmers.co.kr

 

 

 

 


 

 

 

문제 설명

 

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

  • "()()" 또는 "(())()" 는 올바른 괄호입니다.
  • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

 

 

 

 


 

 

 

제한 조건

 

  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

 

 

 

 


 

 

 

 

입출력 예

s answer
"()()" true
"(())()" true
")()(" false
"(()(" false

 

 

 

 


 

 

문제 분석

 

오늘 문제는 열리고 닫힘 괄호 문자열을 입력받아 시작이 열림 괄호로 시작하며 열림 괄호와 닫힘 괄호가 서로 쌍이 맞는지 체크하여 올바른 괄호인지 아닌지 반환하는 문제입니다.

 

 

 

 

 


 

 

 

알고리즘

 

그렇다면 본 문제를 해결하기 위한 알고리즘을 하나씩 살펴보면 아래와 같습니다.

 

 

  • 괄호가 열리고 닫힌 카운트를 계산할 정수형 변수를 선언한다.
  • 문자열에서 문자 하나씩 체크하여 괄호 상태를 확인한다.
  • 열림 괄호일 경우 괄호 카운트를 하나 증가시킨다.
  • 괄호 카운트가 0이면서 닫힘 괄호이면 괄호 카운트를 감소시킨다.
  • 닫힘 괄호일 경우 괄호 카운트를 하나 감소시킨다.
  • 괄호 카운트가 0보다 작으면 올바른 괄호가 아니므로 반복문을 종료한다.
  • 괄호 카운트가 0이면 올바른 괄호이므로 참(true)을 반환하고 아니라면 거짓(false)을 반환한다.

 

 

 

 

 


 

 

 

코드 설명

 

그렇다면 위의 알고리즘에 대해서 하나씩 살펴보면서 코드로 작성을 해보도록 하겠습니다.

 

 

  • 괄호가 열리고 닫힌 카운트를 계산할 정수형 변수를 선언한다.
var count = 0

 

  • 문자열에서 문자 하나씩 체크하여 괄호 상태를 확인한다.
for c in s {

}

 

  • 열림 괄호일 경우 괄호 카운트를 하나 증가시킨다.
  • 괄호 카운트가 0이면서 닫힘 괄호이면 괄호 카운트를 감소시킨다.
  • 닫힘 괄호일 경우 괄호 카운트를 하나 감소시킨다.
for c in s {
    if c == "(" {
        count += 1
    } else if c == ")" && count <= 0 {
        count -= 1
    } else {  
        count -= 1
    }
}

 

  • 괄호 카운트가 0보다 작으면 올바른 괄호가 아니므로 반복문을 종료한다.
for c in s {
    ...
    
    if count < 0 {
        break
    }
}

 

  • 괄호 카운트가 0이면 올바른 괄호이므로 참(true)을 반환하고 아니라면 거짓(false)을 반환한다.
return count == 0 ? true : false

 

 

 

 

 

 

위의 코드들을 모두 조합하여 최종 코드를 완성하면 아래와 같습니다.

 

 

최종 코드

import Foundation

func solution(_ s:String) -> Bool
{
    // 괄호가 열리고 닫힌 카운트를 계산할 정수형 변수를 선언한다.
    var count = 0
    
    // 문자열에서 문자 하나씩 체크하여 괄호 상태를 확인한다.
    for c in s {
        // 열림 괄호일 경우 괄호 카운트를 하나 증가시킨다.
        if c == "(" {
            count += 1
        // 괄호 카운트가 0이면서 닫힘 괄호이면 괄호 카운트를 감소시킨다.    
        } else if c == ")" && count <= 0 {
            count -= 1
        // 닫힘 괄호일 경우 괄호 카운트를 하나 감소시킨다.    
        } else {  
            count -= 1
        }
        
        // 괄호 카운트가 0보다 작으면 올바른 괄호가 아니므로 반복문을 종료한다.
        if count < 0 {
            break
        }
    }
    
    // 괄호 카운트가 0이면 올바른 괄호이므로 참(true)을 반환하고 아니라면 거짓(false)을 반환한다.
    return count == 0 ? true : false
}

 

 

 

 

 


 

 

 

이상으로 오늘 제시한 문제에 대해서 분석 및 코드를 작성해 보았습니다.

 

감사합니다.

 

 

 

 


[참고 자료(References)]

 

 

[1] 프로그래머스 - 올바른 괄호 : https://programmers.co.kr/learn/courses/30/lessons/12909#_=_

728x90
반응형
Comments