[BOJ_step_09] 수학1 01 ~ 08
수학1
수학을 다루는 문제들을 해결해 보자.
손익 분기점(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)
문제풀이
무게가 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)
문제풀이
벌집이 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)
문제풀이
주어진 예시를 보면 지그재그 순서에서 방향이 바뀔때를 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)
문제풀이
쉽게 생각하면 오르고 내리고를 며칠이나 반복해야하는지를 구하는 문제 같지만 그렇지 않다.
맨 마지막 날은 올라가기만 해도 이 문제의 조건은 충족하기 때문이다.
따라서 맨 마지막날은 무조건 올라간다
라고 생각하여 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)
문제풀이
이 문제를 처음에 풀었을 때는 n
이 h
보다 크다면 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)
문제풀이
문제의 설명 그대로 아래층의 n호 까지의 합을 15 x 15
에 대하여 모두 구해놓고 해당 k
층 n
호의 수를 구한다.
점화식으로 해결할 수 있지 않을까… 규칙은 나오는데 식이 떠오르지않는다…
생각나면 다시 풀어봐야겠다
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)
문제풀이
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);
}
}
댓글남기기