ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 5002. [Python]도어맨
    Python_알고리즘/Silver II 2023. 8. 27. 21:02

    1. 문제

     

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

     

    5002번: 도어맨

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

    www.acmicpc.net

     

    2. 접근 방법

     

    • 시간 제한: 1초
    • 메모리 제한: 128MB
    • 구현
    • 큐(queue / 덱)

     

    3. 파이썬 코드

     

    from collections import deque
    
    N = int(input())
    
    words = deque(map(str,input()))
    
    m_cnt = 0
    w_cnt = 0
    
    while words:
        # 리스트 값을 왼쪽부터 뽑으면서
        check = words.popleft()
        # 남자면 m_cnt 1 증가
        if check == "M":
            m_cnt += 1
        # 여자면 w_cnt 1 증가
        elif check == "W":
            w_cnt += 1
        # 만약 두 값의 차가 N 보다 큰 경우
        if max(m_cnt, w_cnt) - min(m_cnt, w_cnt) > N:
            # 리스트가 존재하면
            if words:
                # 값을 한개 더 뽑아본다
                middle_check = words.popleft()
                # m_cnt 값이 w_cnt 값보다 큰 경우
                if m_cnt > w_cnt:
                    # m_cnt 값이 위에서 증가됐기 때문에 1 뺀다
                    m_cnt -= 1
                    # 한개 더 뽑은 값이 W 인 경우
                    if middle_check == "W":
                        # w_cnt 값 1 증가
                        w_cnt += 1
                        # M 값이였던 check 값을 리스트에 왼쪽에 더해줌
                        words.appendleft(check)
                    # M 인 경우 반복문 종료
                    else:
                        break
                # m_cnt 값이 w_cnt 값보다 작은 경우
                elif m_cnt < w_cnt:
                    # w_cnt 값 -1
                    w_cnt -= 1
                    # 한개 더 뽑은 값이 M 인 경우
                    if middle_check == "M":
                        # m_cnt 값 1 증가
                        m_cnt += 1
                        # check 값을 리스트에 왼쪽 값에 증가
                        words.appendleft(check)
                    else:
                        break
            # 리스트가 없으면
            else:
                # N 값보다 컸을 때 경우이기 때문에
                if m_cnt > w_cnt:
                    # 뽑은 값이 M 이였으면 +1 을 해줬기 떄문에 -1
                    if check == "M":
                        m_cnt -= 1
                elif m_cnt < w_cnt:
                    # 뽑은 값이 W 였으면 +1 을 해줬기 때문에 -1
                    if check == "W":
                        w_cnt -= 1
                break
    # 반복문이 끝나면 계산한 여자와 남자들이 들어간 갯수 더해줌
    print(w_cnt + m_cnt)

     

    4. 문제를 풀고난 후 생각

     

    • 큐와 구현을 통해서 문제에 조건에 맞도록 구현하는 문제로 여자와 남자의 들어오는 명수를 각자 세어주고 조건에 맞도록 개수를 계산하여 마지막에 총합 값을 나타낸다.
    • 리스트의 젤 왼쪽값을 이용해야 하기 때문에 pop(0) 보다는 deque 를 사용하여 시간 복잡도를 줄였고, 여자와 남자의 차가 N보다 큰 경우 에서 리스트에 값이 있는 경우 없는 경우를 체크해서 문제를 풀어줬다.
    • 리스트 앞에서 2번째 값까지 확인해야 했고, 이러한 경우의 수를 조건으로 다 처리해줘서 문제를 해결했다.

    예를 들어

     

    더보기


    1
    WWMMW

    라는 값이 올때를 생각해보면

    1. 처음 값이 W 나오고 w_cnt 값이 1 증가   => 현재 리스트 : WMMW / w_cnt = 1 / m_cnt = 0

    2. 다음 값으로 W 나오고 w_cnt 값이 1 증가 하면 w_cnt - m_cnt 값이 1 을 넘기 때문에 이때 다음 값을 뽑아서 M 인지 W인지 확인해본다. 다음 값이 M 이므로 W 대신 M을 뽑아 w_cnt  -1 해준 후 m_cnt + 1 해주고 W 값을 리스트에 다시 넣어준다.

     

    현재 리스트 : WMW  / w_cnt = 1 / m_cnt = 1

     

    3. W 값을 뽑아 별다른 조건이 없으므로 w_cnt 값 1 증가 => 현재 리스트 : MW / w_cnt = 2 / m_cnt = 1

    4. M 값을 뽑아 m_cnt 값 증가 => 현재 리스트 : W / w_cnt = 2 / m_cnt = 2

    5. W 값 뽑아 w_cnt 값 증가 => 현재 리스트 : [] / w_cnt = 3 / m_cnt = 2

     

    이렇게 다 뽑고난 후 w_cnt + m_cnt 한 값을 결과로 출력

     

    5. 문제를 푸는데 도움이 되는 지식

     

    • 큐, 덱

    'Python_알고리즘 > Silver II' 카테고리의 다른 글

    18870. [Python]좌표 압축  (0) 2023.09.04
    2644. [Python]촌수계산  (0) 2023.09.04
    1012. [Python]유기농 배추  (0) 2023.08.19
    1564. [Python]팩토리얼5  (0) 2023.08.13
    5397. [Python]키로거  (0) 2023.08.11

    댓글

Designed by Tistory.