[백준] 14568 (실패) 2017 연세대학교 프로그래밍 경시대회

Hyun·2025년 7월 27일
0

백준

목록 보기
102/123

문제

2015, 2016년에 이어 2017년에도 연세대학교 교내 프로그래밍 경시대회가 열린다.

택희, 영훈이, 남규는 열심히 문제를 만들었고, 이에 대한 보상으로 과사로부터 사탕 N개를 받았다.

N개의 사탕을 적절히 나눠 가지기 위해 토론한 결과, 아래와 같은 방식으로 사탕을 나누기로 결정하였다.

남는 사탕은 없어야 한다.
남규는 영훈이보다 2개 이상 많은 사탕을 가져야 한다.
셋 중 사탕을 0개 받는 사람은 없어야 한다.
택희가 받는 사탕의 수는 홀수개가 되어서는 안 된다.
이제 사탕을 적절히 나누어 집에 돌아가던 중, 택희는 위와 같은 규칙을 만족하도록 세 명에게 사탕을 나누어 주는 방법의 수가 궁금해졌다.

사탕의 개수 N이 주어지면, 사탕을 세 사람에게 분배하는 서로 다른 경우의 수를 세 보자.

입력

첫째 줄에 사탕의 총 개수 N이 주어진다. (1 ≤ N ≤ 100)

출력

규칙에 맞게 사탕을 분배하는 경우의 수를 출력한다. 택희, 영훈이, 남규가 받은 사탕의 수를 각각 A, B, C개라고 할 때, 서로 다른 (A, B, C) 순서쌍의 수를 세면 된다.

만일 규칙에 맞게 사탕을 분배하는 방법이 없다면 0을 출력한다.

예제 입력 1

6

예제 출력 1

1

풀이

문제를 보았을 때 택희를 기준으로, 택희의 값을 2씩 증가시키면서 나머지 조건을 만족하는 (택희, 남규, 영훈)의 경우의 수를 찾으면 된다고 생각했다. 그리고 그 다음 로직들을 생각을 해봤는데,, 잘 안풀려서 타 풀이를 참고했다.
쉬운 문제인데, 너무 어렵게 풀려고 했던 것 같다. 예전에도 이런 식의 사고를 했었는데, 문풀을 잠시 쉬었더니 재발한 듯 하다. 최대한 쉽게 쉽게 생각해보자!!

영훈이를 기준으로 풀었을 때
(첫번째 for 문은 택희, 두번째 for 문은 영훈)
영훈이가 가질 수 있는 최소값은 1이고, 이때 영훈이가 가질 수 있는 최소값이 3이기 때문에
영훈이의 값 Y 를 NUM-T-2 까지, 즉 3이 남을 때까지 범위를 지정해주었다.

import sys
from itertools import permutations
sys.setrecursionlimit(10 ** 6)
input = sys.stdin.readline

NUM = int(input()) # 사탕 개수
cnt = 0
for T in range(2, NUM-3, 2):
    for Y in range(1, NUM-T-2):
        N = NUM - T - Y
        if N >= Y + 2: cnt+=1
        
print(cnt)

남규를 기준으로 풀었을 때
(첫번째 for 문은 택희, 두번째 for 문은 남규)
남규가 가질 수 있는 최소값은 3이고, 이때 영훈이가 가질 수 있는 최소값이 1이기 때문에
남규의 값 N 를 NUM-T 까지, 즉 1이 남을 때까지 범위를 지정해주었다.

import sys
from itertools import permutations
sys.setrecursionlimit(10 ** 6)
input = sys.stdin.readline

NUM = int(input()) # 사탕 개수
cnt = 0

for T in range(2, NUM-3, 2):
    for N in range(3, NUM-T):
        Y = NUM - T - N
        if N - Y >= 2: cnt+=1

print(cnt)
profile
better than yesterday

0개의 댓글