https://www.acmicpc.net/problem/1094

 

소요 시간: 약 52분

체감 난도: ★★☆☆☆

사용 언어: C

 

문제

 

입/출력 및 예시

 

 

풀이

#include <stdio.h>

int num = 1;                // 현재 막대기의 개수
const int MAX = 64;         // 처음 막대기의 길이
int cur_smallest = MAX;     // 현재 가장 짧은 막대기의 길이

// 막대기 총 개수 반환
int re_cut(int answer, int min) {       // 찾는 막대기의 길이와 현재 가장 짧은 막대기의 길이 입력
    if (answer == MAX) {return num;}
    
    num++;          // 막대기를 자름
    min /= 2;
    
    if (min == answer) {    // 내가 찾는 막대기의 길이와 현재 가장 짧은 막대기의 길이가 같으면
        num--;              // 직전에 막대기를 잘랐으니 같은 길이의 막대기가 하나 더 있음 -> 버리기
        return num;         // 막대기 개수 반환
    }
    else if (min > answer)  // 내가 찾는 막대기의 길이보다 현재 가장 짧은 막대기의 길이가 더 길면
    {
        num--;              // 직전에 자른 막대기 버리기
        return re_cut(answer, min);     // 찾는 답과 반으로 짧아진 가장 짧은 막대기의 길이 입력
    }
    else {                  // 내가 찾는 막대기의 길이보다 현재 가장 짧은 막대기의 길이가 짧으면
        return re_cut(answer-min, min); // 내가 찾는 길이에서 현재 가장 짧은 막대기 길이 뺀 길이 입력
    }
    
}

int main(void)
{
    int answer;
    
    scanf("%d", &answer);
    
    int number = re_cut(answer, cur_smallest);
    
    printf("%d\n", number);
    
    return 0;
}

 

 

 

개선사항

재귀함수를 만들어서 써보는 건 처음이었는데, 역시나 계획 없이 무작정 짰다! 재귀 함수 쓸 때 아이디어를 먼저 떠올리고, 증명으로 검토한 후에 코드를 짜는 것이 더 안전할 것 같다. 사실 시도는 했으나 어떤 걸 증명의 대상으로 둬야 할 지 어려움이 있었다. 재귀 함수를 더 써보면서 무엇을 증명해야 할지 염두에 두는 것이 좋겠다.

 

 

 


 

+ Recent posts