꾸준하고 즐겁게

Programmers Coding Test 연습 문제 - 약수의 개수와 덧셈 (python -> C++) 본문

Coding Test/Programmers

Programmers Coding Test 연습 문제 - 약수의 개수와 덧셈 (python -> C++)

wj9183 2021. 6. 13. 22:10
728x90

https://programmers.co.kr/learn/courses/30/lessons/77884?language=python3 

 

코딩테스트 연습 - 약수의 개수와 덧셈

두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주

programmers.co.kr

 

먼저 파이썬으로 풀었던 코드다.

 

 

 

def solution(left, right):
    temp = []
    answer = 0
    #레프트 ~ 라이트 모든 수
    for i in range(left, right+1):
        #그 수의 약수 찾기
        for j in range(1, i+1):
            #약수가 있다
            if i % j == 0:
                #리스트에 넣는다.
                temp.append(j)
        #약수 다 찾고
        if len(temp) % 2 == 0:
            answer += i
        elif len(temp) % 2 == 1:
            answer -= i
        temp = []
    return answer

그냥 순서대로 설명해보겠다.

temp라는 리스트와 answer라는 변수를 만든다.

 

반복문으로 left 이상 right 이하의 사이의 숫자를 하나씩 가져올 것이다.

그리고 1 이상 그 숫자 이하의 모든 수 i를 가져오고 그중에 약수를 골라 리스트에 담는다.

 

약수를 다 찾아서 약수의 갯수가 짝수개면 미리 만들어둔 answer 변수에 더하고, 아니면 뺀다.

한 숫자의 약수를 가져왔으면 다른 숫자의 약수를 또 가져와야한다.

temp 리스트에 이미 가져온 약수들이 가득 차 있으면 문제가 있으므로 약수를 구하는 반복문이 끝날 때마다 temp를 빈 리스트로 초기화한다.

 

이 문제 파이썬으로 푸는 거 빼먹고 넘어갔던 것 같은데, 왜 까먹었는지는 몰라도 아무튼 오늘 풀어서 점수도 부분도 편집 안하고 넣어봤다. 별 거 아니지만 뿌듯.

 

#include <string>
#include <vector>

using namespace std;

int solution(int left, int right) {
    int answer = 0;
 
    
    for(int i = left; i <= right; i++)
    {
        std::vector<int> temp;
        for (int j = 1; j <= i; j++)
        {
            if(i % j == 0)
            {
                temp.push_back(j);
            }
        }
        if(temp.size() % 2 == 0)
        {
            answer = answer + i;
        }
        else
        {
            answer = answer - i;
        }
        
    }
    return answer;
}

그리고 알고리즘은 파이썬에서 했던 그대로다.

 

그냥 C 같은데 std::vector<int> temp; 부분만 C++이다.

이 부분은 C++에서 temp라는 이름의 int 자료형 데이터를 담을 수 있는 벡터를 선언한 것이다.

그냥 int가 들어가는 리스트라고 생각하고 썼다.

밑에 push_back 함수도 있다.

728x90