[백준] 9938 - 방청소

2021. 5. 5. 22:17·알고리즘 (PS)/BOJ
반응형

www.acmicpc.net/problem/9938

 

9938번: 방 청소

처음 6개의 술은 규칙 1에 의해서 1, 3, 5, 7, 9, 2번 서랍에 보관할 수 있다. 7번째 술은 규칙 3을 적용할 수 있다. 1번 서랍에 들어있는 술을 2로, 2번 서랍에 들어있는 술을 3으로, 3번 서랍에 들어있

www.acmicpc.net

학교에서 분리집합 스터디 이후 연습문제로 풀게된 문제이다.

난이도는 solved.ac 기준 플레티넘3 이다.

분리집합이라는 아이디어를 갖고 시작할 수 있다면 난이도는 골드 수준으로 내려갔을 것 같다.

 

문제 설명을 읽어보면 복잡하다.

술을 서랍에 정리하는 순서가 다음처럼 나와있다.

 

  1. 서랍 Ai가 비어있다면, i번 술을 그 서랍에 보관한다.
  2. 서랍 Bi가 비어있다면, i번 술을 그 서랍에 보관한다.
  3. Ai에 들어있는 술을 다른 서랍으로 이동시킨다.(다른 서랍은 Ai에 들어있는 술이 들어갈 수 있는 서랍 중 하나이다) 만약, 그 서랍에도 이미 술이 들어있다면, 그 술을 다른 서랍으로 이동시킨다. 이런 과정을 거쳐서 빈 서랍을 하나 찾아 술을 모두 이동할 수 있는 경우에는, 술을 이동시키고 i번 술을 Ai에 보관한다. 불가능한 경우에는 다음 규칙으로 넘어간다.
  4. Bi에 들어있는 술을 다른 서랍으로 이동시킨다. 만약, 그 서랍에도 이미 술이 들어있다면, 그 술을 다른 서랍으로 이동시킨다. 이런 과정을 거쳐서 빈 서랍을 하나 찾아 술을 모두 이동할 수 있는 경우에는, 술을 이동시키고 i번 술을 Bi에 보관한다. 불가능한 경우에는 다음 규칙으로 넘어간다.
  5. 위의 과정이 모두 불가능한 경우에는 i번 술을 그 자리에서 마셔버린다. (은기는 전혀 취하지 않는다)

겉보기에는 복잡해보인다.

하지만 분리집합이라는 자료구조를 사용하면 이 문제는 그냥 분리집합 구현문제가 되어버린다.

아이디어는 간단하다.

저 1, 2, 3, 4 라는 과정의 순서를 생각하지 않고, 읽어보면 다음과 같은 것을 의미한다.

 

i 번째 술이 들어갈 수 있는 서랍 Ai 와 Bi 에 대해서

서랍 Ai가 속한 집합과 서랍 Bi가 속한 집합에 술병을 넣을 수 있다면 넣는다.

 

그냥 퉁쳐서 하나의 집합처럼 생각해도 되는 이유는,

서랍과 서랍이 술을 매개로 연결되어있다고 생각하면

해당 집합에 빈 공간이 있을 경우 3번, 4번 과정을 통해서 연쇄적으로 술을 이동시킬 수 있기 때문에

빈 공간에 술을 집어넣는 것이 반드시 가능하기 때문이다.

 

따라서 이 문제는 Ai, Bi를 입력받은 후,

Ai, Bi를 하나의 집합으로 합치고 (merge / union)

해당 집합에 최대 사이즈와 현재 사이즈를 재서 (find & size check)

술병이 들어갈 수 있으면 사이즈를 늘리고 LADICA를 출력한다.

만약 해당 집합의 최대 사이즈와 현재 사이즈가 같다면

SMECE를 출력하고 넘어간다.

 

정답 코드는 다음과 같다.

# 9938 방청소
import sys
def find(a):
    if a == disjointSet[a]:
        return a

    disjointSet[a] = find(disjointSet[a])
    return disjointSet[a]

