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

1을 출력하고, 이어서 각 초등학교별로 짝의 수를 출력합니다.0을 출력합니다.n = int(input())
school = []
check = True
for i in range(0, 3):
x, y = map(int, input().split())
school.append(x)
school.append(y)
for i in range(0, school[0]+1):
a = i
d = school[0] - a
e = school[5] - d
b = school[2] - e
c = school[1] - b
f = school[4] - c
if a >= 0 and b >= 0 and c >= 0 and d >=0 and e >= 0 and f >=0 :
print(1)
print(a, d)
print(b, e)
print(c, f)
check = False
break
if check:
print(0)
입력 읽기:
n = int(input())
school = []
check = True
for i in range(0, 3):
x, y = map(int, input().split())
school.append(x)
school.append(y)
n: 남학생 또는 여학생의 수 (각각 N명).school: 6개의 요소를 갖는 리스트로, 순서대로 [A_m, A_f, B_m, B_f, C_m, C_f]를 저장합니다.A_m: A초등학교 출신 남학생 수A_f: A초등학교 출신 여학생 수B_m: B초등학교 출신 남학생 수B_f: B초등학교 출신 여학생 수C_m: C초등학교 출신 남학생 수C_f: C초등학교 출신 여학생 수for i in range(0, school[0]+1):
a = i
d = school[0] - a
e = school[5] - d
b = school[2] - e
c = school[1] - b
f = school[4] - c
if a >= 0 and b >= 0 and c >= 0 and d >=0 and e >= 0 and f >=0 :
print(1)
print(a, d)
print(b, e)
print(c, f)
check = False
break
a: A초등학교 출신 남학생이 B초등학교 출신 여학생과 짝을 이루는 수d: A초등학교 출신 남학생이 C초등학교 출신 여학생과 짝을 이루는 수 (a + d = A_m)e: C초등학교 출신 여학생 수 (C_f)에서 d를 뺀 값 (e = C_f - d), 이는 B초등학교 출신 여학생과 짝을 이루는 A초등학교 출신 남학생의 수b: B초등학교 출신 남학생 수 (B_m)에서 e를 뺀 값 (b = B_m - e), 이는 B초등학교 출신 남학생이 A초등학교 출신 여학생과 짝을 이루는 수c: A초등학교 출신 여학생 수 (A_f)에서 b를 뺀 값 (c = A_f - b), 이는 C초등학교 출신 남학생이 A초등학교 출신 여학생과 짝을 이루는 수f: C초등학교 출신 남학생 수 (C_m)에서 c를 뺀 값 (f = C_m - c), 이는 C초등학교 출신 남학생이 B초등학교 출신 여학생과 짝을 이루는 수a를 0부터 A_m까지 반복.d = A_m - a: A초등학교 출신 남학생이 C초등학교 출신 여학생과 짝을 이루는 수e = C_f - d: C초등학교 출신 여학생 수에서 d를 빼면, A초등학교 출신 남학생 중 B초등학교 출신 여학생과 짝을 이루는 수b = B_m - e: B초등학교 출신 남학생 수에서 e를 빼면, B초등학교 출신 남학생이 A초등학교 출신 여학생과 짝을 이루는 수c = A_f - b: A초등학교 출신 여학생 수에서 b를 빼면, C초등학교 출신 남학생이 A초등학교 출신 여학생과 짝을 이루는 수f = C_m - c: C초등학교 출신 남학생 수에서 c를 빼면, C초등학교 출신 남학생이 B초등학교 출신 여학생과 짝을 이루는 수a, b, c, d, e, f가 0 이상인지 확인:a 값을 시도if check:
print(0)
a 값을 시도했음에도 불구하고 유효한 짝짓기 방법을 찾지 못했다면, 0을 출력합니다.입력:
6
4 2
1 3
1 1
n = 6school = [4, 2, 1, 3, 1, 1]반복 과정:
a = 0:d = 4 - 0 = 4e = 1 - 4 = -3 (음수, 불가능)a = 1:d = 4 - 1 = 3e = 1 - 3 = -2 (음수, 불가능)a = 2:d = 4 - 2 = 2e = 1 - 2 = -1 (음수, 불가능)a = 3:d = 4 - 3 = 1e = 1 - 1 = 0b = 1 - 0 = 1c = 2 - 1 = 1f = 1 - 1 = 0a=3, b=1, c=1, d=1, e=0, f=0이 0 이상이므로 유효1
3 1
1 0
1 0
제공된 코드는 브루트 포스(Brute Force) 방식과 알제브라적 접근을 결합한 형태로, 가능한 모든 a 값을 시도하여 유효한 짝짓기 방법을 찾습니다. 구체적인 풀이 방법은 다음과 같습니다:
school 리스트에 저장합니다.a를 0부터 A_m까지 반복합니다.a 값에 대해 다음과 같이 다른 짝짓기 수를 계산합니다:d = A_m - a: A초등학교 출신 남학생이 C초등학교 출신 여학생과 짝을 이루는 수e = C_f - d: C초등학교 출신 여학생 중 A초등학교 출신 남학생과 짝을 이루지 못한 여학생의 수 (즉, B초등학교 출신 여학생과 짝을 이룰 남학생의 수)b = B_m - e: B초등학교 출신 남학생이 A초등학교 출신 여학생과 짝을 이루는 수c = A_f - b: A초등학교 출신 여학생 중 B초등학교 출신 남학생과 짝을 이루지 못한 여학생의 수 (즉, C초등학교 출신 남학생과 짝을 이룸)f = C_m - c: C초등학교 출신 남학생이 B초등학교 출신 여학생과 짝을 이루는 수a, b, c, d, e, f가 0 이상인지 확인합니다.a 값을 시도했음에도 불구하고 유효한 짝짓기 방법을 찾지 못했다면, 0을 출력합니다.a 값을 0부터 A_m까지 시도하면서 다른 짝짓기 수(d, e, b, c, f)를 알제브라적으로 계산합니다.school: 6개의 요소를 가지는 리스트로, 각 초등학교별 남학생과 여학생 수를 저장합니다.0: A초등학교 남학생 수 (A_m)1: A초등학교 여학생 수 (A_f)2: B초등학교 남학생 수 (B_m)3: B초등학교 여학생 수 (B_f)4: C초등학교 남학생 수 (C_m)5: C초등학교 여학생 수 (C_f)a, b, c, d, e, f: 각 초등학교별로 짝을 이루는 남학생과 여학생의 수를 저장하는 변수들check: 짝짓기 가능 여부를 추적하는 불리언 변수a는 0부터 A_m까지 반복합니다.A_m = 100,000A_m) = O(100,000) → 선형 시간a 값에 대해 d, e, b, c, f를 계산하고, 6개의 변수에 대해 0 이상인지 확인합니다.A_m) × O(1) = O(A_m) = O(100,000)school: 6개의 정수 → O(1) (상수 공간)a, b, c, d, e, f: 6개의 정수 → O(1) (상수 공간)코드는 3개의 초등학교라는 고정된 수를 기반으로 작동합니다. 이를 통해 가능한 모든 짝짓기 수를 알제브라적으로 계산하고, 유효한 짝짓기 방법을 찾습니다. 이 접근 방식은 다음과 같은 이유로 정당합니다:
a 값을 시도하므로, 가능한 모든 짝짓기 방법을 탐색합니다.