제한사항

  • lottos는 길이 6인 정수 배열입니다.
  • lottos의 모든 원소는 0 이상 45 이하인 정수입니다.
    • 0은 알아볼 수 없는 숫자를 의미합니다.
    • 0을 제외한 다른 숫자들은 lottos에 2개 이상 담겨있지 않습니다.
    • lottos의 원소들은 정렬되어 있지 않을 수도 있습니다.
  • win_nums은 길이 6인 정수 배열입니다.
  • win_nums의 모든 원소는 1 이상 45 이하인 정수입니다.
    • win_nums에는 같은 숫자가 2개 이상 담겨있지 않습니다.
    • win_nums의 원소들은 정렬되어 있지 않을 수도 있습니다.

풀이방법 1

1. 0의 개수와 번호가 일치하는 개수를 센다.

2. 최고 순위는 0이 모두 정답인 경우이므로 countAnswer + countZero이다.

3. countAnswer + countZero가 1이하라면 낙첨이므로 6을 push_back하고 2이상이라면 7 - countAnswer + countZero를 push_back 한다.

4. 최저 순위는 0이 모두 정답이 아닌 경우이므로 countAnswer이다.

5. 마찬가지로 countAnswer로 위의 3번을 수행한다.

6. answer 리턴

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> lottos, vector<int> win_nums) {
    vector<int> answer;
    int countZero = 0;
    int countAnswer = 0;
    
    for(int i = 0; i < 6; i++){
        if (lottos[i] == 0) {
            countZero++;
        } else {
            for(int j = 0; j < 6; j++)
            if(lottos[i] == win_nums[j])
                countAnswer++;
        }
    }
    
    if(countAnswer + countZero < 2)
        answer.push_back(6);
    else
        answer.push_back(7 - (countAnswer + countZero));
    
    if(countAnswer< 2)
        answer.push_back(6);
    else
        answer.push_back(7 - countAnswer);
    
    return answer;
}

 

풀이방법 2

1. 0의 개수와 번호가 일치하는 개수를 센다.

2. 최고 순위는 0이 모두 정답인 경우이므로 countAnswer + countZero이고 최저 순위는 0이 모두 정답이 아닌 경우이므로 countAnswer이다.

3. map 자료구조를 이용해 각 값에 따른 순위를 매칭시켜준다.

4. answer 리턴

 

#include <string>
#include <vector>
#include <map>

using namespace std;

vector<int> solution(vector<int> lottos, vector<int> win_nums) {
    vector<int> answer;
    int countZero = 0;
    int countAnswer = 0;
    
    for(int i = 0; i < 6; i++){
        if (lottos[i] == 0) {
            countZero++;
        } else {
            for(int j = 0; j < 6; j++)
            if(lottos[i] == win_nums[j])
                countAnswer++;
        }
    }
    
    map<int,int> result_match;
    result_match[0] = 6;
    result_match[1] = 6;
    result_match[2] = 5;
    result_match[3] = 4;
    result_match[4] = 3;
    result_match[5] = 2;
    result_match[6] = 1;
    
    answer.push_back(result_match[countAnswer + countZero]);
    answer.push_back(result_match[countAnswer]);
    
    return answer;
}

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

햄버거 만들기/C++  (0) 2022.12.30
[1차] 다트게임/C++  (0) 2022.12.30
[1차] 비밀지도/C++  (0) 2022.12.29
과일 장수/C++  (0) 2022.12.29
내적  (0) 2022.12.29

문제 설명

 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.

  1. 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다.
  2. 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 "지도 1"과 "지도 2"라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다.
  3. "지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다.
  4. 암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.

네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.

입력 형식

입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.

  • 1 ≦ n ≦ 16
  • arr1, arr2는 길이 n인 정수 배열로 주어진다.
  • 정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다.

출력 형식

원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.

풀이 방법

1. or 연산자를 통해 arr1[i] % 2와 arr2[i] % 2가 둘 다 false라면 temp의 앞에 공백을 넣고 아니라면 #을 넣는다.

2. n-1까지 반복했다면 temp를 answer에 push_back해주고 temp를 비워준다.

3. 이를 n까지 반복한 뒤 결과 answer를 리턴한다.

#include <string>
#include <vector>

