![2810번: 컵홀더](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdvwg5X%2FbtsBQqIfg5L%2FJm5wuoelMeNQN03yx74H70%2Fimg.png)
![스몰스테핑](https://t1.daumcdn.net/tistory_admin/static/manage/images/r3/default_L.png)
문제 출처 : https://www.acmicpc.net/problem/2810
2810번: 컵홀더
첫째 줄에 좌석의 수 N이 주어진다. (1 ≤ N ≤ 50) 둘째 줄에는 좌석의 정보가 주어진다.
www.acmicpc.net
언어 : Kotlin
문제 설명 :
십년이면 강산이 변한다.
강산이네 동네에 드디어 극장이 생겼고, 강산이는 극장에 놀러갔다. 매점에서 콜라를 산 뒤, 자리에 앉은 강산이는 큰 혼란에 빠졌다. 양쪽 컵홀더를 이미 옆 사람들이 차지했기 때문에 콜라를 꽂을 컵 홀더가 없었기 때문이다. 영화를 보는 내내 콜라를 손에 들고 있던 강산이는 극장에 다시 왔을 때는 꼭 콜라를 컵 홀더에 놓겠다는 다짐을 한 후 집에 돌아갔다.
극장의 한 줄에는 자리가 N개가 있다. 서로 인접한 좌석 사이에는 컵홀더가 하나씩 있고, 양 끝 좌석에는 컵홀더가 하나씩 더 있다. 또, 이 극장에는 커플석이 있다. 커플석 사이에는 컵홀더가 없다.
극장의 한 줄의 정보가 주어진다. 이때, 이 줄에 사람들이 모두 앉았을 때, 컵홀더에 컵을 꽂을 수 있는 최대 사람의 수를 구하는 프로그램을 작성하시오. 모든 사람은 컵을 한 개만 들고 있고, 자신의 좌석의 양 옆에 있는 컵홀더에만 컵을 꽂을 수 있다.
S는 일반 좌석, L은 커플석을 의미하며, L은 항상 두개씩 쌍으로 주어진다.
어떤 좌석의 배치가 SLLLLSSLL일때, 컵홀더를 *로 표시하면 아래와 같다.
*S*LL*LL*S*S*LL*
위의 예에서 적어도 두 명은 컵홀더를 사용할 수 없다.
- 첫째 줄에 좌석의 수 N이 주어진다. (1 ≤ N ≤ 50) 둘째 줄에는 좌석의 정보가 주어진다.
- 컵을 컵홀더에 놓을 수 있는 최대 사람의 수를 출력한다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 128MB
입출력 예 :
입력 | 출력 |
3 SSS |
3 |
4 SLLS |
4 |
9 SLLLLSSLL |
7 |
풀이 :
크게 어려운 문제는 아니다.
적당히 손가는대로 풀었는데 되었기 때문에 내 생각의 흐름과 풀이를 길게 써본다.
좌석의 시작과 끝은 무조건 컵홀더가 존재하고, 좌석 사이에도 컵홀더가 들어간다.
이때, LL 커플석의 사이에는 컵홀더가 없다.
그럼 위의 조건으로 문제의 예시에 컵홀더를 전부 추가해보자.
*S*S*S* === 좌석 수 3 / 컵홀더 수 4
*S*LL*S* === 좌석 수 4 / 컵홀더 수 4
*S*LL*LL*S*S*LL* === 좌석 수 9 / 컵홀더 수 7
첫 예시를 제외하면 출력해야하는 컵홀더의 수는 정확하다.
어차피 좌석수 N은 처음에 주어지기에 컵홀더 수가 더 많더라도 N으로 제한시키면 되는 것.
그러면 예시 1번도 통과된다.
반대로 좌석 수가 많고 컵홀더 수가 적어도 어차피 사용가능한 인원 수를 구하는 것이기에 컵홀더 수를 내면 된다.
이게 예시 3번의 경우.
이후 단순히 좌석 정보를 forEach 시켜 하나씩 읽어들이고 경우에 따라 arrayList에 추가하였다.
char가 'S'라면 arr += "*S"
char가 'L'이면 checker를 확인.
checker가 false면 true로 변경.
checker가 true면 arr += "*LL"을 해주고, checker를 false로 변경.
예시2을 가지고 이 반복을 시행해주면 다음과 같이 나온다.
*S, *LL, *S
조건 중 하나인 좌석의 시작과 끝에 컵홀더를 추가한다. 를 생각해서 마지막에 "*"를 추가한다.
그럼 최종적으론 다음과 같은 배열이 형성된다.
*S, *LL, *S, *
위에서 작성한 *S*LL*S*와 동일하게 나왔다.
이 코드 기준 arr.size는 컵홀더의 수가 된다.
마지막에 좌석 수를 넘기는 컵홀더의 수가 나오면 좌석 수에 맞게 표시만 해주면 끝.
import java.io.BufferedWriter
import java.io.OutputStreamWriter
fun main() = with(System.`in`.bufferedReader()) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val n = readLine().toInt()
val arr = arrayListOf<String>()
var checker = false
readLine().forEach {
if (it == 'S') {
arr += "*S"
}
if (it == 'L') {
if (checker) {
arr += "*LL"
checker = false
} else {
checker = true
}
}
}
arr += "*"
bw.write("${if (arr.size >= n) n else arr.size}")
bw.flush()
bw.close()
}
'백준 > 문제' 카테고리의 다른 글
2857번: FBI (1) | 2023.12.12 |
---|---|
4470번: 줄번호 (0) | 2023.12.12 |
5988번: 홀수일까 짝수일까 (1) | 2023.12.11 |
4458번: 첫 글자를 대문자로 (0) | 2023.12.11 |
11945번: 뜨거운 붕어빵 (0) | 2023.12.11 |
![스몰스테핑](https://t1.daumcdn.net/tistory_admin/static/manage/images/r3/default_L.png)
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!