이전에 C++로 풀었던 문제를 python으로 다시 풀었다.

입력받은 리스트 arr에 대해서, 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거해야 하는 문제이다.

 

arr 리스트 요소들을 저장할 변수 arr_num 과, answer 리스트에 이미 들어간 요소인 지 확인하기 위한 변수 answer_num을 선언해 준다.

 

def solution(arr):
    answer = []
    #answer 리스트에 들어갈 요소
    answer_num = None
    for i in arr:
        #arr 리스트 요소
        arr_num = i
        #answer 에 이미 들어간 요소인 지 체크
        if arr_num == answer_num:
            continue
        answer_num = arr_num
        answer.append(arr_num)
    return answer

이차원 벡터에 대해 이해하면 풀 수 있는 문제이다.

vector의 자료형으로 vector 를 담아서 사용하는 것을 이차원 벡터로 볼 수 있다. (다차원 배열 같은 느낌..)

예시)

vector<vector<int>> v;
vector<int> tmp;

tmp.push_back(1);
tmp.push_back(2);
v.push_back(tmp); // v의 첫번째 요소로 tmp를 넣어 준다.

cout<<v[0][0]<<endl; // v의 첫번째 요소 접근, "1"이 출력됨
#include <string>
#include <vector>

using namespace std;

vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
    vector<vector<int>> answer;
    vector<int>temp;
    
    // 벡터의 행 단위 for문
    for(int i =0; i<arr1.size(); i++)
    {
    	// 행 단위 요소들을 구하기 위한 for문
        for(int j =0; j<arr1[i].size(); j++)
        {
            temp.push_back(arr1[i][j]+arr2[i][j]);
        }
        answer.push_back(temp);
        temp.clear();
    }
    return answer;
}

테스트 케이스를 아무리 실행해도... 코드를 아무리 뜯어봐도...

마지막 테스트 케이스 3번에서 '-1' 이 아닌 488 이 나왔다...ㅠㅠㅠㅠㅠㅠ

 

찾아보니 마지막 테스트 케이스인 '626331' 이 계산 과정에서 int의 범위를 초과한다고 한다. (input * 3 을 하는 과정이 있으니...)

 

그래서 int 형 input 값 num 을 long long 형으로 변환 해줘서 풀었다..ㅎㅎㅎ

매개변수 상에서 바로 long long으로 변환하면 에러가 나길래... 그냥 long long 변수를 하나 더 선언 후 input 값을 복사해서 사용했다ㅠ

 

#include <string>
#include <vector>

using namespace std;

int solution(int temp) {
    int answer = 0;
    long long num = temp;
    
    while(true)
    {
        if(num == 1)
        {
            break;
        }
        else
        {
            // 입력된 수가 짝수라면 2로 나눈다.
            if(num % 2 == 0)
            {
                num = num/2;
            }
            // 홀수라면 3을 곱하고, 1을 더한다.
            else
            {
                num = (num * 3) +1;
            }
            answer++;
            
            // 500회가 넘어가면 -1을 리턴한다.
            if(answer >= 500)
            {
                answer = -1;
                break;
            }
        }
    }
    return answer;
}

 

 

두 수를 입력받아서 두 수의 최대공약수와 최소공배수를 구하는 문제이다.

 

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int n, int m) {
    vector<int> answer;
    
    int chk = 0;
    int a = n;
    int b = m;
    
    // 유클리드 호제법
    while(b != 0)
    {
        chk = a % b;
        a = b;
        b = chk;
    }
    answer.push_back(a);
    
    // 최소공배수를 구해서 저장
    answer.push_back(n*m/a);
    
    return answer;
}

정수를 저장한 배열 arr 에서 가장 작은 수를 제거한 배열을 리턴해야 하는 문제이다.

단 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴해야 한다.

 

처음에 sort 함수를 사용해서 arr를 정렬시킨 후, 마지막 숫자만 빼서 리턴시키는 방식으로 풀었는데...

테스트케이스는 통과했는데 실제 제출하니까 전부 다 실패가 떳다.ㅠㅠ 멘붕...

 

찾아보니 arr 의 순서가 바뀌면 안 된다고...

예를 들어서 [5, 6, 1, 4] 라는 배열이 들어왔으면, 리턴하는 배열은 [5, 6, 4] 가 되어야 한다는 것이다.

 

그래서 그냥 각 배열 요소끼리 비교해서 제일 작은 수를 찾는 방법을 사용했다.

제일 작은 수와, 그 수의 index를 찾은 후, arr 에서 해당 index의 요소를 제거했다.

그 후 answer 벡터에 arr 벡터의 요소를 복사해주면 된다.

 

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> arr) {
    vector<int> answer;
    
    if(arr.size() == 1)
    {
        answer.push_back(-1);
    }
    else
    {
        int cmp = 0;
        int min = arr[0];
        
        for(int i = 1; i < arr.size(); i++)
        {
            if(min > arr[i])
            {
                min = arr[i];
                cmp = i;
            }
        }
        arr.erase(arr.begin()+cmp);
        
        for(int j =0; j <arr.size(); j++)
        {
            answer.push_back(arr[j]);
        }
    }
    return answer;
}

 

 

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인 지 판단해야 한다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, 아니면 -1을 리턴하는 함수를 작성하는 문제이다.

 

C++의 <cmath> 헤더에서 제공하는 sqrt, pow 함수를 사용하면 쉽게 풀 수 있다.

 

#include <string>
#include <vector>

//sqrt 와 pow 사용을 위해 추가
#include <cmath>

using namespace std;

long long solution(long long n) {
    long long answer = 0;
    
    // 입력받은 숫자 n 에 루트를 씌워서 계산한 값을 반환해 주는 함수
    // 즉 n의 제곱근을 구해줌
    long long temp = sqrt(n);
    
    // n이 어떤 숫자 x 의 제곱근인 경우, x+1의 제곱을 구함
    if(temp * temp == n)
    {
    	// pow(input, num) : input 의 num 제곱을 구하는 함수
        answer = pow(temp+1,2);
    }
    else
    {
        answer = -1;
    }
    return answer;
}

정수를 담고 있는 배열 arr의 평균 값을 return 하는 문제이다.

arr 인자 값을 다 더한 후, arr.size()로 나눠 주면 쉽게 구할 수 있다.

 

#include <string>
#include <vector>

using namespace std;

double solution(vector<int> arr) {
    double answer = 0;
    
    for(int i = 0; i < arr.size(); i++)
    {
        answer += arr[i];
    }
    answer /= arr.size();
    
    return answer;
}

입력받은 정수 n에 대해서, n이 짝수면 "Even" 을 반환하고, 홀수면 "Odd"를 반환한다.

n을 2로 나누었을 때 나누어 떨어지는 경우 짝수로 판단하면 된다.

 

#include <string>
#include <vector>

using namespace std;

string solution(int num) {
    string answer = "";
    if(num %2 == 0)
    {
        answer = "Even";
    }
    else
    {
        answer = "Odd";
    }
    return answer;
}

+ Recent posts