[백준] 2869번: 달팽이는 올라가고 싶다

Boknami·2022년 2월 6일
0

백준문제풀이

목록 보기
13/45

📑문제

낮엔 A만큼 올라가고 밤엔 B만큼 내려오는 달팽이는 몇 일이 걸려서 V에 도달할 수 있을까?


💡 핵심 포인트

고정 관념을 깨고 수학적으로 문제를 바라보기

항상하던 방식으로 while문을 구성하여 원하는 값에 도달할 때까지 덧셈, 뺄셈 조건을 앞세워 문제를 풀었다. 하지만 상당히 큰 값을 넣으면 while문은 계속 계속 돌아가서 시간제한이 걸린 문제에서는 합격을 받을 수가 없었다.

내가 가진 반복문을 써야한다는 고정 관념 때문에 코드의 효율성에 문제라 생각을 하고 코드의 비효율적인 부분을 줄이고 실행되는 부분들 또한 줄이기 위해 코드를 수정하고 몇 번 다시 돌려보았지만 되지 않았다.

결국 서칭을 통해 반복문 사용없이 문제를 풀 수 있음을 알고나서야 문제 주제가 제시하는 수학적 수식을 만들어서 풀었다.

🤦‍♂️틀린 이유

처음부터 눈에 띄였던게 0.15초라는 제한시간이긴 하였는데 실제 반복문을 돌려보고 아무리 코드의 최적화를 하여도 마지막 100 99 1000000000를 넣었을 때를 반복문으로는 극복할 수 없었다. 이건 반복문으로 풀어야 할 것 같은데 내가 최적화를 제대로 못하고 있는건가 싶어서 검색을 통해서 힌트를 얻고 다시 풀었다. 분명 이런 문제는 반복문을 사용하면 쉽게 풀 수 있긴 하나 시간 제한이 걸린 경우에는 반복문을 최대한 배제하고 사용할 수 있는 수식을 만드는 것이 정말 중요한 경우도 있을 수 있다는 걸 느꼈다

❗ 느낀 것

때로는 반복문 코드보단 수학적 수식을 사용하여 나타낼 수 있다면 엄청난 효율성을 가질 수 있다.


🧾 전체 코드

1번째 제출 (상당히 비효율적 반복문)

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>

int main()
{
	int Up = 0;
	int Down = 0;
	int height = 0;
	int Now = 0;
	int Count = 0;
	scanf("%d %d %d", &Up, &Down, &height);

	while (height > Now)
	{
		Now = Now + Up;
		Count++;
		if (height <= Now)
			break;
		Now = Now - Down;
	}
	printf("%d 일이 걸립니다.\n", Count);
}

2,3번째 제출 (정리, 효율성을 보수한 반복문)

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>

int main()
{
	int Up = 0;
	int Down = 0;
	int height = 0;
	int Now = 0;
	int Count = 0;
	scanf("%d %d %d", &Up, &Down, &height);

	while (1)
	{
		Now+= Up;
		Count++;
		if (height <= Now)
			break;
		Now -= Down;
	}
	printf("%d", Count);
}




#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>

int main()
{
	int Room = 1;
	int hexagon = 6;
	int Now = 0;
	int N = 0;
	scanf("%d", &N);

	N = N - 1;

	while ((N > Now))
	{
		Now = Now + (Room * hexagon);
		Room++;
	}

	printf("%d\n", Room);
}

0개의 댓글