본문 바로가기
Problem Solving/백준

[백준|파이썬] 2891: 카약과 강풍 (실버5)

by 청량리 물냉면 2023. 4. 21.
반응형
문제

 

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

 

2891번: 카약과 강풍

첫째 줄에 팀의 수 N, 카약이 손상된 팀의 수 S, 카약을 하나 더 가져온 팀의 수 R이 주어진다. (2 ≤ N ≤ 10, 1 ≤ S, R ≤ N) 둘째 줄에는 카약이 손상된 팀의 번호가 주어진다. 팀 번호는 중복되지 않

www.acmicpc.net

 

 

🐍파이썬
import sys
n, s, r = map(int, sys.stdin.readline().split())
temp = []
kayac = [0 for _ in range(n+2)]	#대회에 참가한 팀의 갯수만큼 0으로 초기화. 인덱스처리 위해 앞뒤 0으로 패딩
temp = list(map(int, sys.stdin.readline().split()))
for i in range(s):	#카약 망가진 팀은 -1
    kayac[temp[i]] -= 1	
temp = list(map(int, sys.stdin.readline().split()))
for i in range(r):	#카약 여분 있는 팀은 +1
    kayac[temp[i]] += 1
for i in range(1, len(kayac)):	#인덱스1부터 시작, kayac 배열 맨뒤 0패딩 있으므로 마지막팀까지 처리 가능
    if kayac[i] == 1:	#여분이 있다면
        if kayac[i-1] == -1:	#이전 팀부터 빌려준다(빨리 빌려서 먼저 경기에 나가야 하므로)
            kayac[i-1] += 1
            kayac[i] -= 1
        #이전 팀에서 추가 카약이 필요없다면 다음 팀을 확인
        elif kayac[i+1] == -1:	#다음 팀의 카약이 없다면 우리 팀의 카약을 빌려준다.
            kayac[i+1] += 1
            kayac[i] -= 1	
print(kayac.count(-1))	#마지막까지 카약을 못 빌린 팀의 갯수를 출력

 

 

다른 풀이 방법

import sys
input = sys.stdin.readline

n,s,r = map(int, input().split())
broke = list(map(int,input().split()))	#카약이 부서진 팀
redun = list(map(int,input().split()))	#여분이 있는 팀
broke, redun = list(set(broke)-set(redun)), list(set(redun)-set(broke))	
#broke, redun = 강풍에 카약이 망가졌지만 여분이 있는 경우

ans = 0
for i in broke:	#카약이 망가진 팀 중에
    if i-1 in redun:	#이전 팀에서 여분이 있다면 빌려주기
        redun.remove(i-1)	#여분이 있는 팀 목록에서 이전 팀 삭제
    elif i+1 in redun:	#다음 팀에서 여분이 있다면 빌려주기
        redun.remove(i+1)	#여분이 있는 팀 목록에서 다음 팀 삭제
    else:
        ans += 1	#둘 다 아닌 경우(카약을 못 빌림)

print(ans)

 

반응형