티스토리 뷰
#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
27295번: 선형 회귀는 너무 쉬워 1
유림이는 선형 회귀에 자신이 있다. 그래서 MatKor 동아리에서 선형 회귀에 관한 수업을 할 때 집중을 하지 않았다. 당시 강사였던 동우는 이를 못마땅하게 여겨 유림이에게 더 어려운 문제를 내
www.acmicpc.net
'c언어 > BAEKJOON' 카테고리의 다른 글
c언어 16926번 배열 돌리기 1, 16927번 배열 돌리기 2 (백준) (0) | 2024.06.28 |
---|---|
c언어 10464번 XOR (백준) (0) | 2024.03.20 |
c언어 17087번 숨바꼭질 6 (백준) (0) | 2024.01.17 |
c언어 2589번 보물섬 (백준) (0) | 2023.10.28 |
c언어 1464번 뒤집기 3 (백준) (0) | 2023.09.06 |
- Total
- Today
- Yesterday
- BFS
- 백준
- 1835
- PASCAL
- 그래프
- C언어
- 1835번
- 오프라인 쿼리
- 세그먼트 트리
- 누적합
- Krustal
- DFS
- Segment Tree
- 그리디
- 정렬
- DP
- 최소 스패닝 트리
- 덱
- 누적 합
- union
- Lazy Propagation
- find
- java
- 플로이드
- 스택
- 기하학
- C++
- 브루트포스
- 최대공약수
- XOR
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |