728x90
▶문제 : 코딩테스트 연습 - 우박수열 정적분 | 프로그래머스 스쿨 (programmers.co.kr)
▶코드 작성
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
double area[1000];
int len;
void func(int k) {//우박수열 구하면서 넓이 구하기
if (k == 1) return;
if (k % 2 == 0) {
area[len++] = (double)(k + k / 2) / 2;// k와 k/2 사이의 넓이
func(k / 2);
}
else {
area[len++] = (double)(k + 3 * k + 1) / 2;// k와 3k+1 사이의 넓이
func(k * 3 + 1);
}
}
double *solution(int k, int **ranges, size_t ranges_rows, size_t ranges_cols) {
double *answer = (double *)malloc(sizeof(double) * ranges_rows);
int cnt = 0;
func(k);
int left, right;
double sum;
for (int i = 0; i < ranges_rows; i++) {
left = ranges[i][0];//구하는 구간의 시작점
right = len + ranges[i][1];//구하는 구간의 끝점
sum = 0.0;
if (left > right) answer[cnt++] = -1.0;//유효하지 않는 구간
else {
for (int j = left; j < right; j++) sum += area[j];//구간만큼의 넓이 합
answer[cnt++] = sum;
}
}
return answer;
}
▶해석
우박수열 사이의 넓이를 순서대로 구한 후 구간에 맞게 넓이의 합을 구한다.
이때, 넓이는 우박수열을 구하면서 area배열에 넓이를 구했는데
현재 값 k와 다음 우박수열 값을 더한 후 2로 나누면 그 사이의 넓이를 구할 수 있다.
728x90
'프로그래머스 > C' 카테고리의 다른 글
프로그래머스 Level 2 : 숫자 카드 나누기 C언어 (0) | 2022.12.19 |
---|---|
프로그래머스 Level 1 : 가장 가까운 같은 글자 C언어 (0) | 2022.12.19 |
프로그래머스 Level 2 : 숫자 카드 나누기 C언어 (0) | 2022.11.10 |
프로그래머스 Level 2 : 야간 전술보행 C언어 (0) | 2022.10.31 |
프로그래머스 Level 1 : 햄버거 만들기 C언어 (0) | 2022.10.29 |
댓글