수학 205

[백준 2747] 피보나치 수 [C]

풀이 Dynamic Programming 방식으로 풀이했다. 소스코드 #include int fibo(int n){ int fiboNum[2] = {0, 1}; for (int i = 1 ; i < n; i++) fiboNum[(i+1)%2] = fiboNum[i%2] + fiboNum[(i-1)%2]; return fiboNum[n%2]; } int main(){ int n; scanf("%d", &n); printf("%d", fibo(n)); } 출처 2747번: 피보나치 수 피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 ..

[백준 1059] 좋은 구간 [C]

풀이 난이도에 비해 조금 까다로운 문제이다. n을 포함하는 범위(min ~ max)를 알아낸 후, n을 포함하는 범위의 개수를 알아내야 한다. 소스코드 #include #include int compare (const void *a, const void *b){ int n1 = *(int*)a, n2 = *(int*)b; if (n1 n2) return 1; return 0; } int main(){ int L, n; scanf("%d", &L); int S[L]; for(int i = 0; i < L; i++) scanf("%d", &S[i]); scanf("%d", &n); qsort(S, L, sizeof(int), compare); int m..

[백준 01016] 제곱 ㄴㄴ 수 [C]

문제 어떤 정수 X가 1보다 큰 제곱수로 나누어 떨어지지 않을 때, 그 수를 제곱ㄴㄴ수라고 한다. 제곱수는 정수의 제곱이다. min과 max가 주어지면, min보다 크거나 같고, max보다 작거나 같은 제곱ㄴㄴ수가 몇 개 있는지 출력한다. 입력 첫째 줄에 두 정수 min과 max가 주어진다. 출력 첫째 줄에 min보다 크거나 같고, max보다 작거나 같은 제곱ㄴㄴ수의 개수를 출력한다. 제한 1 ≤ min ≤ 1,000,000,000,000 min ≤ max ≤ min + 1,000,000 풀이 문제에서 주어진 "제곱 ㄴㄴ 수"는 수론에서 제곱 인수가 없는 정수(Square-free Integer)로, 1이 아닌 제곱수를 인수로 지 않는 양의 정수이다. 쉽게 정수에 대해 소인수분해를 했을 때 동일한 글에서..

[백준 1011] Fly me to the Alpha Centauri [C]

풀이 입력받은 지점사이의 거리(y-x)는 다음과 같은 규칙성이 존재한다. 거리의 제곱근의 정수를 기준으로 구간이 나뉜다. (ex : 3.0 ~ 3.xx, 4.0 ~ 4.xx), 제곱근의 정수를 n이라고 한다. 거리가 n*n 일때 작동 횟수는 2n - 1번이다. (빨간색) 거리가 n*n보다 크고, n*n + n 이하일 때 작동 횟수는 2n번이다. (초록색) 거리가 n*n + n보다 크고, (n+1)*(n+1)미만 일 때 작동 횟수는 2n + 1번이다. (파랑색) 거리 작동 횟수 이동 기록 1 1 1 2 2 11 3 3 111 4 3 121 5 4 1211 6 4 1221 7 5 12211 8 5 12221 9 5 12321 10 6 123211 11 6 123221 12 6 123321 13 7 12332..

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

풀이 시간제한이 있어 규칙을 찾아 단순 연산으로 풀이해야 하는 문제이다. A만큼 올라갔을 때, V이상이면 멈추고, 그렇지 않으면 B만큼 감소한다. (A-B가 V-B 이상) (V-B) / (A-B)의 값이 위 조건을 성립하지만(소수점 단위를 포함한 최소조건), 날짜(정수)를 기준으로 며칠이 걸리는지 구해야 하기 때문에 다음과 같이 식을 변경했다. 1 + (V-B-1) / (A-B) 소스코드 #include int main(){ int A, B, V; scanf("%d %d %d", &A, &B, &V); printf("%d\n", 1+(V-B-1)/(A-B)); } 출처 2869번: 달팽이는 올라가고 싶다 첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,..

[백준 2839] 설탕 배달 [C]

풀이 5kg 봉지를 최대한 많이 들때, 배달하는 봉지의 개수가 최소인점을 이용해 풀이했다. 입력받은 N을 5(kg)로 나누었을 때 나머지가 0이면 몫이 봉지의 개수이다. 나머지가 0이 아니라면, 몫(cnt)을 한 개씩 줄이고, 3(kg)봉지를 몇개를 추가해야 알맞게 배달할 수 있는지 계산한다. 만약, 나누어 떨어지지 않는다면 cnt는 -1로 감소하며, -1을 출력할 것이다. 소스코드 #include int main() { int N, cnt = 0; scanf("%d", &N); cnt = N / 5; if (N % 5) for (; cnt >= 0; cnt--) if ((N - 5 * cnt) % 3 == 0) { cnt += (N - 5*cnt) / 3; break; } printf("%d\n", c..

[백준 2775] 부녀회장이 될테야 [C]

풀이 층, 호를 입력받을 때마다 거주민을 구하는 방식보다는, 처음부터 모든 층, 호의 거주민을 구하는 방법이 효율적이다. k층 1호는 항상 1명이 거주한다. 0층 n호는 n명 거주한다. k층 n호의 거주민은 k층 n-1호, k-1층 n호 거주민의 합과 동일하다. 소스코드 #include #define F 15 #define NO 14 int main(){ int T, k, n, arr[F][NO]; for (int i = 0; i < F; i++) for (int j = 0; j < NO; j++) arr[i][j] = ((i&&j) ? arr[i][j-1] + arr[i-1][j] : (i?0:i)+j+1); scanf("%d", &T); while (T--){ scanf("%d %d", &k, &n)..

[백준 2292] 벌집 [C]

풀이 중앙의 방으로부터 둘러싼 방의 개수는 6, 12, 18, ... 6의 배수이다. 때문에 입력받은 방의 번호에서 6의 배수만큼 뺴서 몇 개의 방을 지나는지 계산한다. 소스코드 #include int main(){ int N, cnt; scanf("%d", &N); for (cnt = 1; N > 1; cnt++) N -= (6*cnt); printf("%d", cnt); } 출처 2292번: 벌집 위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌 www.acmicpc.net

[백준 1712] 손익분기점 [C]

풀이 손익분기점을 넘기 위한 판매량은 A / (C - B) + 1의 정수값과 같다. B가 C이상일 때는, 판매량에 상관없이 절대로 손익분기점을 넘을 수 없다. 소스코드 #include int main(){ long A, B, C; scanf("%ld %ld %ld", &A, &B, &C); if (B >= C) puts("-1"); else printf("%lld", A/(C-B)+1); } 출처 1712번: 손익분기점 월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와 www.acmicpc.net