"명예의 전당"이라는 TV 프로그램에서는 매일 1명의 가수가 노래를 부르고, 시청자들의 문자 투표수로 가수에게 점수를 부여합니다. 매일 출연한 가수의 점수가 지금까지 출연 가수들의 점수 중 상위 k번째 이내이면 해당 가수의 점수를 명예의 전당이라는 목록에 올려 기념합니다. 즉 프로그램 시작 이후 초기에 k일까지는 모든 출연 가수의 점수가 명예의 전당에 오르게 됩니다. k일 다음부터는 출연 가수의 점수가 기존의 명예의 전당 목록의 k번째 순위의 가수 점수보다 더 높으면, 출연 가수의 점수가 명예의 전당에 오르게 되고 기존의 k번째 순위의 점수는 명예의 전당에서 내려오게 됩니다.

이 프로그램에서는 매일 "명예의 전당"의 최하위 점수를 발표합니다. 예를 들어, k = 3이고, 7일 동안 진행된 가수의 점수가 [10, 100, 20, 150, 1, 100, 200]이라면, 명예의 전당에서 발표된 점수는 아래의 그림과 같이 [10, 10, 10, 20, 20, 100, 100]입니다.

명예의 전당 목록의 점수의 개수 k, 1일부터 마지막 날까지 출연한 가수들의 점수인 score가 주어졌을 때, 매일 발표된 명예의 전당의 최하위 점수를 return하는 solution 함수를 완성해주세요.

제한사항

  • 3 ≤ k ≤ 100
  • 7 ≤ score의 길이 ≤ 1,000
    • 0 ≤ score[i] ≤ 2,000

풀이 방법

1. HallOfFrame에 들어있는 원소의 개수가 k미만이면 score[i]를 담고 내림차순으로 정렬한 다음 i번째에 있는 원소를 반환합니다.

2. 원소의 개수가 k개 이상이면 HallOfFame에 담고 내림차순으로 정렬한 뒤 마지막 원소를 삭제하고 남아있는 원소 중 마지막 원소를 반환한다.

3. answer 리턴

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

using namespace std;

vector<int> solution(int k, vector<int> score) {
    vector<int> answer;
    vector<int> HallOfFame;
    
    for(int i = 0; i < score.size(); i++){
        if(HallOfFame.size() < k) {
            HallOfFame.push_back(score[i]);
            sort(HallOfFame.begin(), HallOfFame.end(), greater<int> ());
            answer.push_back(HallOfFame[i]);
        }
        else{
            HallOfFame.push_back(score[i]);
            sort(HallOfFame.begin(), HallOfFame.end(), greater<int> ());
            HallOfFame.pop_back();
            answer.push_back(HallOfFame[k - 1]);
        }
    }
    
    return answer;
}

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

푸드 파이트 대회/C++  (0) 2023.01.03
가장 가까운 같은 글자/C++  (0) 2023.01.03
완주하지 못한 선수/C++  (0) 2022.12.31
폰켓몬/C++  (0) 2022.12.31
실패율/C++  (0) 2022.12.31

문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

 

제한사항
  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

풀이 방법

1.  map 자료형 선언

2. completion을 순회하며  value를 1씩 증가시킨다.

3. participant를 순회하며 value를 1씩 감소시키며 participant[i]의 value가 0이면 해당 인원이 완주하지 못한 선수이므로 participant[i]를 리턴한다.

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

using namespace std;

string solution(vector<string> participant, vector<string> completion) {
    string answer = "";
    
    map<string, int> complete;
    
    for(int i = 0; i < completion.size(); i++) {
        complete[completion[i]]++;
    }
    
    for(int i = 0; i < participant.size(); i++) {
        if(complete[participant[i]] == 0) return participant[i];
        else complete[participant[i]]--;
    }
    
}

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

가장 가까운 같은 글자/C++  (0) 2023.01.03
명예의 전당 (1)/C++  (0) 2023.01.03
폰켓몬/C++  (0) 2022.12.31
실패율/C++  (0) 2022.12.31
크레인 인형뽑기 게임/C++  (0) 2022.12.30

