[알고리즘]프로그래머스 0523

정제철·2023년 5월 23일
0

알고리즘

목록 보기
4/12
post-thumbnail

1. 약수의 합

  • 문제 설명
    정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

  • 입출력 예
    n return
    12 28
    5 6

- 내풀이

#include <iostream>
using namespace std;

int solution(int n) {
    int answer = 0;
    for (int i =1; i<=n;i++)
    {
        if(n%i==0)
        {
            answer+=i;
        }
    }
    return answer;
}

2. 평균 구하기

  • 문제 설명
    정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

  • 입출력 예
    arr | return
    [1,2,3,4] | 2.5
    [5,5] | 5

- 내풀이

#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];
    //}
    for(auto i : arr)
        {
            answer+=i;
        }
    answer/=arr.size();    
    return answer;
}

3. 짝수와 홀수

  • 문제 설명
    정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.

  • 입출력 예
    num return
    3 "Odd"
    4 "Even"

- 내풀이

#include <string>
#include <vector>

using namespace std;

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

- 우수풀이

#include <string>
#include <vector>

using namespace std;

string solution(int num) {
    string answer = "";

    return num & 1 ? "Odd" : "Even";
}

4. 자릿수 더하기

  • 문제 설명
    자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
    예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
  • 입출력 예
    N answer
    123 6
    987 24
  • 제한
    n은 10000000이하의 숫자이다.

- 내풀이

n은 10000000 이하의 숫자이기에 10000000이 될수도 있다는 가정하에 i를 10000000 부터 내려가도록 설정하였다.
1보다 작아질 때까지 10씩 나누고, n이 i보다 커졌을때 앞자리부터 추출한다.

#include <iostream>
#include <vector>
using namespace std;

int solution(int n)
{
    int answer = 0;
	vector<int> N;

    for(int i = 100000000; i >= 1; i = i / 10)
    {
        int num = 0;    
        if(n >= i)
        {            
            num = n / i;
            N.push_back(num);
            n -= num * i;
        }
    }
    for(auto i : N)
    {
        answer += i;
    }

    return answer;
}

- 우수풀이

#include <iostream>
#include <string>
using namespace std;

int solution(int n)
{
    int answer = 0;

    string s = to_string(n);

    for(int i = 0; i < s.size(); i++) 
    {
       answer += (s[i] - '0');
    }

    return answer;
}

- 정석풀이

#include <iostream>
using namespace std;

int solution(int n)
{
    int answer = 0;
    while (n > 0)
    {
        answer += n % 10;
        n /= 10;
    }
    return answer;
}

5. 나머지가 1이 되는 수 찾기

  • 문제 설명
    자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.
  • 제한사항
    3 ≤ n ≤ 1,000,000
  • 입출력 예
    n result
    10 3
    12 11

- 내풀이

#include <string>
#include <vector>

using namespace std;

int solution(int n) {
    int answer = 0;
    vector<int> N;
    for(int i =1; i<n;i++)
    {        
        if(n%i==1)  N.push_back(i);
    }
    for(auto i : N)
    {
        if(n>i) n=i;
    }
    answer=n;
    return answer;
}

- 정석풀이

가장 작은 수 이기때문에 'i'값을 올려가며 가장 먼저나온 수를 반환값으로 지정하면 쉬운 문제였다. 그리고 3보다 큰 수이기때문에 'i=2'로 시작값을 지정해도 무방했다.
너무 어렵게 생각했기에 조금 아쉬움이 남는다.
모든것을 vector로 풀려고 하는 버릇을 고쳐야할 것 같다.

#include <string>
#include <vector>

using namespace std;

int solution(int n) {
    for (int i=2 ; i<n ; i++)
    {
        if (n % i == 1)
        {
            return i;
        }
    }
}

6. 자연수 뒤집어 배열만들기

  • 문제 설명
    자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
  • 입출력 예
    n return
    12345 [5,4,3,2,1]

- 내풀이

#include <string>
#include <vector>

using namespace std;

vector<int> solution(long long n) {
    vector<int> answer;
    int x;
    while (n > 0)
    {
        x=n%10;
        answer.push_back(x);
        n /= 10;
    }
    return answer;
}

- 정석풀이

answer.push_back (n % 10);

따로 변수지정없이 바로 벡터에 넣으면 간편하다는 것을 깨달았다. 그럼 한단계 줄어든다.

#include <string>
#include <vector>

using namespace std;

vector<int> solution(long long n) {
    vector<int> answer;
    while (n > 0) {
        answer.push_back (n % 10);
        n /= 10;
    }
    return answer;
}

7. 정수 제곱근 판별

  • 문제 설명
    임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
    n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
  • 제한 사항
    n은 1이상, 50000000000000 이하인 양의 정수입니다.
  • 입출력 예
    n return
    121 144
    3 -1
  • 입출력 예 설명
    -입출력 예#1
    121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.
    -입출력 예#2
    3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.

- 내풀이

#include <string>
#include <vector>

using namespace std;

long long solution(long long n) 
{
    long long answer =0;
    for (long long i=1;i<n/2+1;i++)
    {
        if(n==i*i)
        {
            answer = (i+1)*(i+1);
            return answer;
        }
    }
    return -1;
}
profile
성공의 반대는 실패가 아닌 도전하지 않는 것이다.

0개의 댓글