[C언어] 백준 1193 : 분수찾기

mainsain·2022년 3월 14일
0

백준

목록 보기
4/64


기본적인 문제 이해.
예제들을 모조리 써보고, 규칙을 찾았다.

폰으로 필기식으로 해서 글씨는 이상하지만, 계속 설명하자면
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에다가 넣었으면 굳이 반복문을 사용 할 필요가 없었겠구나 싶었다.

profile
새로운 자극을 주세요.

0개의 댓글