- C언어 : 기본수학1(3)
05.JUL.2022

이와 같이 나열된 분수들을 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → … 과 같은 지그재그 순서로 차례대로
1번, 2번, 3번, 4번, 5번, … 분수라고 하자.
X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.
#include <stdio.h>
int main()
{
int x;
scanf("%d", &x); // 몇 번째 분수를 찾는지 입력받기
int line = 1;
while (x>line) {
x -= line;
line++;
}
// 홀 / 짝 줄에 따라 분자/분모 출력
if (line % 2 == 1)
printf("%d/%d", line + 1 - x, x);
else
printf("%d/%d", x, line + 1 - x);
}
지그재그 순서대로 이동한다고 써 있는데 헷갈려서 그림을 그려보며 풀었다.
<이동 순서>

규칙을 찾으려고 보니, 바로 전에 문제풀이 했던 벌집 문제와 비슷한 느낌을 받았다. 규칙은 아래와 같이 생각할 수 있다.
<홀/짝 규칙>

뭐야 내 색상 돌려줘요
민트 초코와 슈팅 스타 색상으로 야심차게 색칠했는데
왜 잔디랑 용달 트럭이 됐어
아무튼, 벌집 문제에서 동그라미로 구간을 나눠 생각했다면, 이건 피라미드?? 대각선?? 암튼 홀수 번 줄이랑 짝수 번 줄로 구간을 나눠 규칙을 볼 수 있다.
짝수 줄은 위에서 아래 방향으로 이동하고, 홀수 줄은 아래에서 위로 이동한다. 이 이동 방향에 따라 분자/분모를 보면 아래와 같은 규칙을 볼 수 있다.
짝수 줄
분자 : +1씩 증가 / 분모 : -1씩 감소
홀수 줄
분자 : -1씩 감소 / 분모 : +1씩 증가
숫자가 잘 안 보이는 건....내 잘못이 아니다...난 분명 민트 초코와 슈팅 스타로 숫자가 보이게 칠했는데..
홀수 번째 줄과 짝수 번째 줄의 분자/분모 규칙을 봤으니 이제 그 줄이 홀수인지 짝수인지 구분해 보자.
1번째 줄 : 1개 (1/1)
2번째 줄 : 2개 (1/2, 2/1)
3번째 줄 : 3개 (1/3, 2/2, 3/1)
.
.
.
줄이 커질수록 각 줄에 있는 숫자의 개수는 하나씩 늘어난다.
이걸 line 변수로 정의했다.
int line = 1;
while (x>line) {
x -= line; // 입력한 값에서 하나씩 늘어나는 line을 빼준다.
line++;
}
예를 들어 x=4라고 했을 때,
4>1 --> x = 3, line=2
3>2 --> x = 1, line=3
이 된다.
입력 값 x 에 대해 line 번째 줄에 있다는 뜻이다. x=4 라고 했을 때 4번째 분수인 3/1은 3번째 줄(line=3)이니, 맞게 구한 걸 알 수 있다.
여기서 값이 줄어들은 x는 해당 line에서 일종의 index 위치다. 무슨 말이냐 하면 아래에서 더 자세히 보도록 하자.
몇 번째 줄인지 구했으니 홀/짝 규칙에 따라 출력할 수 있다.
// 홀 / 짝 줄에 따라 분자/분모 출력
if (line % 2 == 1)
printf("%d/%d", line -x +1, x);
else
printf("%d/%d", x, line + 1 - x);
위에서 홀수 번째 줄일 때 분자는 감소한다고 써 놓았다.
홀수인 line 번째 줄에서 위치인 x의 수를 빼서 구하면 되는데, +1을 해야 결과가 0이 되지 않고 값이 나온다.
예를 들어 x=4를 대입해서, while문에서 x=1, line=3의 값을 얻었다고 하자.
line은 홀수이므로 if에 들어와서,
분자는 3(3번째 줄)-1(3번째 줄에서의 분수 위치)+1 == 3이 되고,
분모는 위치는 x 그 자체라고 하면 된다. (분모는 +1씩 늘어나니, 위치인 x를 출력)
이렇게 하면 출력은 3/1로 4번째 분수가 제대로 출력되는 것을 볼 수 있다.