C++ Programmers Test/Level 1

[Programmers] [C++] 최대공약수와 최소공배수 / 제일 작은 수 제거하기

시카Dev 2025. 1. 3. 13:22

 

<문제 설명>
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수
solution을 완성해 보세요. 배열의 맨 앞에 최대공약수,
그다음 최소공배수를 넣어 반환하면 됩니다.
예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로
solution(3, 12)는 [3, 12]를 반환해야 합니다.

<제한 사항>
두 수는 1이상 1000000이하의 자연수입니다.

<입출력 예>
n	m	return
3	12	[3, 12]
2	5	[1, 10]

<입출력 예 설명>
- 입출력 예 #1
위의 설명과 같습니다.

- 입출력 예 #2
자연수 25의 최대공약수는 1, 최소공배수는 10이므로 [1, 10]을 리턴해야 합니다.

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int n, int m) {
    vector<int> answer;
    
    for (int i = m; i > 0; i--) {   //최대공약수
        if ((n % i == 0) && (m % i == 0)) {
            answer.push_back(i);
        }
    }
    if (answer.size() >= 2) {       //공약수가 여러 개라면...
        answer.erase(answer.begin() + 1, answer.end()); //최대공약수 하나만 남기고 삭제
    }
    
    answer.push_back(answer[0]*(n/answer[0])*(m/answer[0])); //최소공배수
        
    return answer;
}

 

gcd 함수 없이 순정식으로 구현해보기 후후...

 


 

<문제 설명>
정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수,
solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔
배열에 -1을 채워 리턴하세요. 예를 들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고,
[10]면 [-1]을 리턴 합니다.

<제한 조건>
arr은 길이 1 이상인 배열입니다.
인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.

<입출력 예>
arr		return
[4,3,2,1]	[4,3,2]
[10]	[-1]

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> arr) {

    int min_idx = min_element(arr.begin(), arr.end()) - arr.begin();
    arr.erase(arr.begin() + min_idx);

    if (arr.size() == 0) {
        arr.push_back(-1);
    }

    return arr;
}

 

algorithm 헤더 안에 배열의 최솟값 인덱스를 구해주는 min_element 함수가 있음을 기억하자!!!

 

그리고 최솟값 인덱스를 구할때 왜 배열의 시작을 빼냐면... min_element가 반환하는 값은 실제 값이 아닌 이터레이터이기 때문이다..!!! 따라서 이때 인덱스가 아니라 실제 값을 참고할려면 *min_element 이런 식으로 * 붙이기!!

 

 

 

[C++] min, max, min_element, max_element 사용법 총정리 최대값 최소값 array vector algorithm #define NOMINMAX

소프트웨어 개발을 하다보면 값을 비교하여 최대값, 최소값을 찾거나 array, vector 등 객체에서 최대값, ...

blog.naver.com

 

이곳에 자세히 설명되어 있어 참고할려고 가져왔당