문제 설명

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.
홍 박사님 연구실의 폰켓몬은 종류에 따라 번호를 붙여 구분합니다. 따라서 같은 종류의 폰켓몬은 같은 번호를 가지고 있습니다. 예를 들어 연구실에 총 4마리의 폰켓몬이 있고, 각 폰켓몬의 종류 번호가 [3번, 1번, 2번, 3번]이라면 이는 3번 폰켓몬 두 마리, 1번 폰켓몬 한 마리, 2번 폰켓몬 한 마리가 있음을 나타냅니다. 이때, 4마리의 폰켓몬 중 2마리를 고르는 방법은 다음과 같이 6가지가 있습니다.

  1. 첫 번째(3번), 두 번째(1번) 폰켓몬을 선택
  2. 첫 번째(3번), 세 번째(2번) 폰켓몬을 선택
  3. 첫 번째(3번), 네 번째(3번) 폰켓몬을 선택
  4. 두 번째(1번), 세 번째(2번) 폰켓몬을 선택
  5. 두 번째(1번), 네 번째(3번) 폰켓몬을 선택
  6. 세 번째(2번), 네 번째(3번) 폰켓몬을 선택

이때, 첫 번째(3번) 폰켓몬과 네 번째(3번) 폰켓몬을 선택하는 방법은 한 종류(3번 폰켓몬 두 마리)의 폰켓몬만 가질 수 있지만, 다른 방법들은 모두 두 종류의 폰켓몬을 가질 수 있습니다. 따라서 위 예시에서 가질 수 있는 폰켓몬 종류 수의 최댓값은 2가 됩니다.
당신은 최대한 다양한 종류의 폰켓몬을 가지길 원하기 때문에, 최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택하려 합니다. N마리 폰켓몬의 종류 번호가 담긴 배열 nums가 매개변수로 주어질 때, N/2마리의 폰켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 하도록 solution 함수를 완성해주세요.

제한사항
  • nums는 폰켓몬의 종류 번호가 담긴 1차원 배열입니다.
  • nums의 길이(N)는 1 이상 10,000 이하의 자연수이며, 항상 짝수로 주어집니다.
  • 폰켓몬의 종류 번호는 1 이상 200,000 이하의 자연수로 나타냅니다.
  • 가장 많은 종류의 폰켓몬을 선택하는 방법이 여러 가지인 경우에도, 선택할 수 있는 폰켓몬 종류 개수의 최댓값 하나만 return 하면 됩니다.

풀이 방법

1. 가장 많은 종류의 방법을 구해야하므로 set 클래스를 이용해서 폰켓몬들의 중복을 제거해준다.

2-1. N마리의 폰켓몬 중 N/2마리를 가져갈 수 있으므로 set.size()가 nums.size() / 2보다 작으면 num.size()/2를 리턴한다.

2-2. set.size()가 nums.size()보다 크면 선택할 수 있는 폰켓몬 종류 개수의 최댓값인 set.size()를 리턴한다.

#include <vector>
#include <set>

using namespace std;

int solution(vector<int> nums)
{
    int answer = 0;
    
    set<int> pokemon;
    
    for(int i = 0; i < nums.size(); i++){
        pokemon.insert(nums[i]);
    }
    
    answer = nums.size() / 2 > pokemon.size() ? pokemon.size() : nums.size() / 2;
    
    return answer;
}

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

명예의 전당 (1)/C++  (0) 2023.01.03
완주하지 못한 선수/C++  (0) 2022.12.31
실패율/C++  (0) 2022.12.31
크레인 인형뽑기 게임/C++  (0) 2022.12.30
신규 아이디 추천/C++  (0) 2022.12.30

문제 설명

슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다.

이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를 완성하라.

  • 실패율은 다음과 같이 정의한다.
    • 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수

전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.

