Skip to content

올바른 괄호 #12909 #1

@chaentopia

Description

@chaentopia

🙋🏼 문제

올바른 괄호

💡 풀이

우선적으로 따져야 할 것 리스트를 정리했다.

  1. "("이 먼저 시작하는가? ")"이 마지막에 위치하는가?
  2. "("의 개수 == ")"의 개수
  3. "("가 있을 때 카운트가 하나씩 증가하고, ")"가 있을 때 카운트를 하나씩 지우면 되지 않을까?

뭔가 고등 수학 중에 확률과 통계에서 비슷한 문제를 봤던 것 같아서 거기서 해결책을 떠올림

var string = s.map { String($0) }

String 값을 배열에 하나씩 넣기 위해서 map을 사용했다.


string.forEach {
if $0 == "(" {
openCount += 1
} else if $0 == ")" {
if openCount != 0 {
openCount -= 1
} else {
isStartOpen = false
}
}
}

openCount를 이용해서 "("가 하나 등장할 때마다 카운트를 하나씩 올려줬고, ")"가 등장할 때마다 카운트를 하나씩 줄여줬다.

ans = openCount == 0 ? true : false

삼항연산자를 사용해서 openCount가 0이 되는 경우, 즉 "(" 개수와 ")"의 개수가 같아졌을 때 true로 반환할 수 있도록 했다.

그러나 이렇게 여기까지만 하면 1번에서 언급한 "("이 먼저 시작하는가?를 판단해주는 요소가 없었기 때문에 통과하지 못했다.


string.forEach {
if $0 == "(" {
openCount += 1
} else if $0 == ")" {
if openCount != 0 {
openCount -= 1
} else {
isStartOpen = false
}
}
}

때문에 isStartOpen이라는 Bool 값을 이용해서 "("로 시작하는지를 판단해 주었다. ")"가 등장했을 때 카운트를 하나씩 줄이는데, openCount가 0일 때 ")"가 등장하면 안되기 때문에 false로 전환해주었다.
(사실 이건 처음에 "("로 시작해주는지를 판단해줄 뿐만 아니라 "())(()" 이런 상황처럼 "("가 등장하지 않았는데 ")"가 먼저 등장하는 경우도 방지한다.)

if isStartOpen {
ans = openCount == 0 ? true : false
} else {
ans = false
}

isStartOpen이 true일 때만 앞서 말한 삼항연산자의 연산을 할 수 있도록 해결했다.

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions