[그리디]백준 2810 컵홀더 | 파이썬 풀이

주마등 코더·2021년 7월 15일
0

문제 링크

https://www.acmicpc.net/problem/2810


1. 문제 해석

영화관에 일반석과 커플석이 섞여있는 한 줄의 좌석들이 있는데, 일반석은 컵홀더가 양쪽에 있지만 커플석은 두 자리 사이에 컵홀더가 없다고 한다.

일반석 : S
커플석 : LL
컵홀더 : *

이라고 할 때, 일반석은 *S* 커플석은 *LL* 이렇게 있는 것이다.
이런 차이 때문에 모든 사람이 컵홀더를 사용하지 못 할 수도 있는데, LLLL 라는 예시를 보면 사람은 네명이지만 컵홀더는 *LL*LL*로 총 세개이다.
이렇게 입력으로 한 줄의 좌석 정보가 주어지면 컵홀더를 이용할 수 있는 최대 사람 수를 구하는 문제이다.

2. 문제 풀이

문제를 보자마자 든 생각이 S와 LL의 갯수에 따라서 컵홀더를 이용할 수 있는 사람의 수가 규칙적일 것이라는 생각이 들어서 여러가지 예시를 들어봤다.

SSSS일 때는 모든 사람이 이용할 수 있으니 좌석의 갯수가 곧 정답이다.
LLLL일 때는 컵홀더가 총 3개이고, LLLLLL일 때는 4가 정답이다. 이 규칙으로는 LL을 한 쌍으로 보았을 때 LL의 갯수 + 1이 정답이 된다.

위의 결과에 따라 S와LL이 섞여있을 때도 이 규칙이 적용되는지 확인하기 위해 LLLLLLS, SLLLLLLLLSSLL 등의 예시를 들어서 계산해 보았을 때 마찬가지로 적용이 되어서 코드에 적용하기로 결정했다.

처음 작성한 코드이다.

N = int(input())
Seats = input()
countS = 0
countL = 0
ans = 0

for i in range(0, N):
    # 좌석 정보 카운트
    if Seats[i] == 'S':
        countS += 1
    else:
        countL += 1

# 커플석이 있을 때에만
if countL > 0:
    ans += int(countL/2) + 1
ans += countS

print(ans)

Seats 변수에 좌석정보를 담아서, 문자열을 0인덱스부터 차례차례 확인하면서 count변수에 구분해서 담았다. 따라서 S의 갯수와 L의 갯수가 담길텐데 발견한 규칙으로는 LL이 관련이 있으므로 L의 갯수의 절반을 적용한 후 +1을 해줘야 했다.

주의할 점으로는 LL이 없을 때에는 ans에 countL에 관한 연산을 넣어주지 말아야 한다는 것인데, 이것을 고려하지 않고 항상 ans += int(countL/2) + 1을 넣었다가 96%에서 채점이 자꾸 틀리는 현상 때문에 화가 많이 났었다.

이 이유는 간단하다. 입력으로
1
S
가 주어졌다면 countS : 1, countL : 0이 들어갔을 텐데, ans에 int(countL/2) + 1를 넣는 순간 0/2 + 1이 더해지기 때문에 LL이 없는데도 LL에 관한 연산이 들어가는 것이다. 따라서 countL이 0 이상일 때에만 ans에 추가해준다.

파이썬에 능숙한 사람들이라면 저 코드가 불편할 수도 있다. 이유는 문자열을 다루는 방법 때문인데, 나는 자바에서 문자열을 저렇게 다뤄왔어서 이 방법 외에는 생각하지 못했었다. 문제를 풀고 다른 사람의 코드를 훔쳐봤는데 파이썬에는 아주 편리한 문자열 관련 함수가 내장되어 있었다.

바로 문자열.count() 함수였다. 예를 들어 위의 코드에서 for문을 돌 필요 없이, Seats.count('LL')를 사용하면 바로 'LL'이 Seats문자열 안에 몇번 사용되었는지 반환해주는 함수였다. 따라서 더 간편한 코드를 작성해보았다.

N = input()
Seats = input()
ans = 0

# 좌석 정보 카운트
countL = Seats.count('LL')
countS = Seats.count('S')

# 커플석이 있을 때에만
if countL > 0:
    ans += countL+1
ans += countS

print(ans)

이렇게 반복문없이 좀 더 간단하고 보기 좋은 코드로 만들어보았다.
편리한 문자열 관리와 간결한 코드 구성이 가능한 파이썬의 매력을 느낄 수 있는 시간이었다.

profile
스쳐지나가기 전에 기록하는 중

0개의 댓글

관련 채용 정보