Algorithm Problem Solving/Programmers

[프로그래머스] 약수의 개수와 덧셈, 3진법 뒤집기

코코자장자장 2021. 12. 1. 19:52

안녕하세요! 오늘은 프로그래머스의 약수의 개수와 덧셈, 3진법 뒤집기 두문제를 풀었습니다!

 

둘다 문제가 간단해 한번에 포스팅하려고 합니다! ㅎㅎ

 

 

1. 약수의 개수와 덧셈

 

    약수의 개수와 덧셈 문제입니다. 우선 약수의 개수를 구해야하죠?

 

    약수의 개수를 구하는 함수를 구현하였는데요.

 

    약수를 찾는 법은 간단하게는 모듈로 연산자를 이용해서 구할수 있는데요!

 

    자신보다 작거나 같고 1보다 같거나 큰 수 중 모듈로 했을때 0이면 약수입니다!

 

   이렇게 함수를 만들고 for문 내부에서 if-else문으로 answer에 더할지 뺄지 결정하면 됩니다!

 

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int calcFactorCount(int number) {
    int result = 0;
    for (int i = 1; i <= number; i++) {
        if(number%i == 0) result++;
    }
    return result;
}

int solution(int left, int right) {
    int answer = 0;
    for(int i = left; i <= right; i++) {
        if (calcFactorCount(i)%2==0) answer+=i;
        else answer-=i;
    }
    return answer;
}

2. 3진법 뒤집기 

 

    3진법 뒤집기는 문제에서 시키는대로 구현하면 됩니다!

 

    이런 구현은 문제에서 요구하는것을 정확하게 캐치하고 함수로 큰 부분부분을 나눠서 테스트하면서 푸시면 됩니다!

 

    저는 3부분으로 나눴는데요.

 

    1. 10진수(int)를 3진수(int Array)로 바꾸는 함수

   

        10진수를 3진수로 바꿀때는 재귀함수를 이용하였는데요.

 

        약수의 개수를 구하는 방법에서 썼던 모듈로  연산자를 이용했습니다.

 

        여기선 모듈로 결과가 3진수 배열에 들어가는 숫자로 들어갔고, 재귀함수로는 num인자를 3으로 나눠서 사용하였습니다.

 

         이렇게 하면 3진수(int Array)가 나오게 됩니다! 재귀함수에서 자릿수(maxDepth)도 구할 수 있습니다

   

 

    2. 3진수(int Array)를 뒤집는 함수

       

        이 부분은 구현이 쉬운데요. 

 

        1번에서 구했던 자릿수(maxDepth)를 이용해 또다른 배열에 mapping만 해주면 됩니다!

    

    3. 3진수(int Array)를 10진수(int)로 바꾸는 함수

 

         이 부분도 구현이 2번과 비슷합니다!

 

         지수(buffer)와 자릿수(maxDepth)를 이용해서 result에 누적합을 구하면 됩니다

 

 

    이렇게 나눠 봤습니다. 생각보다 쉽죠?!

 

    다들 즐거운 프로그래밍 쭈욱 이어가시길 바랍니다!

 

   

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int trinary[100] = {0,};
int reverseTrinary[100] = {0,};
int maxDepth = 0;

void makeTrinary(int num, int depth){
    trinary[depth] = num%3;
    if(num/3 == 0) {
        maxDepth = depth;
        return;
    }
    else {
        makeTrinary(num/3, depth+1);
    }
}

void makeReverseTrinary(){
    int tmp = 0;
    for (int i = 0; i <= maxDepth; i++) {
        reverseTrinary[maxDepth-i] = trinary[i]; 
    }
}

int makeDecimal(){
    int result = 0;
    int buffer = 1;
    for(int i = 0; i <= maxDepth; i++) {
        result += reverseTrinary[i]*buffer;
        buffer *= 3;
    }
    return result;
}
int solution(int n) {
    int answer = 0;
    
    makeTrinary(n, 0);
    makeReverseTrinary();
    answer = makeDecimal();
    return answer;
}