본문 바로가기

IT/Algorithm Test

[C] 백준(BOJ) - 1193 분수찾기

반응형

이번 포스트는 처음으로 Python이 아닌 C로 풀어보는 문제이다.

원래 필자는 임베디드 개발로 개발을 시작했기 때문에 C가 주언어였고, 처음 백준을 접했을 때에는 C로 문제를 풀었다.

하지만 취업을 위한 코딩 테스트 준비에서 C의 비효율성(시간복잡도나 CS적 측면이 아닌 문제 풀이를 위한 비생산성)의 문제로 Python으로 갈아타게 되었다.

 

그래서 이번에는 어떤 문제를 풀까, 하다가,

옛날에 C로 풀었던 규칙성 문제를 찾게 되어 C 코드를 올릴까 한다.

 

한 번 바로 살펴보도록 하자.


소스 코드

//BOJ 1193 분수찾기

#include <stdio.h>

int main() {
    int i = 1, j = 2, k = 1, tmp = 0,  cnt = 1, n = 0, m = 0;

	scanf("%d", &i);

	while (i != 1) {
		tmp = k;
		k += j;
		++j;
		++cnt;

		if (i <= k) {
			break;
		}
	}

	if (i == 1) {
		printf("1/1");
		return 0;
	}

	i -= tmp;
	if ((cnt % 2) == 1) {
		m = cnt - (i - 1);
		n = j - m;
		printf("%d/%d", m, n);
	} else if ((cnt % 2) == 0) {
		n = cnt - (i - 1);
		m = j - n;
		printf("%d/%d", m, n);
	}

	return 0;
}

당연히 규칙성 문제이기 때문에,

수학적으로 규칙성만 찾아낸다면 어느 언어든 짧은 줄의 코드로 쉽게 구현할 수 있는 문제이다.

 

C코드는 시간이 0ms이 나온다... 갓C코드...

물론 맞긴 맞았지만, (제출한 시간이 최근인 이유는 주석 처리를 다시 해서 돌리느라 방금 한 번 더 돌리게 되었다.)

 

지금 이 코드를 들여다보니,

이때의 필자의 성향과, 개선할 점들이 눈에 띈다.

 

대표적으로,

이때 필자는 Stackoverflow 웹사이트에서 후위증감자보다 전위증감자를 선호하는 성향에 크게 영향을 받았기에,

j++;
cnt++;

이 아닌,

++j;
++cnt;

를 썼었다.

 

하지만 요즘은 크게 신경쓰지는 않는다.

물론 특별히 후위증감자에 민감한 부분에서는 전위증감자를 쓰겠지만,

이때만큼 전위증감자 찬양자(...)는 결단코 아니게 되었다.

 

하지만 이 정도야 취향이었다고 생각할 수 있지만,

아래쪽을 보면 지금은 실망스러운 것이 눈에 띈다.

 

	if ((cnt % 2) == 1) {
		m = cnt - (i - 1);
		n = j - m;
		printf("%d/%d", m, n);
	} else if ((cnt % 2) == 0) {
		n = cnt - (i - 1);
		m = j - n;
		printf("%d/%d", m, n);
	}

바로 이 부분이다.

혹시 이 부분의 문제점을 눈치챘는가?

 

만약 지금의 필자라면, 이렇게 코드를 작성했을 것 같다.

	if (cnt & 1) {
		m = cnt - (i - 1);
		n = j - m;
		printf("%d/%d", m, n);
	} else if (!(cnt & 1)) {
		n = cnt - (i - 1);
		m = j - n;
		printf("%d/%d", m, n);
	}

if문과 else if문의 조건문을 보면, %(나머지 연산자)와 ==(비교 연산자)를 사용하지 않은 채,

&(비트 AND 연산자)로 조건문을 끝내고 있다.

 

홀짝을 비교하는 것은 %, ==을 사용하게 된다면 나눗셈기를 사용해야 하는 나머지 연산자와 더불어 비교 연산자까지,

2번의 연산을 하게 되지만,

비트 AND 연산자인 &를 쓰게 된다면 바로 감별이 가능해진다.

물론 속도 차이는 매우 미세하겠지만 이 연산이 매우 많이 지속된다면 유의미하게 큰 차이를 불러일으킬 수 있다.

 

이런 점이 눈에 띈다는 것을 생각하면,

1년 전의 필자와 지금의 필자가 꽤 성장했다는 것이 느껴져서 기분이 좋다.

 

앞으로 1년 후의 필자도 지금의 필자보다 더 성장해있기를 바라며,

이번 포스팅을 마칠까 한다.

반응형