본문 바로가기
C

[C]백준 08.기본수학1: 1193

by 열지희공 2022. 1. 11.

백준 1193

내코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int x;
	scanf("%d", &x);
	int numerator; // 분자
	int denominator; // 분모

	int front = 0;
	int level = 1;
	int order;
	int i = 0;


	while (1) {
		if (front < x && x <= front + level) {
			level = level;
			order = x - front;
			break;
		}
		else {
			front = front + level;
			level++;
		}
	}
	if (level % 2 == 0) {
		numerator = order;
		denominator = level - (order - 1);
	}
	else {
		numerator = level - (order - 1);
		denominator = order;
	}
	printf("%d/%d", numerator, denominator);
	return 0;
}

대각선을 기준으로 level을 나누어 생각했다. 1/1에 속한 대각선이 level 1이라고 생각했을 때 level i 대각선에 속한 원소의 개수는 i개이다. 일단 각 level의 원소를 분수로 생각하지 않고 분수에 해당하는 순서라고 생각했다. 순서가 주어졌을 때 그 순서의 level과 order(그 level에서의 순서)를 알면 분수를 구할 수 있기 때문에 level과 order를 구하려고 노력했다. front 변수는 그 전 level에서의 최대 원소(가장 높은 순서)이다. while 반복문을 통해 주어진 x가 front보다 크고 front+level(해당 level에서 최대 원소)이하라면 order = x-front가 되고 탈출해줬다. 만약 그 외의 경우엔 다음 level을 검사하기 위해 front= front+level, level++를 해줬다. 얻은 level이 짝수일 경우 분자는 order이고, 분모는 level-(order-1)이다. level이 홀수일 경우 분자는 level-(order-1)이고, 분모는 order이다. 

다른 사람의 코드를 찾아보니 전체적인 문제해결방법은 나와 비슷하지만 더 간단한 방법이 있었다. 이 코드에서는 level과 order를 구하기 위해 해당 level에의 최대원소와 해당 level을 매우 쉬운 방법으로 구했다. b=1, i=1로 초기화한 후 a>b일때까지 b+=++i를 하는 것이다. 그렇게 되면 i는 해당 level이 되고, b는 해당 level에서 최대 원소가 된다. 그래서 이 코드를 이용해 문제를 풀면 훨씬 간단한 코드를 짤 수 있다. 아래는 코드이다. 

#include <stdio.h>

int main()
{
	int a;      
	int b = 1;  
	int i;       

	scanf("%d", &a);

	for (i = 1; a > b; )
		b += ++i;

	if (i % 2 == 0)
		printf("%d/%d", i - (b - a), 1 + (b - a));

	else
		printf("%d/%d", 1 + (b - a), i - (b - a));
		
	r

<출처: https://mokhwasomssi.tistory.com/43?category=927531 >