-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
🙋🏼 문제
💡 풀이
우선적으로 따져야 할 것 리스트를 정리했다.
- "("이 먼저 시작하는가? ")"이 마지막에 위치하는가?
- "("의 개수 == ")"의 개수
- "("가 있을 때 카운트가 하나씩 증가하고, ")"가 있을 때 카운트를 하나씩 지우면 되지 않을까?
뭔가 고등 수학 중에 확률과 통계에서 비슷한 문제를 봤던 것 같아서 거기서 해결책을 떠올림
| var string = s.map { String($0) } |
String 값을 배열에 하나씩 넣기 위해서 map을 사용했다.
| var openCount : Int = 0 |
coding_test_practice/coding_test_practice/240627_12909.swift
Lines 17 to 27 in 842a67e
| 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번에서 언급한 "("이 먼저 시작하는가?를 판단해주는 요소가 없었기 때문에 통과하지 못했다.
| var isStartOpen : Bool = true |
coding_test_practice/coding_test_practice/240627_12909.swift
Lines 17 to 27 in 842a67e
| string.forEach { | |
| if $0 == "(" { | |
| openCount += 1 | |
| } else if $0 == ")" { | |
| if openCount != 0 { | |
| openCount -= 1 | |
| } else { | |
| isStartOpen = false | |
| } | |
| } | |
| } |
때문에 isStartOpen이라는 Bool 값을 이용해서 "("로 시작하는지를 판단해 주었다. ")"가 등장했을 때 카운트를 하나씩 줄이는데, openCount가 0일 때 ")"가 등장하면 안되기 때문에 false로 전환해주었다.
(사실 이건 처음에 "("로 시작해주는지를 판단해줄 뿐만 아니라 "())(()" 이런 상황처럼 "("가 등장하지 않았는데 ")"가 먼저 등장하는 경우도 방지한다.)
coding_test_practice/coding_test_practice/240627_12909.swift
Lines 29 to 33 in 842a67e
| if isStartOpen { | |
| ans = openCount == 0 ? true : false | |
| } else { | |
| ans = false | |
| } |
isStartOpen이 true일 때만 앞서 말한 삼항연산자의 연산을 할 수 있도록 해결했다.