궤도

[EPPER] 12회 9번 본문

💻 현생/⛓ 알고리즘

[EPPER] 12회 9번

영이오 2020. 10. 9. 17:54

문제

 


풀이

 

모든 경우의 수를 다 따져야 한다. 일단 P는 아무리 커봤자 N, M 중 작은 것보다 커질 수 없으니 N, M 중 작은 것을 찾는다.

이게 그 경우의 수들이다.

 

1. N이 P로 나누어 떨어짐

   1. (M-2)가 P로 나누어 떨어짐

   2. (M-1)이 P로 나누어 떨어짐 && (N-2)가 P로 나누어 떨어짐

2. (N-1)이 P로 나누어 떨어짐

   1. (M-1)이 P로 나누어 떨어짐

   2. (M-2)가 P로 나누어 떨어짐 && M이 P로 나누어 떨어짐

3. (N-2)가 P로 나누어 떨어짐

   1. M이 P로 나누어 떨어짐

 

이걸 전부 떠올린다면 조건에 맞춰 코드를 작성하면 끝이니 쉽겠지만, 이걸 이렇게 전부 떠올리는게 힘들어서 문제다.


소스코드

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int N, M;
	int min;

	scanf("%d %d", &N, &M);
	if (N > M)
		min = M;
	else
		min = N;
	for (int i = 1; i <= min; i++) { //모든 경우의 수를 다 따져봐야함
		if (N % i == 0) {
			if ((M - 2) % i == 0)
				printf("%d ", i);
			else if ((M - 1) % i == 0 && (N - 2) % i == 0)
				printf("%d ", i);
		}
		else if (N % i == 1) {
			if ((M - 1) % i == 0)
				printf("%d ", i);
			else if ((M - 2) % i == 0 && M % i == 0)
				printf("%d ", i);
		}
		else if (M % i == 0 && (N - 2) % i == 0)
			printf("%d ", i);
	}
}
Comments