티스토리 뷰
#include <stdio.h>
#define ll long long
ll U(ll a, ll b) {
ll r = a%b;
return (r) ? U(b, r) : b;
}
int main(void) {
ll n, b, X=0, Y=0, sign = -1;
scanf("%lld %lld",&n, &b);
for(int i=0; i<n; i++) {
ll x, y;
scanf("%lld %lld", &x, &y);
X += x;
Y -= y;
}
Y += n * b;
if(X < 0) {
sign *= -1;
X *= -1;
}
if(Y < 0) {
sign *= -1;
Y *= -1;
}
//Y/X
if(X == 0) printf("EZPZ");
else if(Y%X == 0) {
printf("%lld", (Y/X) * sign);
} else {
ll tmp = U(X, Y);
X /= tmp;
Y /= tmp;
printf("%lld/%lld", sign*Y, X);
}
}
풀이 : 최대공약수를 이용합니다.
문제는 a를 구해야 하므로
X에 x좌표의 값들을 다 더해놓고
Y에 y좌표의 값들을 다 더해놓고 여기에 n * b 도 더해줍니다.
이렇게 되면 aX = -Y => a = -Y/X 입니다.
여기서 계산을 용이하기 위해 부호가 양인지 음인지를 나타내는 변수 하나를 만든다음
sign = -1 을 기본으로 해줍니다 여기서 -1을 기본으로 하는 이유는 a = -Y/X 에서 -을 sign에 넣어준 것 입니다.
Y / X 계산에서 X, Y 둘 다 양수이어야 계산이 용이하므로, 음수인 경우 양수로 바꾸어 줍니다. 물론 sign의 값도 변경해주어야 합니다 (양이면 음으로, 음이면 양으로)
마지막으로
Y/X 을 출력해야 합니다.
1. X가 0인 경우 a는 무한개 입니다. 고로 EZPZ을 출력합니다.
2. Y % X == 0 인 경우 a가 정수란 의미입니다 (Y/X) * sign 을 곱한 것을 출력하면 됩니다.
3. Y % X != 0 인 경우 a가 분수란 의미입니다. 기약분수 형태로 출력하기 위해서, 먼저 X, Y의 최대공약수를 구한 다음,
sign * Y 과 X 을 출력해줍니다. (각각 분자 분수)
https://www.acmicpc.net/problem/27295
'c언어 > BAEKJOON' 카테고리의 다른 글
c언어 10464번 XOR (백준) (0) | 2024.03.20 |
---|---|
c언어 17087번 숨바꼭질 6 (백준) (0) | 2024.01.17 |
c언어 2589번 보물섬 (백준) (1) | 2023.10.28 |
c언어 1464번 뒤집기 3 (백준) (0) | 2023.09.06 |
c언어 13417번 카드 문자열 (백준) (0) | 2023.09.05 |
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 6198번
- C언어
- 정렬
- 그래프
- 오프라인 쿼리
- java
- 16120번
- 트리
- 덱
- 최소 스패닝 트리
- 카드
- Krustal
- find
- 누적합
- Mo.s
- 스택
- DP
- 백준
- DFS
- 1835번
- 그리디
- 플로이드
- C++
- 6198
- 누적 합
- 세그먼트 트리
- union
- 최대공약수
- BFS
- 1835
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함