BOJ-10799, 쇠막대기
문제 📑
https://www.acmicpc.net/problem/10799
문제 정리 ▾
- 괄호로 된 문자열을 입력받는다.
- 연이어 나오는 괄호 한 쌍은"()" 레이저를 의미한다.
- 괄호가 연이어 나오지 않는 경우 쇠막대기로 간주하고, 쇠막대기 사이에 있는 레이저로 쇠막대기를 절단할 때, 절단된 쇠막대기의 총개수를 출력하면 된다.
접근 🚶🏻
나의 생각 ▾
- 문제를 바로 이해했지만 도저히 어떻게 풀어야 할지 감이 안 잡혔다.
- "("가 나올 때 그다음에도 "("가 나오는지 ")"가 나오는지 판별해야겠다는 생각은 있었지만, 그 후 어떻게 값을 누적시켜야 할지 몰랐다.
- 다른 분의 코드를 참고한 뒤, 다시 문제를 풀어보았다.
나의 해결 ▾
func solution() {
let input = readLine()!.map{String($0)}
var count: Int = 0
var result: Int = 0
for i in 0..<input.count {
switch input[i] {
case "(":
count += 1
default:
count -= 1
if input[i-1] == "(" {
result += count
} else {
result += 1
}
}
}
print(result)
}
solution()
- 코드에 관한 내용은 밑에서 살펴보자 😀
코드 리뷰 ▾
let input = readLine()!.map{String($0)}
var count: Int = 0
var result: Int = 0
- 입력받을 input 변수 선언
- 쇠막대기의 개수를 누적시킬 count 변수 선언
- 총쇠막대기의 개수를 누적시킬 result 변수 선언
for i in 0..<input.count {
switch input[i] {
case "(":
count += 1
default:
count -= 1
if input[i-1] == "(" {
result += count
} else {
result += 1
}
}
}
- for문
- String형 변수 input을 하나하나 접근
- switch문
- input[i]가 어떤 문자인지 체크를 한다.
- Case 1
- "("이면 count + 1 (쇠막대기 개수)
- Default
- ")"이면 레이저일 수 있으니 count - 1 (레이저 고려)
- If
- ")" 나오기 전이 "(" 일 경우 레이저이므로, 쇠막대기 절단이라고 판단한다.
- 레이저인지 아닌지를 판별하는 부분이라고 보면 된다.
- else
- ")" 나오기 전 값도 ")" 일 경우이다.
- 레이저가 아닌 쇠막대기이므로, 쇠막대기의 개수 하나를 증가시킨다.
Addtional 📂
- 여러 개의 쇠막대기를 누적시킬 방안이 도저히 생각이 나질 않았었다.
- 오늘도 하나 배워갔다 🥲
'Algorithm.zip' 카테고리의 다른 글
[Swift]BOJ-11726 (0) | 2022.02.07 |
---|---|
[Swift]BOJ-17298 (0) | 2022.02.05 |
[Swift]BOJ-17413 (0) | 2022.02.03 |
[Swift]BOJ-10845 (0) | 2022.02.02 |
[Swift]BOJ-1406 (0) | 2022.02.01 |