SOJ ONLINE JUDGE

문제 89

고기만두

내 상태
미제출
난이도
89번 문제 난이도 보기
Bronze III
출제자
pizzaroot
시간 제한
1000 ms
메모리 제한
512 MB
89번 문제 태그 보기
브루트포스 알고리즘수학정수론

세종대학교 ICPC팀은 연습이 끝나면 춘향미엔에 가서 고기만두를 먹는다는 전설이 있다.

이곳에서 고기만두 한 접시를 시키면 고기만두 $6$개가 나온다.

$N$명이 고기만두를 먹으러 춘향미엔에 갔다. $N$명 모두가 남기지 않고 정확히 같은 개수의 고기만두를 먹으려면, 고기만두를 최소 몇 접시 시켜야 할까? 단, 배가 고프므로 최소 한 접시는 시켜야 한다.

입력

첫 번째 줄에 정수 $N$이 주어진다. $(1 \le N \le 1\,000)$

출력

첫 번째 줄에 필요한 고기만두 접시 수의 최솟값을 출력한다.

예제 입력 1

3

예제 출력 1

1

예제 입력 2

4

예제 출력 2

2

공식 해설 풀이 스포일러 보기 접기

접시를 $x$개 주문하면 만두는 $6x$개이다. 모두 같은 수를 남김없이 먹으려면 $N\mid6x$여야 한다.

$g=\gcd(N,6)$이라 하면 $N/g$와 $6/g$는 서로소이므로 위 조건은 $N/g\mid x$와 동치이다. 따라서 가장 작은 양의 접시 수는
\[ \frac{N}{\gcd(N,6)} \]
이다.

최대공약수를 구해 이 값을 출력한다. 두 수 중 하나가 상수 $6$이므로 시간복잡도와 추가 공간복잡도는 $O(1)$이다.

구현 · 언어별 풀이

C++ 구현

C++에서는 <numeric>의 gcd를 사용하여 N / gcd(N, 6)을 출력한다.

C 구현

int로 유클리드 알고리즘을 구하고 N/gcd(N,6)을 출력한다. gcd의 두 번째 인수가 6이라 연산량이 작다. 원 위의 모든 위치를 시뮬레이션하지 않는다.

Python 구현

math.gcd(N,6)을 사용해 N // gcd를 출력한다. 별도 방문 배열이나 각도 실수 연산은 필요 없다.

Java 구현

두 int에 유클리드 알고리즘을 적용하고 N/g를 출력한다. Double 각도로 돌아오는 위치를 판정하지 않는다.

Rust 구현

u32 정수로 gcd(N,6)을 구하고 나눈다. 입력은 1000 이하라 큰 정수나 별도 원형 자료구조는 필요 없다.

JavaScript 구현

$N\le1\,000$이므로 Number 정수로 유클리드 호제법을 사용한다. JS 표준 라이브러리에는 gcd가 없지만 두 변수의 작은 반복문이면 충분하다.

let a = n, b = 6;
while (b !== 0) [a, b] = [b, a % b];
console.log(n / a);

계산한 최대공약수는 $N$의 약수이므로 마지막 나눗셈은 정확한 정수이다. 접시 수를 하나씩 늘리거나 만두의 배분을 시뮬레이션하지 않는다.

제출

편집기에서 나가려면 Esc를 누른 뒤 Tab 또는 Shift와 Tab을 누르세요.