[백준/Python] 16200번 - 해커톤

2023. 9. 30. 17:18· Algorithm/BaekJoon
import sys
input = sys.stdin.readline

# 팀의 수가 최소
# i번은 팀원 수가 자기 자신 포함 xi명 이하여야함
n = int(input())
xi = [0 for _ in range(n+1)] # xi의 범위는 1<= xi <= n
for v in list(map(int, input().split())):
  xi[v] += 1

result = 0
p = 0 # 사람이 더 들어갈 수 있는 팀에서 필요한 사람 수
for i, v in enumerate(xi): # xi 오름차순 무조건!
  if v == 0:
    continue
  
  if p >= v:
    p -= v # 이전에 사람 들어갈 수 있는 팀으로 자동 배정
    continue

  # xi 내에서 팀 만들기
  v -= p # 이전 팀으로 자동 배정
  p = 0
  result += (v // i)

  # 남은 사람이 있다면
  rest = v % i
  if rest:
    result += 1 # 일단 남은 사람끼리 팀 만들기
    p = i - rest # 사람이 더 들어갈 수 있는 팀에서 필요한 사람 수

print(result)

그리디 문제다. bfs를 즐겨 사용하지 않아서 구현으로 풀었다.

메인 아이디어는 다음과 같다. "같은 xi를 가진 팀원끼리 xi에 맞게 팀을 만든다"

- 같은 xi를 가진 인원 수를 측정하여 저장

- xi를 오름차순 함(부족한 인원수를 상위 xi를 가진 사람들으로만 채울 수 있기 때문. 가장 가까운 xi를 가진 사람일수록 효율적)

 

고민이 됐던 지점은 서로 팀을 만들고 남은 사람들의 처리를 어떻게 구현해야할지 였다.

우선 남은 사람은 팀을 만들고, 그 팀에 몇명을 더 채워넣을 수 있는지를 저장하고 있는 p 변수를 만들었다.

 

그 다음 xi에서 p 만큼 숫자를 빼준 이유는, 팀의 수를 줄이기 위해서는 인원 수가 남는 팀으로 무조건 가야했기 때문이다.

이 식을 넣기 위해 v가 0이거나, v가 p보다 작은 경우의 예외 처리가 필요했다(2개의 if문)

 

시간 복잡도

학생 수는 1 ≤ N ≤ 100,000

for문: O(n)

=> O(n)

 

다른 사람 풀이

- 위 아이디어를 좀 더 간단하게 구현할 수 있다.

xi 배열을 인원수 측정에 사용하지 않고 그냥 입력값 그대로 받아서 오름차순으로 정렬한다.

그리고 그냥 최대 인원 수 대로 끊어서 센다(간단 그잡채ㅋㅋㅋㅋ내 고민이 너무 허무해~)

N = int(input())
X = list(map(int,input().split()))
X.sort()

i, cnt = 0, 0
while i < len(X):
    cnt += 1
    i += X[i]
print(cnt)

 

'Algorithm > BaekJoon' 카테고리의 다른 글

[백준/Python] 1700번 - 멀티탭 스케줄링  (4) 2023.10.01
[백준/Python] 10845번 - 큐  (0) 2023.10.01
[백준/Python] 7785번 - 회사에 있는 사람  (0) 2023.09.30
[백준/Python] 2164번 - 카드 2  (0) 2023.09.30
[백준/Python] 15988번 - 1, 2, 3 더하기 3  (0) 2023.09.29
'Algorithm/BaekJoon' 카테고리의 다른 글
  • [백준/Python] 1700번 - 멀티탭 스케줄링
  • [백준/Python] 10845번 - 큐
  • [백준/Python] 7785번 - 회사에 있는 사람
  • [백준/Python] 2164번 - 카드 2
빵빵0
빵빵0
(아직은) 공부하고 정리하는 블로그입니다.
빵빵0
Hack Your World
빵빵0
전체
오늘
어제
  • 분류 전체보기 (71) N
    • Error Handling (4) N
    • Project (1)
    • Computer Science (4)
      • Data Structure (2)
      • Database (1)
      • Cloud (0)
      • OS (0)
      • Infra, Network (1)
      • AI (0)
    • Language (3)
      • Go (3)
      • Rust (0)
      • Python (0)
      • Java (0)
    • Algorithm (39)
      • BaekJoon (18)
      • Programmers (7)
      • LeetCode (6)
      • NeetCode (8)
    • SW Books (9)
      • gRPC Up & Running (1)
      • System Design Interview (2)
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (6)
      • 블록체인 해설서 (0)
      • 후니의 쉽게 쓴 CISCO 네트워킹 (0)
    • Own (3)
      • Personal (1)
      • Novel (0)
      • Comics & Animation (0)
      • Memo (2)
    • BlockChain (4)
      • Issues (0)
      • Research (4)
      • Tech (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Hash Table
  • 백준
  • Palindrome
  • 해시
  • golang
  • two pointer
  • Greedy
  • chart
  • NeetCode
  • 블록체인
  • decimal
  • BEAKJOON
  • LeetCode
  • Event
  • Python
  • go
  • 큐
  • 2024
  • BaekJoon
  • MongoDB
  • DP
  • 프로그래머스
  • 스택
  • Programmers
  • 그리디
  • ohlcv
  • BFS
  • KBW
  • candlechart
  • blockchain

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
빵빵0
[백준/Python] 16200번 - 해커톤
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.