제한사항
  • 스테이지의 개수 N은 1 이상 500 이하의 자연수이다.
  • stages의 길이는 1 이상 200,000 이하이다.
  • stages에는 1 이상 N + 1 이하의 자연수가 담겨있다.
    • 각 자연수는 사용자가 현재 도전 중인 스테이지의 번호를 나타낸다.
    • 단, N + 1 은 마지막 스테이지(N 번째 스테이지) 까지 클리어 한 사용자를 나타낸다.
  • 만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다.
  • 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.

풀이 방법

1. 스테이지별 도달 인원과 클리어 인원을 각각 배열에 담는다.

2. 스테이지 i+1과 실패율 failure를 한 쌍으로 하여 배열에 담는다. (단, 스테이지에 도달한 인원이 없으면 failure는 0이다.)

3. 실패율이 같다면 스테이지 번호를, 다르다면 실패율을 비교해서 내림차순으로 정렬한다.

4. 정렬된 데이터 쌍에서 스테이지 번호인 failure_rate[i].first를 answer에 push_back하고 리턴

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

using namespace std;

bool compare(pair<int, double> pair1, pair<int, double> pair2)
{
    if (pair1.second == pair2.second)
        return pair1.first < pair2.first;
    else
        return pair1.second > pair2.second;
}

vector<int> solution(int N, vector<int> stages) {
    vector<int> answer;
    vector<int> all(N);
    vector<int> clear(N);
    vector<pair<int, double>> failure_rate;
    
    for(int i = 0; i < stages.size(); i++) {
        for(int j = 0; j < stages[i] && j < N; j++){
            all[j]++;
        }
        for(int j = 0; j < stages[i] - 1; j++){
            clear[j]++;
        }
    }
    
    for(int i = 0; i < N; i++) {
        double failure = 0;
        if(all[i] == 0)
            failure = 0;
        else 
            failure = (all[i] - clear[i]) / (float)all[i];
        failure_rate.push_back(make_pair(i+1, failure));
    }
    
    sort(failure_rate.begin(), failure_rate.end(), compare);
    
    for(int i = 0; i < N; i++) {
        answer.push_back(failure_rate[i].first);
    }
    
    return answer;
}

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

완주하지 못한 선수/C++  (0) 2022.12.31
폰켓몬/C++  (0) 2022.12.31
크레인 인형뽑기 게임/C++  (0) 2022.12.30
신규 아이디 추천/C++  (0) 2022.12.30
햄버거 만들기/C++  (0) 2022.12.30

문제설명

크레인 인형뽑기 게임 - 프로그래머스

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[제한사항]

  • board 배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.
  • board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
    • 0은 빈 칸을 나타냅니다.
    • 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
  • moves 배열의 크기는 1 이상 1,000 이하입니다.
  • moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.

풀이 방법

※주어진 라이브러리만 이용해서 풀기 위해 벡터를 스택처럼 사용하였습니다.

1. 2차원 배열 board의 y축 역할을 할 ySize를 선언

2. moves[i]번 위치에서 ySize만큼 반복해서 인형이 들어있는 위치를 찾습니다.

3-1. 바구니에 담을 때 바구니가 비어있지 않고 basket의 마지막 원소와 찾은 위치에 있는 원소가 같다면 마지막 원소와 담을 원소가 사라지므로 pop_back()을 하고 answer += 2를 해줍니다.

3-2. 위 조건에 만족하지 않는다면 basket에 원소를 담아줍니다.

4. moves[i]를 수행했으므로 다음으로 넘어가기 위해 break 해줍니다.

5. 모든 반복문이 끝나면 answer 리턴 

#include <string>
#include <vector>

using namespace std;

int solution(vector<vector<int>> board, vector<int> moves) {
    int answer = 0;
    int ySize = board.size();
    vector<int> basket;
    
    for(int i = 0; i < moves.size(); i++) {
        int k = moves[i] - 1;
        for(int j = 0; j < ySize; j++){
            if(board[j][k] != 0) {
                if(basket.empty() == false && basket.back() == board[j][k]){
                    basket.pop_back();
                    answer += 2;
                }
                else 
                    basket.push_back(board[j][k]);
                board[j][k] = 0;
                break;
            }
        }
    }
    
    return answer;
}

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

