문제
극장의 한 줄에는 자리가 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 문자열에 대한 개수 값이 나오게 된다.
'파이썬 > 파이썬 알고리즘' 카테고리의 다른 글
파이썬 백준 2439번 별 찍기 - 2 (0) | 2021.02.12 |
---|---|
파이썬 백준 10871번 X보다 작은 수 (0) | 2021.02.12 |
백준 solved.ac 사용하여 난이도 정보 표시하기 (0) | 2021.02.11 |
파이썬 백준 10952번 A+B - 5 0 0이 들어올 때까지 A+B를 출력하는 문제 (0) | 2021.02.11 |
파이썬 백준 2839번 설탕 배달 (0) | 2021.02.11 |
댓글