알고리즘 풀이/백준

[백준 5002] 도어맨

mhko411 2021. 6. 14. 15:25
728x90

문제

사람들이 클럽에 입장하기 위해 일렬로 줄 서 있다. 클럽에 입장한 남녀의 차이를 최대 X만큼 둘 수 있다. 기본적으로 줄의 순서대로 사람들을 입장시키지만 남녀의 차이가 X를 넘어가려 한다면 첫 번째 사람대신 두 번째 사람을 먼저 들여보낼 수 있다. 이때 최대 몇 명이 클럽에 입장할 수 있을지 구하라.

 

입력

첫째 줄에 정인이가 기억할 수 있는 가장 큰 차이 X<100이 주어진다. 둘째 줄에는 줄을 서 있는 순서가 주어진다. W는 여성, M은 남성을 나타내며, 길이는 최대 100이다. 가장 왼쪽에 있는 글자가 줄의 가장 앞에 서 있는 사람의 성별이다. 

 

출력

클럽에 있는 사람 수의 최댓값을 출력한다.


접근

첫 번째 사람과 두 번째 사람의 순서를 바꿔서 입장시킬 수 있다는 것을 스택으로 구현하였다. 먼저 POP한 후에 해당 사람을 입장시키려 할 때 차이가 X를 넘어가려면 다시 스택에서 POP하여 두 번째 사람의 성별을 확인한다. 만약 두 번째 사람을 입장시킬 때 X를 초과하지 않는다면 입장시키고 첫 번째 사람을 다시 스택에 PUSH한다.

 

구현

- 스택을 탐색한다.

- 현재 가장 첫 번째에 있는 사람을 꺼내고 성별을 확인한다.

- 해당 성별에 해당되는 변수에 +1을 했을 때 X 이하라면 입장시키고 성별에 +1한다.

- 하지만 스택에 아직 원소가 존재하고 X를 초과한다면 다음 사람을 POP한다.

- 이때 현재 사람의 성별과 반대일 때를 계산하고 현재 사람을 다시 줄에 세운다.

- 하지만 같은 성별이라면 더 이상 입장할 수 없기 때문에 종료한다.

- 만약 스택에 더 이상 사람이 존재하지 않는다면 다음 사람을 확인하지 않고 바로 종료한다.

while stack:
    cur = stack.pop()
    if cur == 'W':
        if abs((woman+1) - man) <= X:
            woman += 1
        elif stack and abs((woman+1) - man) > X:
            next = stack.pop()
            if next == 'M':
                if abs((man+1) - woman) <= X:
                    man += 1
                    stack.append(cur)
            else:
                break
        else:
            break
    else:
        if abs((man+1) - woman) <= X:
            man += 1
        elif stack and abs((man+1) - woman) > X:
            next = stack.pop()
            if next == 'W':
                if ((woman+1) - man) <= X:
                    woman += 1
                    stack.append(cur)
            else:
                break
        else:
            break

전체 코드

import sys
input = sys.stdin.readline

X = int(input())
club_line = input().strip()
stack = []
for p in club_line:
    stack.append(p)

stack = list(reversed(stack))
woman = 0
man = 0

while stack:
    cur = stack.pop()
    if cur == 'W':
        if abs((woman+1) - man) <= X:
            woman += 1
        elif stack and abs((woman+1) - man) > X:
            next = stack.pop()
            if next == 'M':
                if abs((man+1) - woman) <= X:
                    man += 1
                    stack.append(cur)
            else:
                break
        else:
            break
    else:
        if abs((man+1) - woman) <= X:
            man += 1
        elif stack and abs((man+1) - woman) > X:
            next = stack.pop()
            if next == 'W':
                if ((woman+1) - man) <= X:
                    woman += 1
                    stack.append(cur)
            else:
                break
        else:
            break
print(woman + man)

'알고리즘 풀이 > 백준' 카테고리의 다른 글

[백준 11899] 괄호 끼워넣기  (0) 2021.06.15
[백준 12789] 도키도키 간식드리미  (0) 2021.06.14
[백준 17299] 오등큰수  (0) 2021.06.14
[백준 17298] 오큰수  (0) 2021.06.13
[백준 6198] 옥상 정원 꾸미기  (0) 2021.06.11