폰켓몬/C++  (0) 2022.12.31
실패율/C++  (0) 2022.12.31
신규 아이디 추천/C++  (0) 2022.12.30
햄버거 만들기/C++  (0) 2022.12.30
[1차] 다트게임/C++  (0) 2022.12.30

문제 설명

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로 가입하는 유저들이 카카오 아이디 규칙에 맞지 않는 아이디를 입력했을 때, 입력된 아이디와 유사하면서 규칙에 맞는 아이디를 추천해주는 프로그램을 개발하는 것입니다.
다음은 카카오 아이디의 규칙입니다.

  • 아이디의 길이는 3자 이상 15자 이하여야 합니다.
  • 아이디는 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자만 사용할 수 있습니다.
  • 단, 마침표(.)는 처음과 끝에 사용할 수 없으며 또한 연속으로 사용할 수 없습니다.

"네오"는 다음과 같이 7단계의 순차적인 처리 과정을 통해 신규 유저가 입력한 아이디가 카카오 아이디 규칙에 맞는 지 검사하고 규칙에 맞지 않은 경우 규칙에 맞는 새로운 아이디를 추천해 주려고 합니다.
신규 유저가 입력한 아이디가 new_id 라고 한다면,

1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
     만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.

[문제]

신규 유저가 입력한 아이디를 나타내는 new_id가 매개변수로 주어질 때, "네오"가 설계한 7단계의 처리 과정을 거친 후의 추천 아이디를 return 하도록 solution 함수를 완성해 주세요.

[제한사항]

new_id는 길이 1 이상 1,000 이하인 문자열입니다.
new_id는 알파벳 대문자, 알파벳 소문자, 숫자, 특수문자로 구성되어 있습니다.
new_id에 나타날 수 있는 특수문자는 -_.~!@#$%^&*()=+[{]}:?,<>/ 로 한정됩니다.

 

풀이방법

1. 문제에 적혀있는대로 따라하면 된다.

#include <string>
#include <vector>

using namespace std;

string solution(string new_id) {
    string answer = "";
    
    for(int i = 0; i < new_id.length(); i++) {
        if(new_id[i] >= 'A' && new_id[i] <= 'Z') new_id[i] += 32;
    }
    
    for(int i = 0; i < new_id.length(); i++) {
        if(!(isdigit(new_id[i])) && !(isalpha(new_id[i]))
           && new_id[i] != '-' && new_id[i] != '_' && new_id[i] != '.') {
            new_id.erase(new_id.begin() + i);
            i--;   
        }
        else
            continue;       
    }
    
    for(int i = 0; i < new_id.length() - 1; i++) {
        if(new_id[i] == '.' && new_id[i+1] == '.') {
            new_id.erase(new_id.begin() + i);
            i--;
        }
    }
    
    if(new_id.front() == '.') new_id.erase(new_id.begin());
    if(new_id.back() == '.') new_id.erase(new_id.end() - 1);
    
    if(new_id.empty()) new_id += 'a';
    
    if(new_id.length() > 15) {
        new_id.erase(new_id.begin() + 15, new_id.end());
        if(new_id.back() == '.') new_id.erase(new_id.end() - 1);
    }

    if(new_id.length() < 3) {
        while(new_id.length() != 3) {
            new_id.push_back(new_id.back());
        }
    }
    
    answer = new_id;
    
    return answer;
}

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

실패율/C++  (0) 2022.12.31
크레인 인형뽑기 게임/C++  (0) 2022.12.30
햄버거 만들기/C++  (0) 2022.12.30
[1차] 다트게임/C++  (0) 2022.12.30
로또의 최고 순위와 최저 순위/C++  (0) 2022.12.30

문제 설명

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

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

+ Recent posts