문제 설명

햄버거 가게에서 일을 하는 상수는 햄버거를 포장하는 일을 합니다. 함께 일을 하는 다른 직원들이 햄버거에 들어갈 재료를 조리해 주면 조리된 순서대로 상수의 앞에 아래서부터 위로 쌓이게 되고, 상수는 순서에 맞게 쌓여서 완성된 햄버거를 따로 옮겨 포장을 하게 됩니다. 상수가 일하는 가게는 정해진 순서(아래서부터, 빵 – 야채 – 고기 - 빵)로 쌓인 햄버거만 포장을 합니다. 상수는 손이 굉장히 빠르기 때문에 상수가 포장하는 동안 속 재료가 추가적으로 들어오는 일은 없으며, 재료의 높이는 무시하여 재료가 높이 쌓여서 일이 힘들어지는 경우는 없습니다.

예를 들어, 상수의 앞에 쌓이는 재료의 순서가 [야채, 빵, 빵, 야채, 고기, 빵, 야채, 고기, 빵]일 때, 상수는 여섯 번째 재료가 쌓였을 때, 세 번째 재료부터 여섯 번째 재료를 이용하여 햄버거를 포장하고, 아홉 번째 재료가 쌓였을 때, 두 번째 재료와 일곱 번째 재료부터 아홉 번째 재료를 이용하여 햄버거를 포장합니다. 즉, 2개의 햄버거를 포장하게 됩니다.

상수에게 전해지는 재료의 정보를 나타내는 정수 배열 ingredient가 주어졌을 때, 상수가 포장하는 햄버거의 개수를 return 하도록 solution 함수를 완성하시오.


제한사항
  • 1 ≤ ingredient의 길이 ≤ 1,000,000
  • ingredient의 원소는 1, 2, 3 중 하나의 값이며, 순서대로 빵, 야채, 고기를 의미합니다.

풀이 방법

처음에 시간복잡도를 생각 안하고 이중 for문을 돌렸다가 시간 초과가 떠서 당황했다.

 

1. 벡터 num을 만들어 ingredient의 원소를 순서대로 담는다.

2. 해당 벡터의 사이즈가 4이상이 되면 해당 벡터의 마지막 원소부터 총 4개의 원소를 비교해서 1231이 나오면

answer++하고 num에서 pop_back()을 4번 수행하여 해당 원소들을 제거해준다.

3. 이를 ingredient.size() -1까지 반복 후 answer를 리턴

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> ingredient) {
    int answer = 0;
    vector<int> num;
    
    for(auto &n : ingredient) {
        num.push_back(n);
        if(num.size() >= 4) {
            int size = num.size();
            if(num[size - 4] == 1 &&
               num[size - 3] == 2 &&
               num[size - 2] == 3 &&
               num[size - 1] == 1) {
                answer++;
                for(int i = 0; i < 4; i++) num.pop_back();
            }
        }
    }
    
    return answer;
}

 

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

크레인 인형뽑기 게임/C++  (0) 2022.12.30
신규 아이디 추천/C++  (0) 2022.12.30
[1차] 다트게임/C++  (0) 2022.12.30
로또의 최고 순위와 최저 순위/C++  (0) 2022.12.30
[1차] 비밀지도/C++  (0) 2022.12.29

문제 설명

카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.

  1. 다트 게임은 총 3번의 기회로 구성된다.
  2. 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.
  3. 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.
  4. 옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.
  5. 스타상(*)은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상(*)의 점수만 2배가 된다. (예제 4번 참고)
  6. 스타상(*)의 효과는 다른 스타상(*)의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다. (예제 4번 참고)
  7. 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고)
  8. Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.
  9. 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.

0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.

입력 형식

"점수|보너스|[옵션]"으로 이루어진 문자열 3세트.
예) 1S2D*3T

  • 점수는 0에서 10 사이의 정수이다.
  • 보너스는 S, D, T 중 하나이다.
  • 옵선은 *이나 # 중 하나이며, 없을 수도 있다.

출력 형식

3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다.
예) 37

풀이방법

1. 점수가 10이될 수 있으므로 dartResult[i]가 숫자일 때까지 score에 담는다.

2. dartResult[i]가 숫자가 아니고 S,D,T라면 score를 int형으로 변환한 뒤 각각 1제곱, 2제곱, 3제곱하여 scores에 담고 score는 초기화시켜준다.

3-1. dartResult[i]가 '*'이고 들어있는 원소가 하나면 해당 원소만 2배를 해주고 원소가 2개 이상이면 해당 원소와 그 앞의 원소를 2배로 만들어준다.

3-2. dartResult[i]가 '#'이면 해당원소를 -1배를 해준다.

4. 해당 점수들을 모두 더한 값을 리턴한다.

#include <string>
#include <vector>

using namespace std;

int solution(string dartResult) {
    int answer = 0;
    string score = "";
    vector<int> scores;
    int idx = -1;
    
    for(int i = 0; i < dartResult.length(); i++){
        if(dartResult[i] >= '0' && dartResult[i] <= '9') score += dartResult[i];
        else {
            if(dartResult[i] == 'S' || dartResult[i] == 'D' || dartResult[i] == 'T'){
                if(dartResult[i] == 'S') {
                    scores.push_back(stoi(score));
                    score = "";
                    idx++;
                }
                else if(dartResult[i] == 'D') {
                    int n = stoi(score);
                    scores.push_back(n*n);
                    score = "";
                    idx++;
                }
                else if(dartResult[i] == 'T') {
                    int n = stoi(score);
                    scores.push_back(n*n*n);
                    score = "";
                    idx++;
                }
            }
            else if(dartResult[i] == '*'){
                if (idx == 0) scores[idx] *= 2;
                else {
                    scores[idx] *= 2;
                    scores[idx - 1] *= 2;
                }
            }
            else if(dartResult[i] == '#'){
                scores[idx] = -scores[idx];
            }
        }
    }
    
    for(auto &i : scores) answer += i;
    
    return answer;
}

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

신규 아이디 추천/C++  (0) 2022.12.30
햄버거 만들기/C++  (0) 2022.12.30
로또의 최고 순위와 최저 순위/C++  (0) 2022.12.30
[1차] 비밀지도/C++  (0) 2022.12.29
과일 장수/C++  (0) 2022.12.29

제한사항

  • 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

+ Recent posts