기본적인 문제 이해.
예제들을 모조리 써보고, 규칙을 찾았다.
폰으로 필기식으로 해서 글씨는 이상하지만, 계속 설명하자면
1번사진의 필기를 살짝 돌려서 트리형인 밑에 내 필기로 만들었다.
보면 짝수번(2번줄,4번줄...)은 분모가 1씩 줄어들고 분자는 1씩 늘어난다.. (노란색 숫자로 정렬했을 때)
//1번줄은 따로 처리했다.
홀수번(3번줄,5번줄)은 분모가 1씩 늘어나고 분자는 1씩 줄어든다.
그래서 홀수번줄과 짝수번줄을 구분해서 풀었고, 나머지는 코드를 보면서 진행하자.
#include <stdio.h>
int main()
{
int i, j;
int a, b;
int n , A;
int sum = 0, sum1 = 0; // 바로 직전 문제인 벌집처럼 범위를 지정해줌.
scanf("%d", &n); // n값 받아주고
i = 1;
if (n == 1) // 1일경우 따로 처리
{
printf("1/1");
return 0;
}
while (1) // 결국 n값은 sum과 sum1의 범위안에 속하게 됨.
{
sum = sum + i; // 줄의 마지막 번호.
sum1 = sum1 + (i - 1); // sum보다 한 줄 낮은 마지막 번호.
if ((n > sum1) && (n <= sum)) // sum1 + 1 과 sum 사이에 있는 n
{
j = 1;
if (i % 2 == 0) // i값(줄)이 짝수줄일경우.
{
a = 1; // 분자
b = i; // 분모
A = n - sum1; // 예를 들어 n = 9일경우, sum1(6)을 빼서 3이 된다.
while (j < A) // 분자와 분모의 값을 A - 1번 반복해 조절해줌.
{
a = a + 1;
b = b - 1;
j++;
}// 시작은 a = 1, b = 4 였지만, 2회 반복문을 돌려 a = 3, b = 2로 만들어준다.
printf("%d/%d", a, b); // 그대로 출력 후 종료.
break;
}
else // i값(줄)이 홀수줄일경우.
{
a = i; // 위와 다 같지만, a와 b의 값만 바꾸어주었다.
b = 1;
A = n - sum1;
while (j < A)
{
a = a - 1;
b = b + 1;
j++;
}
printf("%d/%d", a, b); // 출력 후 종료.
break;
}
}
i++;
}
}
#include <stdio.h>
int main() {
int input;
scanf("%d", &input);
int k = 1;
while (1) //라인 찾기
{
if ((k-1)*(k)/2 < input && input <= (k)*(k+1)/2)
{
break;
}
k++;
}
if (k % 2 != 0) // 홀수일 때
{
int a = k*(k + 1) / 2;
printf("%d", a-input + 1);
printf("/");
printf("%d", k -(a -input));
}
else //짝수 일 때
{
int a = k * (k + 1) / 2;
printf("%d",k-(a-input));
printf("/");
printf("%d",a-input + 1);
}
return 0;
}
출처: https://abcdefgh123123.tistory.com/186 [함께하는 개발자]
나와 같은 방식으로 라인을 찾고 진행을 했다.
하지만 이사람은 k(k + 1) / 2 를 사용해서 진행을 하였고, 필요없는 변수 사용을 줄였다.
또한 프린트할 때에도 굳이 불필요한 반복문을 진행하지 않았다.
생각해보니 나도
if (i % 2 == 0) // i값(줄)이 짝수줄일경우.
{
a = 1; // 분자
b = i; // 분모
A = n - sum1; // 예를 들어 n = 9일경우, sum1(6)을 빼서 3이 된다.
while (j < A) // 분자와 분모의 값을 A - 1번 반복해 조절해줌.
{
a = a + 1;
b = b - 1;
j++;
}// 시작은 a = 1, b = 4 였지만, 2회 반복문을 돌려 a = 3, b = 2로 만들어준다.
printf("%d/%d", a, b); // 그대로 출력 후 종료.
break;
}
여기에서 while문 안쓰고 바로 a에다가 A-1을 더하고, b에다 A-1을 뺀 값을 printf에다가 넣었으면 굳이 반복문을 사용 할 필요가 없었겠구나 싶었다.