using namespace std;

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    string temp = "";
    
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n - 1; j++){
            (arr1[i] % 2) || (arr2[i] % 2) ? temp = "#" + temp : temp = " " + temp;
            arr1[i] /= 2;
            arr2[i] /= 2;
        }
        (arr1[i] % 2) || (arr2[i] % 2) ? temp = "#" + temp : temp = " " + temp;
        answer.push_back(temp);
        temp.clear();
    }
    
    return answer;
}

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

[1차] 다트게임/C++  (0) 2022.12.30
로또의 최고 순위와 최저 순위/C++  (0) 2022.12.30
과일 장수/C++  (0) 2022.12.29
내적  (0) 2022.12.29
예산  (0) 2022.12.29

문제 설명

과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 1점부터 k점까지의 점수로 분류하며, k점이 최상품의 사과이고 1점이 최하품의 사과입니다. 사과 한 상자의 가격은 다음과 같이 결정됩니다.

  • 한 상자에 사과를 m개씩 담아 포장합니다.
  • 상자에 담긴 사과 중 가장 낮은 점수가 p (1 ≤ p ≤ k)점인 경우, 사과 한 상자의 가격은 p * m 입니다.

과일 장수가 가능한 많은 사과를 팔았을 때, 얻을 수 있는 최대 이익을 계산하고자 합니다.(사과는 상자 단위로만 판매하며, 남는 사과는 버립니다)

예를 들어, k = 3, m = 4, 사과 7개의 점수가 [1, 2, 3, 1, 2, 3, 1]이라면, 다음과 같이 [2, 3, 2, 3]으로 구성된 사과 상자 1개를 만들어 판매하여 최대 이익을 얻을 수 있습니다.

  • (최저 사과 점수) x (한 상자에 담긴 사과 개수) x (상자의 개수) = 2 x 4 x 1 = 8

사과의 최대 점수 k, 한 상자에 들어가는 사과의 수 m, 사과들의 점수 score가 주어졌을 때, 과일 장수가 얻을 수 있는 최대 이익을 return하는 solution 함수를 완성해주세요.

제한사항
  • 3 ≤ k ≤ 9
  • 3 ≤ m ≤ 10
  • 7 ≤ score의 길이 ≤ 1,000,000
    • 1 ≤ score[i] ≤ k
  • 이익이 발생하지 않는 경우에는 0을 return 해주세요.

풀이 방법

1. score 배열을 오름차순으로 정렬한다.

2. box만큼 answer에 m에 각 상자의 첫번째 인덱스의 원소 값을 곱한 값, 즉 m * score[score.size() - m * count]를 더한다.

3. box가 0이되면 반복문을 끝내고 answer 리턴

 

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

using namespace std;

int solution(int k, int m, vector<int> score) {
    int answer = 0;
    int count = 1;
    int box = score.size() / m;
    
    sort(score.begin(), score.end());
    
    while(box > 0){
        answer += m * (score[score.size() - m*count]);
        box--;
        count++;
    }
    
    return answer;
}

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

로또의 최고 순위와 최저 순위/C++  (0) 2022.12.30
[1차] 비밀지도/C++  (0) 2022.12.29
내적  (0) 2022.12.29
예산  (0) 2022.12.29
하샤드 수  (0) 2022.12.29

문제 설명

길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.

이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)


제한사항
  • a, b의 길이는 1 이상 1,000 이하입니다.
  • a, b의 모든 수는 -1,000 이상 1,000 이하입니다.

풀이 방법

1. i = 0부터 a.size() -1까지 answer에 a[i]*b[i]를 더한다.

2. answer를 리턴

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> a, vector<int> b) {
    int answer = 0;
    
    for(int i = 0; i < a.size(); i++){
        answer += a[i] * b[i];
    }
    
    return answer;
}

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

[1차] 비밀지도/C++  (0) 2022.12.29
과일 장수/C++  (0) 2022.12.29
예산  (0) 2022.12.29
하샤드 수  (0) 2022.12.29
콜라츠 추측  (0) 2022.12.29
문제 설명

S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.

물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.

부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.

제한사항
  • d는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)는 1 이상 100 이하입니다.
  • d의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액은 1 이상 100,000 이하의 자연수입니다.
  • budget은 예산을 나타내며, 1 이상 10,000,000 이하의 자연수입니다.

풀이 방법

