본문 바로가기
파이썬/파이썬 알고리즘

파이썬 백준 2810번 컵홀더

by Go! Jake 2021. 2. 10.

문제

극장의 한 줄에는 자리가 N개가 있다. 서로 인접한 좌석 사이에는 컵홀더가 하나씩 있고, 양 끝 좌석에는 컵홀더가 하나씩 더 있다. 또, 이 극장에는 커플석이 있다. 커플석 사이에는 컵홀더가 없다.

극장의 한 줄의 정보가 주어진다. 이때, 이 줄에 사람들이 모두 앉았을 때, 컵홀더에 컵을 꽂을 수 있는 최대 사람의 수를 구하는 프로그램을 작성하시오. 모든 사람은 컵을 한 개만 들고 있고, 자신의 좌석의 양 옆에 있는 컵홀더에만 컵을 꽂을 수 있다.

S는 일반 좌석, L은 커플석을 의미하며, L은 항상 두개씩 쌍으로 주어진다.

어떤 좌석의 배치가 SLLLLSSLL일때, 컵홀더를 *로 표시하면 아래와 같다.

*S*LL*LL*S*S*LL*

위의 예에서 적어도 두 명은 컵홀더를 사용할 수 없다.

입력

첫째 줄에 좌석의 수 N이 주어진다. (1 ≤ N ≤ 50)

둘째 줄에는 좌석의 정보가 주어진다.

출력

컵을 컵홀더에 놓을 수 있는 최대 사람의 수를 출력한다.

풀이 과정

- LL이 더해졌을 때 어떤 변화가 있는 지 주목한다.

- LL이 더해지면 중간 컵 홀더가 하나 사라지므로 최대 컵홀더 개수에서 -1씩 된다.

- S로만 구성되어 있다면 컵홀더의 개수는 N+1개이다. 좌석보다 1개 남는다. LL 구조가 나오면 이 값에서 -1씩 된다.

- 구하고자 하는 답은 컵을 컵홀더에 놓을 수 있는 "최대 사람의 수"이다. 컵홀더 개수가 아니라 사람 수이다. 따라서 출력의 최댓값은 사람의 수가 된다.

풀이 - 1

N=int(input())
seat=input()

L=0
S=0

for i in seat:
    if i=="L":
        L+=1 
    else: 
        S+=1 
result=min((int(N+1-L/2),N)) 

N=int(input())

input()으로 입력되는 값을 문자열로 표출한다. 입력을 int()을 통해 정수형으로 만든다.

seat=input()

의자 정보를 입력 받는다. 문자열로 입력받고, 해당하는 문자열의 개수를 셀 것이다.

for i in seat:

if i=="L":

L+=1

else:

S+=1

"for i in seat:" 구조 사용 시 seat에 해당하는 문자열을 하나하나 꺼낸다. 예를 들어 seat=SSLL이면, i= S, S, L, L 이런식이다.

따라서 L과 S의 개수를 각각 세어준다. 이는 추후 컵홀더 최대 개수 계산에 쓰일 것이다.

result=min((int(N+1-L/2),N))

컵홀더의 개수는 N+1-L/2로 계산하면 최대 컵홀더의 개수가 된다. 다만 이 때 우리가 출력하고자 하는 것은 사람의 수이기 때문에, 출력 값은 사람의 수를 넘을 수 없다. 따라서 min 함수를 사용해서 N보다 작거나 같을 때만 표출하도록 하자.

풀이 - 2

from collections import Counter
N=int(input())
seat=input()

counter_1 = Counter(seat)
result=N+1-int(counter_1["L"]/2)

print(min(result,N))

from collections import Counter

collections에서 Counter라는 함수를 사용하였다. 알고리즘 문제 풀이에서 굉장히 많이 쓰이는 함수이다.

counter_1=Counter(seat) 처리를 해 주면, seat에 포함된 여러가지 값에 대해 개수를 셀 수 있다.

예를 들어, counter_1["L"]을 사용하면 L 문자열에 대한 개수 값이 나오게 된다.

 

댓글