def merge(a, b):
    a = find(a)
    b = find(b)
    if a == b:
        return
    if maxSize[a] < maxSize[b]:
        a, b = b, a
    disjointSet[b] = a
    maxSize[a] += maxSize[b]
    nowSize[a] += nowSize[b]
    maxSize[b] = 0
    nowSize[b] = 0

input = sys.stdin.readline
n, m = map(int, input().split())
disjointSet = [i for i in range(m+1)]  # i번째 요소의 루트(속한 집합의 루트)는 [i]
maxSize = [1 for i in range(m+1)]
nowSize = [0 for i in range(m+1)]
for i in range(n):
    a, b = map(int, input().split())
    merge(a, b)
    if nowSize[find(a)] < maxSize[find(a)]:
        nowSize[find(a)] += 1
        print("LADICA")
    else:
        print("SMECE")

#print(disjointSet)

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 (PS) > BOJ' 카테고리의 다른 글

[백준] 1005 - ACM Craft  (0) 2021.06.29
[백준] 17298 - 오큰수 (재귀 풀이)  (0) 2021.06.22
[백준] 5719 - 거의 최단 경로  (0) 2021.04.17
[백준] 2662 - 기업 투자  (0) 2021.04.06
[백준] 17371 - 이사  (0) 2021.03.30
'알고리즘 (PS)/BOJ' 카테고리의 다른 글
  • [백준] 1005 - ACM Craft
  • [백준] 17298 - 오큰수 (재귀 풀이)
  • [백준] 5719 - 거의 최단 경로
  • [백준] 2662 - 기업 투자
에버듀
에버듀
개발은 좋은데 뭘로 개발할까
  • 에버듀
    Blog. 에버듀
    에버듀
  • 전체
    오늘
    어제
    • 분류 전체보기 (614)
      • 개인 프로젝트 (43)
        • 토이 프로젝트 (3)
        • [2020] 카카오톡 봇 (9)
        • [2021] 코드악보 공유APP (22)
        • [2022] 유튜브 뮤직 클론코딩 (9)
        • [2025] 한글 SQL 데이터베이스 (0)
      • 팀 프로젝트 (22)
        • [2020] 인공지능 숫자야구 (4)
        • [2022] OSAM 온라인 해커톤 (10)
        • [2024] GDSC 프로젝트 트랙 (6)
        • [2025] 큰소리 웹 페이지 (2)
      • CS (335)
        • 자료구조 (19)
        • 어셈블리 (41)
        • 멀티미디어응용수학 (7)
        • 컴퓨터 구조 (29)
        • 알고리즘 분석 (4)
        • 컴퓨터 네트워크 (38)
        • 프로그래밍언어론 (15)
        • HCI 윈도우즈프로그래밍 (26)
        • 기초데이터베이스 (29)
        • 운영체제 (23)
        • 오토마타 (24)
        • 문제해결기법 (11)
        • 블록체인 (22)
        • 소프트웨어공학 (21)
        • 기계학습심화 (12)
        • 컴퓨터그래픽스와 메타버스 (8)
        • 분산시스템특론 (6)
      • 자기계발 (44)
        • 생각 정리 (22)
        • 대외활동 (11)
        • 동아리 (7)
        • 자격증 (3)
        • 머니 스터디 (1)
      • 알고리즘 (PS) (107)
        • BOJ (101)
        • Programmers (5)
        • 알고리즘 이모저모 (1)
      • WEB(BE) (8)
        • express.js (1)
        • Spring & Spring Boot (7)
      • WEB(FE) (2)
        • html, css, js (1)
        • React.js (1)
      • Tool & Language (6)
        • Edit Plus (1)
        • Git (1)
        • Python3 (2)
        • Java (2)
      • Infra (12)
        • AWS (1)
        • Oracle Cloud (8)
        • Firebase (2)
        • Network (1)
      • Android (18)
        • Java (6)
        • Flutter (12)
      • Window (2)
        • Visual Studio 없이 WPF (1)
        • MFC (1)
      • 독서 (14)
        • Inside Javascript (7)
        • Database Internals (6)
        • 한 글 후기 (1)
  • 링크

    • github
    • website
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
에버듀
[백준] 9938 - 방청소
상단으로

티스토리툴바