1. 벡터 d를 오름차순으로 정렬해줍니다.

2. 신청한 금액의 합 sum에 부서별 신청 금액 d[i]를 더한뒤 answer++해줍니다.

3. 이를 d.size() - 1까지 반복하고 answer를 리턴합니다. 

4. 반복문을 수행하는 중 sum이 budget보다 커지면 break하고 answer를 리턴합니다.

 

#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>

using namespace std;

int solution(vector<int> d, int budget) {
    int answer = 0;
    int temp = 0;
    int sum = 0;
    
    for (int i = 0; i < d.size() - 1; i++) {
        for (int j = i + 1; j < d.size(); j++){
                if(d[i] > d[j]) {
                temp = d[i];
                d[i] = d[j];
                d[j] = temp;
            }
        }
    }
    
    for(int i = 0; i < d.size(); i++) {
        sum += d[i];
        if (budget < sum) break;
        answer++;
    }
    
    return answer;
}

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

과일 장수/C++  (0) 2022.12.29
내적  (0) 2022.12.29
하샤드 수  (0) 2022.12.29
콜라츠 추측  (0) 2022.12.29
행렬의 덧셈  (0) 2022.12.29

문제 설명

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

제한 조건
  • x는 1 이상, 10000 이하인 정수입니다.

풀이 방법

1. x의 각 자릿수들을 합한다.

2-1. x가 각 자릿수의 합 sum으로 나누어 떨어지면 x는 하샤드 수이므로 true 리턴

2-2. x가 sum으로 나누어 떨어지지 않으면 x는 하샤드 수가 아니므로 false 리턴

#include <string>
#include <vector>

using namespace std;

bool solution(int x) {
    bool answer = true;
    int sum = 0;
    int num = x;
    
    while(num > 0){
        sum += num % 10;
        num /= 10;
    }
    
    if (x % sum == 0) answer = true;
    else answer = false;
    
    return answer;
}

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

내적  (0) 2022.12.29
예산  (0) 2022.12.29
콜라츠 추측  (0) 2022.12.29
행렬의 덧셈  (0) 2022.12.29
모의고사  (0) 2022.12.28

문제 설명

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

1-1. 입력된 수가 짝수라면 2로 나눕니다. 
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. 
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다. 

예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.

제한 사항
  • 입력된 수, num은 1 이상 8,000,000 미만인 정수입니다.

풀이 방법

1. 입력된 수가 짝수라면 num /= 2, 홀수라면 num = num*3 + 1을 수행하고 결과로 나온 수에 같은 작업을 반복합니다.

2. 이를 반복할 때마다 answer++을 해줍니다.

3-1. num == 1이되면 break하고 answer를 리턴

3-2. answer == 500이 될 때까지 num == 1이 되지 않는다면 -1을 리턴합니다.

#include <string>
#include <vector>

using namespace std;

int solution(int num) {
    int answer = 0;
    
    while(true) {
        if(num == 1) break;
        if(answer == 500) {
            answer = -1;
            break;
        }
        
        if(num % 2 == 0) num /= 2;
        else if( num % 2 == 1) num = num * 3 + 1;
        
        answer++;
    }
    
    return answer;
}

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

예산  (0) 2022.12.29
하샤드 수  (0) 2022.12.29
행렬의 덧셈  (0) 2022.12.29
모의고사  (0) 2022.12.28
문자열 나누기  (0) 2022.12.28

문제 설명

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

제한 조건
  • 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.

풀이 방법

1. 내부를 순회하며 더한 값을 arr3에 저장한 뒤 arr3를 answer에 push_back()한다.

2. 이를 끝까지 반복하고 answer를 리턴

#include <string>
#include <vector>

using namespace std;

vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
    vector<vector<int>> answer;
    
    for(int i = 0; i < arr1.size(); i++){
        vector<int> arr3;
        
        for(int j = 0; j < arr1[i].size(); j++){
            arr3.push_back(arr1[i][j] + arr2[i][j]);
        }
        
        answer.push_back(arr3);
        arr3.clear();
    }
    
    return answer;
}

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

하샤드 수  (0) 2022.12.29
콜라츠 추측  (0) 2022.12.29
모의고사  (0) 2022.12.28
문자열 나누기  (0) 2022.12.28
숫자 문자열과 영단어  (0) 2022.12.28

+ Recent posts