본문 바로가기
프로그래머스/C

[프로그래머스/C]프로그래머스 Level 2 : 우박수열 정적분 C언어

by starfish22 2022. 11. 12.
728x90

▶문제 : 코딩테스트 연습 - 우박수열 정적분 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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

댓글