문제 설명

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.

제한사항
  • nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
  • nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.

풀이 방법

1. 숫자 3개를 더한다.

2. 소수를 판별하기 위해서 제곱근 범위 나누기법을 이용하여 isPrime()에 들어온 숫자가 소수인지 판별한다.

3. isPrime(n)이 true라면 소수이므로 answer++한다.

4. answer를 리턴

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

bool isPrime(int num){
    if(num < 1) return false;
    for(int i=2; i<=sqrt(num); i++){
        if(num%i==0) return false;
    }
    return true;
}

int solution(vector<int> nums) {
    int answer = 0;
    
    for(int i=0; i<nums.size(); i++){
        for(int j=i+1; j<nums.size(); j++){
            for(int k=j+1; k<nums.size(); k++){
                int n = nums[i] + nums[j] + nums[k];
                if(isPrime(n)==true){
                    answer++;
                }
            }
        }
    }
    
    return answer;
}

'프로그래머스 > 1레벨' 카테고리의 다른 글

3진법 뒤집기  (0) 2022.12.28
소수 찾기/C++  (1) 2022.12.28
콜라 문제  (0) 2022.12.28
핸드폰 번호 가리기  (0) 2022.12.27
부족한 금액 계산하기  (0) 2022.12.27
  • 콜라 문제
문제 설명

오래전 유행했던 콜라 문제가 있습니다. 콜라 문제의 지문은 다음과 같습니다.

정답은 아무에게도 말하지 마세요.

콜라 빈 병 2개를 가져다주면 콜라 1병을 주는 마트가 있다. 빈 병 20개를 가져다주면 몇 병을 받을 수 있는가?

단, 보유 중인 빈 병이 2개 미만이면, 콜라를 받을 수 없다.

문제를 열심히 풀던 상빈이는 일반화된 콜라 문제를 생각했습니다. 이 문제는 빈 병 a개를 가져다주면 콜라 b병을 주는 마트가 있을 때, 빈 병 n개를 가져다주면 몇 병을 받을 수 있는지 계산하는 문제입니다. 기존 콜라 문제와 마찬가지로, 보유 중인 빈 병이 a개 미만이면, 추가적으로 빈 병을 받을 순 없습니다. 상빈이는 열심히 고심했지만, 일반화된 콜라 문제의 답을 찾을 수 없었습니다. 상빈이를 도와, 일반화된 콜라 문제를 해결하는 프로그램을 만들어 주세요.

콜라를 받기 위해 마트에 주어야 하는 병 수 a, 빈 병 a개를 가져다 주면 마트가 주는 콜라 병 수 b, 상빈이가 가지고 있는 빈 병의 개수 n이 매개변수로 주어집니다. 상빈이가 받을 수 있는 콜라의 병 수를 return 하도록 solution 함수를 작성해주세요.

 

풀이 방법

1. 빈 병을 가져다 주고 받은 병의 수는 ( n / a ) * b 이므로 해당 값을 answer에 더한다.

2. 빈 병을 가져다 주고 병을 받은 후 현재 가지고 있는 병의 수는 ( n / a ) * b + ( n % a )이므로 n에 해당 값을 할당한다.

3. 이것을 n >= a, 즉 현재 가지고 있는 병의 수가 a이상일 때까지 반복한다. 

4. 반복문이 끝나면 answer를 리턴

#include <string>
#include <vector>

int solution(int a, int b, int n) {
    
    int answer = 0;
    
    while(n >= a){
        answer += (n/a) * b; 
        n = ( n / a) * b + (n % a);
    }
    
    return answer;
}

'프로그래머스 > 1레벨' 카테고리의 다른 글

소수 찾기/C++  (1) 2022.12.28
소수 만들기  (1) 2022.12.28
핸드폰 번호 가리기  (0) 2022.12.27
부족한 금액 계산하기  (0) 2022.12.27
음양 더하기  (0) 2022.12.26

문제 설명

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

제한 조건
  • phone_number는 길이 4 이상, 20이하인 문자열입니다.

풀이 방법

1. 뒷 4자리를 제외한 원소들을 *로 바꿔준다.

#include <string>
#include <vector>

using namespace std;

string solution(string phone_number) {
    
    for(int i = 0; i<phone_number.length() - 4; i++){
        phone_number[i] = '*';
    }
    
    return phone_number;
}

 

