[BOJ_step_09] 수학1 01 ~ 08

3 분 소요

수학1

수학을 다루는 문제들을 해결해 보자.

손익 분기점(1712)

1712

문제풀이

문제를 해석하여 식으로 나타내면
노트북의 수를 x라 할 때
$A + Bx < Cx $ 를 구하는 문제이다. 하지만 x를 1씩 증가시키며 저 식에 만족하는 x를 찾으면 시간초과가 걸린다.
따라서 수학식을 정리하여 나타내면
$x > A/(C-B)$ 가 된다.
문제 조건에 맞추어 위 식과 같이 해결하면 컴퓨터가 계산해야하는 양이 줄어든다.

void solution_1712() {
	ll a, b, c;
	scanf("%lld%lld%lld", &a, &b, &c);
	c -= b;
	if (c <= 0)printf("-1\n");
	else printf("%lld\n", (a / c) + 1);
}

설탕 배달(2839)

2839

문제풀이

무게가 5인 봉지로 최대한 많이 담아야하므로
5로 나누었을 때 나누어 떨어진다면 그대로 출력
그렇지 않다면 -3을 하고 카운트 +1 반복

void solution_2839() {
	int n;
	int cnt = 0;
	scanf("%d", &n);
	while (1) {
		if (n % 5 == 0) {
			cnt += n / 5;
			printf("%d", cnt);
			break;
		}
		else if (n <= 0) {
			printf("-1");
			break;
		}
		else {
			n -= 3;
			cnt++;
		}
	}
}	

벌집(2292)

1978

문제풀이

벌집이 6각형임을 생각하여 벌집의 개수는 1을 중심으로 6의 배수만큼 늘어남을 이용한다.

void solution_2292() {
	int n, i = 1, answer = 1;
	scanf("%d", &n);
	n--;
	while (n > 0) {
		n -= 6 * i;
		i++;
		answer++;
	}
	printf("%d", answer);
}

분수 찾기(1193)

1978

문제풀이

주어진 예시를 보면 지그재그 순서에서 방향이 바뀔때를 x라고 하면 방향이 바뀔 때마다 분모는 1씩 증가하고 감소하고를 반복하고 분자는 1씩 감소하고 증가하고를 반복한다.
이 조건을 계산하면 아래 풀이와 같다.

void solution_1193() {
	int N =0,i=0;
	scanf("%d", &N);
	while (N>0){
		N -= ++i;
	}
	int n = i + N;
	if (i % 2 == 0) printf("%d/%d\n", n, i - (n - 1));
	else printf("%d/%d\n", i - (n - 1), n);
}	

달팽이는 올라가고싶다(2869)

2869

문제풀이

쉽게 생각하면 오르고 내리고를 며칠이나 반복해야하는지를 구하는 문제 같지만 그렇지 않다.
맨 마지막 날은 올라가기만 해도 이 문제의 조건은 충족하기 때문이다.
따라서 맨 마지막날은 무조건 올라간다라고 생각하여 v-=a하고난 뒤 그 v%(a-b)==0이 성립하면 그 몫에 +1(맨 마지막 날), 그렇지 않다면 +2(나머지가 생기면 하루 더 올라가고 내려가고를 시행)을 출력한다.

void solution_2869() {
int a, b, v;
	scanf("%d%d%d", &a, &b, &v);
	v -= a;
	printf("%d", v % (a - b) == 0 ? v / (a - b) + 1 : v / (a - b) + 2);
}

ACM호텔(10250)

10250

문제풀이

이 문제를 처음에 풀었을 때는 nh보다 크다면 n-=h를 반복하여 h를 빼준 횟수 +1이 호 수를 의미하고 h를 빼고 남은 n이 층 수를 의미하여 그를 출력하도록 했다.
이번에 문제를 다시보면서 생각하니 그냥 나눗셈의 몫과 나머지관계로 해결할 수 있었다.

void solution_10250() {
	int t, h, w, n;
	scanf("%d", &t);
	while (t--) {
		scanf("%d %d %d", &h, &w, &n);
		int row = n % h == 0 ? h : n % h;
		int col = n % h == 0 ? n / h : (n / h) + 1;
		printf("%d%02d\n", row, col);
		//int x = 1;
		//while (n>h) {
		//	n -= h;
		//	x++;
		//}
		//printf("%d%02d\n", n, x);
	}
}

부녀회장이 될테야(2775)

1978

문제풀이

문제의 설명 그대로 아래층의 n호 까지의 합을 15 x 15에 대하여 모두 구해놓고 해당 kn호의 수를 구한다.
점화식으로 해결할 수 있지 않을까… 규칙은 나오는데 식이 떠오르지않는다…
생각나면 다시 풀어봐야겠다

int Apart[15][15];
void solution_2775() {
	int t, k, n;
	scanf("%d", &t);
	for (int i = 0; i < 15; i++) {
		for (int j = 1; j < 15; j++) {
			if (i == 0)Apart[i][j] = j;
			if (i >= 1)Apart[i][j] += Apart[i - 1][j] + Apart[i][j-1];
		}
	}
	while (t--) {
		int sum = 0;
		scanf("%d %d", &k, &n);
		printf("%d\n", Apart[k][n]);

	}
}

Fly me to the Alpha Centauri(1011)

1978

문제풀이

void solution_1011() {
	int t, a, b, answer;
	scanf("%d", &t);
	while (t--) {
		unsigned int gap, pos = 1;
		answer = 1;
		scanf("%d %d", &a, &b);
		gap = b - a;
		for (int i = 2; pos < gap; i++) {
			pos += i / 2;
			answer++;
		}
		if (pos > gap) answer--;
		printf("%d\n", answer);
	}
}

댓글남기기