'프로그래머스 > 1레벨' 카테고리의 다른 글

소수 만들기  (1) 2022.12.28
콜라 문제  (0) 2022.12.28
부족한 금액 계산하기  (0) 2022.12.27
음양 더하기  (0) 2022.12.26
약수의 개수와 덧셈  (0) 2022.12.26

문제 설명

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.

제한사항
  • 놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
  • 처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
  • 놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수

풀이 방법

1. 원래 이용료 price * 탄 횟수 count가 이용료이므로 price에 i를 곱한 값을 sum에 더한다.

2. 이것을 count만큼 반복

3. 이후 금액의 합계 sum이 money보다 작으면 금액이 부족하지 않으므로 0을 리턴

4. 아니면 부족한 금액이 sum - money이므로 이를 리턴

using namespace std;

long long solution(int price, int money, int count)
{
    long long answer = -1;

    long long sum = 0;
    
    for(int i = 1; i <= count; i++){
        sum += price * i;
    }
    
    if (sum <= money) answer = 0;
    else answer = sum - money;
    
    return answer;
}

 

'프로그래머스 > 1레벨' 카테고리의 다른 글

콜라 문제  (0) 2022.12.28
핸드폰 번호 가리기  (0) 2022.12.27
음양 더하기  (0) 2022.12.26
약수의 개수와 덧셈  (0) 2022.12.26
문자열 다루기 기본  (0) 2022.12.26

문제 설명

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.


제한사항
  • absolutes의 길이는 1 이상 1,000 이하입니다.
    • absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
  • signs의 길이는 absolutes의 길이와 같습니다.
    • signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.

풀이 방법

1. signs[i]의 true/false를 판별하여 true면 absolutes[i]를 answer에 더하고 false면 뻬준다.

2. 이를 반복 후 결과를 리턴  

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> absolutes, vector<bool> signs) {
    int answer = 0;
    
    for(int i = 0; i < absolutes.size(); i++){
        if (signs[i] == true)
            answer += absolutes[i];
        else if (signs[i] == false)
            answer -= absolutes[i];
    }
    
    return answer;
}

'프로그래머스 > 1레벨' 카테고리의 다른 글

핸드폰 번호 가리기  (0) 2022.12.27
부족한 금액 계산하기  (0) 2022.12.27
약수의 개수와 덧셈  (0) 2022.12.26
문자열 다루기 기본  (0) 2022.12.26
나머지가 1이 되는 수 찾기  (0) 2022.12.26

문제 설명

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


제한사항
  • 1 ≤ left  right ≤ 1,000

풀이 방법

1. 약수의 개수를 카운트한다.

2. 약수의 개수가 짝수인지 홀수인지 판별해서 answer에 더하거나 뺀다.

3. 이것을 left부터 right까지 반복

4. 결과를 리턴

#include <string>
#include <vector>

using namespace std;

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

    
    return answer;
}

'프로그래머스 > 1레벨' 카테고리의 다른 글

부족한 금액 계산하기  (0) 2022.12.27
음양 더하기  (0) 2022.12.26
문자열 다루기 기본  (0) 2022.12.26
나머지가 1이 되는 수 찾기  (0) 2022.12.26
크기가 작은 부분문자열  (0) 2022.12.26

문제 설명

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

제한 사항
  • s는 길이 1 이상, 길이 8 이하인 문자열입니다.
  • s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.

풀이 방법

1. s의 길이가 4나 6이 아니라면  false 리턴

2. 문자열 중에 숫자가 아닌 부분이 있다면 false 리턴

3. 위의 if문에 모두 만족하지 않는다면 문제의 조건에 부합하므로 true 리턴

#include <string>
#include <vector>

using namespace std;

bool solution(string s) {
    bool answer = true;
    
    if (s.length() != 4 && s.length() != 6) return answer = false;
    
    for(int i = 0; i < s.length();i++){
        if(!(s[i] >= '0' && s[i] <= '9')) return answer = false;
    }
        
    return answer;
}

'프로그래머스 > 1레벨' 카테고리의 다른 글

음양 더하기  (0) 2022.12.26
약수의 개수와 덧셈  (0) 2022.12.26
나머지가 1이 되는 수 찾기  (0) 2022.12.26
크기가 작은 부분문자열  (0) 2022.12.26
정수 내림차순으로 배치하기  (0) 2022.12.25
문제 설명

자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.


제한사항
  • 3 ≤ n ≤ 1,000,000

풀이 방법

1.  answer가 0이 아니면 반복이 끝나는 반복문을 작성한다.

2. 반복문 내에서 n을 num으로 나눈 나머지가 1이면 answer = num이고 아니면 num++를 해준다.

3. 반복문이 끝나면 answer 리턴

#include <string>
#include <vector>

using namespace std;

int solution(int n) {
    int answer = 0;
    int num = 1;
    
    while(answer == 0){
        if( n % num == 1)
            answer = num;
        num++;
    }
    
    return answer;
}

'프로그래머스 > 1레벨' 카테고리의 다른 글

약수의 개수와 덧셈  (0) 2022.12.26
문자열 다루기 기본  (0) 2022.12.26
크기가 작은 부분문자열  (0) 2022.12.26
정수 내림차순으로 배치하기  (0) 2022.12.25
자연수 뒤집어 배열로 만들기  (2) 2022.12.25

문제 설명

숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.

예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.


제한사항
  • 1 ≤ p의 길이 ≤ 18
  • p의 길이 ≤ t의 길이 ≤ 10,000
  • t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.

풀이 방법

1. 문자열 t에서 문자열 p와 길이가 같은 부분을 문자열 str에 담는 반복문을 작성한다.

2. compare함수를 통해 p와 str을 비교하여 크기가 작거나 같으면 answer값에 1을 더해준다.

3. 문자열 str을 비우고 다시 반복한다.

4. 반복문이 끝나면 answer를 리턴

#include <string>
#include <vector>

using namespace std;

int solution(string t, string p) {
    int answer = 0;
    string str = "";
    
    for(int i = 0; i + p.length() - 1 < t.length(); i++){
        for(int j = i; j < i + p.length(); j++){
            str += t.at(j);
        }
        
        if (p.compare(str) >= 0) answer++;
        str.clear();
    }
    
    return answer;
}

'프로그래머스 > 1레벨' 카테고리의 다른 글

문자열 다루기 기본  (0) 2022.12.26
나머지가 1이 되는 수 찾기  (0) 2022.12.26
정수 내림차순으로 배치하기  (0) 2022.12.25
자연수 뒤집어 배열로 만들기  (2) 2022.12.25
자릿수 더하기  (0) 2022.12.25

문제 설명

함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.

제한 조건
  • n은 1이상 8000000000 이하인 자연수입니다.

 

풀이 방법 1

1. to_string 함수로 n을 문자열 s로 변환

2. <algorithm> 라이브러리의 sort()함수를 이용해서 내림차순으로 정렬

3. stoll()함수로 문자열 s를 long long형으로 변환

4. answer 리턴

 

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

using namespace std;

long long solution(long long n) {
    long long answer = 0;
    
    string s = to_string(n);
    
    sort(s.begin(), s.end(), greater<>());
    
    answer = stoll(s);
    
    return answer;
}

 

풀이 방법 2

1. to_string 함수로 n을 문자열 s로 변환

2. 반복문을 통해 각 문자를 비교하여 내림차순으로 정렬

3. stoll()함수로 문자열 s를 long long형으로 변환

4. answer 리턴

#include <string>
#include <vector

using namespace std;

long long solution(long long n) {
    long long answer = 0;
    
    string s = to_string(n);
    
    for (int i = 0; i < s.length() - 1; i++){
        for( int j = i + 1; j < s.length(); j++){
            char temp = ' ';
            if (s.at(i) < s.at(j)) {
                temp = s.at(i);
                s.at(i) = s.at(j);
                s.at(j) = temp;
            }
        }
    }
    
    answer = stoll(s);
    
    return answer;
}

'프로그래머스 > 1레벨' 카테고리의 다른 글

나머지가 1이 되는 수 찾기  (0) 2022.12.26
크기가 작은 부분문자열  (0) 2022.12.26
자연수 뒤집어 배열로 만들기  (2) 2022.12.25
자릿수 더하기  (0) 2022.12.25
약수의 합  (0) 2022.12.25

+ Recent posts