프로그래머스

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

programmers.co.kr

 

문제 조건

  • name의 길이 = yearning의 길이
  • 각 사진마다 사진에 포함된 인물의 그리움 점수를 합산하여 추억 점수를 구함

 

문제 풀이

  1. name을 key로 yearning을 value로 가지는 자료구조 m 선언
  2. 각 사진에 포함된 인물 이름을 통해 그리움 점수를 구하고 합산하여 answer에 삽입
  3. 출력
#include <string>
#include <vector>
#include <map>

using namespace std;

vector<int> solution(vector<string> name, vector<int> yearning, vector<vector<string>> photo) {
    vector<int> answer;
    map<string, int> m;
    
    int nameLength = name.size();
    int photoLength = photo.size();
    
    for(int i = 0; i < nameLength; i++)
        m[name[i]] = yearning[i];
    
    for(int i = 0; i < photoLength; i++) {
        int sum = 0;
        
        for(string element : photo[i]) {
            sum += m[element];
        }
        
        answer.push_back(sum);
    }
    
    return answer;
}

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

[프로그래머스/C++] 달리기 경주  (0) 2023.06.29
[프로그래머스/C++] 덧칠하기  (0) 2023.06.29
대충 만든 자판/C++  (0) 2023.02.28
카드 뭉치/C++  (0) 2023.02.28
개인정보 수집 유효기간/C++  (0) 2023.02.06
 

프로그래머스

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

programmers.co.kr

문제 조건

  • keymap[i]는 i + 1번 눌렀을 때 바뀌는 문자이다.
  • answer는 targets[i] 문자열을 만들기 위해 키를 눌러야하는 최소 횟수들을 더한 것이다.
  • targets[i] 문자열을 작성할 수 없을 때는 -1을 리턴한다. 

문제 풀이

  1. 각 문자마다 최소 횟수들을 저장하기 위해 char을 key, int를 value로 가지는 m을 선언한다.
  2. map에 각 keymap[i][j]의 j + 1 중 최솟값을 저장한다.
  3. m에 targets[i][j]가 있다면 count에 targets[i][j]를 더하고 아니라면 count = -1을 한 후 answer에 담는다.
  4. targets의 모든 원소에 해당 작업이 수행된 후 answer 리턴
#include <string>
#include <vector>
#include <map>

using namespace std;

vector<int> solution(vector<string> keymap, vector<string> targets) {
    vector<int> answer;
    map<char, int> m;
    
    for(int i = 0; i < keymap.size(); i++) {
        for(int j = 0; j < keymap[i].size(); j++) {
            if(m.find(keymap[i][j]) != m.end()) {
                if(m[keymap[i][j]] < j + 1)
                    continue;
                else
                    m[keymap[i][j]] = j + 1;
                }
            else {
                m[keymap[i][j]] = j + 1;
            }
        }
    }
    
    for(int i = 0; i < targets.size(); i++) {
        int count = 0;
        for(int j = 0; j < targets[i].size(); j++) {
            if(m.find(targets[i][j]) != m.end())
                count += m[targets[i][j]];
            else {
                count = -1;
                break;
            }
        }
        answer.push_back(count);
    }
    
    return answer;
}

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

[프로그래머스/C++] 덧칠하기  (0) 2023.06.29
[프로그래머스/C++] 추억 점수  (0) 2023.06.29
카드 뭉치/C++  (0) 2023.02.28
개인정보 수집 유효기간/C++  (0) 2023.02.06
둘만의 암호/C++  (0) 2023.02.03
 

프로그래머스

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

programmers.co.kr

문제 조건

  • cards1, cards2에 들어있는 단어들로 goal을 만들 수 있으면 Yes, 아니면 No 리턴
  • 각 배열에 들어있는 단어들은 배열 내의 순서대로만 사용 가능
  • 특정 카드를 사용하지 않고 넘어가는 것은 불가능

 

풀이 방법

  1. 각 배열에서 단어가 얼마만큼 사용됐는지 판별하기 위한 index1, index2 선언
  2. goal 배열을 범위 기반 for문을 돌려 카드 배열의 index 번째의 문자열이 str과 일치하고 index가 카드 배열의 크기보다 작으면 해당 index를 증가시킨다. 
  3. 두 개의 배열 모두 조건을 만족시키지 않는다면 goal을 만들 수 없으므로 No를 리턴한다.
  4. goal의 끝까지 조건을 모두 만족 시켰다면 goal을 만들 수 있으므로 Yes를 리턴한다.
#include <string>
#include <vector>

using namespace std;

string solution(vector<string> cards1, vector<string> cards2, vector<string> goal) {
    string answer = "Yes";
    int index1, index2 = 0;
    
    for(auto& str : goal) {
        if(cards1[index1] == str && cards1.size() > index1)
            index1++;
        else if(cards2[index2] == str && cards2.size() > index2)
            index2++;
        else {
            answer = "No";
            break;
        }
    }
    
    return answer;
}

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

[프로그래머스/C++] 추억 점수  (0) 2023.06.29
대충 만든 자판/C++  (0) 2023.02.28
개인정보 수집 유효기간/C++  (0) 2023.02.06
둘만의 암호/C++  (0) 2023.02.03
신고 결과 받기/C++  (0) 2023.01.03
 

프로그래머스

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

programmers.co.kr

풀이방법

 

각 문자열을 잘른 뒤 오늘 날짜와 개인정보 수집 일자 + 약관 종류에 따른 유효기간을 비교해서 후자가 전자보다 작을 시 해당 개인정보는 파기해야하므로 해당 개인정보의 번호를 answer에 담는다.

 

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

using namespace std;

vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
    vector<int> answer;
    vector<int> privDate;
    map<char, int> m;
    
    int todayY = stoi(today.substr(0, 4));
    int todayM = stoi(today.substr(5, 2));
    int todayD = stoi(today.substr(8, 2));
    
    int totalD = todayY * 12 * 28 + (todayM - 1) * 28 + todayD;
    
    for(int i = 0; i < terms.size(); i++)
        m[terms[i][0]] = stoi(terms[i].substr(terms[i].find(" "), terms[i].size() - 1));
    
    for(int i = 0; i < privacies.size(); i++) {
        int privY = stoi(privacies[i].substr(0, 4)); 
        int privM = stoi(privacies[i].substr(5, 2)); 
        int privD = stoi(privacies[i].substr(8, 2));
        char privT = privacies[i].back();
         
        int tmp = privY * 12 * 28 + (privM - 1) * 28 + privD + (m[privT] * 28 - 1);
        
        privDate.push_back(tmp);
    }
    
    for(int i = 0; i < privDate.size(); i++)
        if(privDate[i] < totalD) answer.push_back(i + 1);
    
    return answer;
}

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

대충 만든 자판/C++  (0) 2023.02.28
카드 뭉치/C++  (0) 2023.02.28
둘만의 암호/C++  (0) 2023.02.03
신고 결과 받기/C++  (0) 2023.01.03
성격 유형 검사하기/C++  (0) 2023.01.03
 

프로그래머스

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

programmers.co.kr

풀이방법

문자열 s의 각 알파벳에 index만큼 뒤에 있는 알파벳을 구하되 문자열 skip에 있는 알파벳은 카운트하지 않아야한다.

이를 구현하기 위해 문자열 s의 각 알파벳에 index번 만큼 1을 더하였을 때 해당 알파벳이 skip에 들어있는 알파벳일 경우 반복 횟수를 한 번씩 늘려주도록 했다. 또한 s와 skip은 알파벳 소문자로만 이루어져 있으므로 s[i]에 1을 더하였을 시 아스키 코드 값이 122를 초과한다면 a가 되도록 하였다.

 

 

1. 알파벳의 검사를 위해 int형 변수 cur을 선언

2. s[i]에 ++해준다.

3. s[i]가 z보다 커지면 a로 변환하고 find함수로 s[i]가 skip안에 있는지 찾고 있다면 반복 횟수를 늘려주고 없다면 계속해서 수행한다.

4. 이를 index번만큼 반복 후 변환된 문자열 s를 리턴

#include <string>
#include <vector>

using namespace std;

string solution(string s, string skip, int index) {
    int cur = 0;
    
    for(int i = 0; i < s.size(); i++) {
        for(int j = 0; j < index; j++) {
            s[i]++;
            if(s[i] > 'z') s[i] = 'a';
            
            cur = skip.find(s[i]);
            if(cur == -1)
                continue;
            else j--;
        }
    }
    
    return s;
}

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

카드 뭉치/C++  (0) 2023.02.28
개인정보 수집 유효기간/C++  (0) 2023.02.06
신고 결과 받기/C++  (0) 2023.01.03
성격 유형 검사하기/C++  (0) 2023.01.03
숫자 짝꿍/C++  (1) 2023.01.03

프로그래머스 - 신고 결과 받기

 

프로그래머스

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

programmers.co.kr

풀이 방법

1. answer를 id_list.size()만큼 0으로 초기화 시켜준다.

2. map 자료형 id_lists를 선언하고 id_list와 각 원소의 인덱스를 각각 key,value로 저장한다.

3. 문자열을 공백을 기준으로 두 개의 문자열 from, to로 자르고 reports2[to]에 from을 insert한다.

4. reports를 순회하며 각 key 값의 value의 길이가 k이상이면 해당 value에 들어있는 id에 ++해준다.

5. answer 리턴

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

using namespace std;

vector<int> solution(vector<string> id_list, vector<string> reports, int k) {
    vector<int> answer(id_list.size(),0);
    
    map<string, int> id_lists;
    map<string, set<string>> reports2;
    
    for (int i=0; i < id_list.size(); ++i){
        id_lists[id_list[i]] = i;
    }

    
    for(auto &report : reports){
        string from = report.substr(0, report.find(' '));
        string to = report.substr(report.find(' ') + 1, report.length() - report.find(' '));
        
        reports2[to].insert(from);
    }
    
    for (auto rep : reports2){
        if (rep.second.size() >= k){
            for (auto list : rep.second){
                answer[id_lists[list]]++;
            }
        }
    }
    
    return answer;
}

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

개인정보 수집 유효기간/C++  (0) 2023.02.06
둘만의 암호/C++  (0) 2023.02.03
성격 유형 검사하기/C++  (0) 2023.01.03
숫자 짝꿍/C++  (1) 2023.01.03
푸드 파이트 대회/C++  (0) 2023.01.03

프로그래머스 - 성격 유형 검사하기

 

프로그래머스

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

programmers.co.kr

풀이 방법

1. choices의 원소를 인덱스로 가지고 각 원소에 따른 점수를 배열에 저장한다.

2. map 자료형 m을 선언한다.

3-1. 반복문을 돌며 choices[i]가 4보다 작으면 survey[i]의 첫 번째 글자의 value에 점수를 더한다.

3-2. choices[i]가 4보다 크면 survey[i]의 두 번째 글자의 value에 점수를 더한다.

4. 각 지표 번호에 속하는 문자의 value를 비교해서 더 큰 문자를 answer에 더한다.

5. answer 리턴

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

using namespace std;

string solution(vector<string> survey, vector<int> choices) {
    string answer = "";
    
    int score[8] = {0, 3, 2, 1, 0, 1, 2, 3};
    map<char, int> m;
    
    for(int i = 0; i < survey.size(); i++){
        if(choices[i] < 4) m[survey[i][0]] += score[choices[i]];
        else if(choices[i] > 4) m[survey[i][1]] += score[choices[i]];
        else continue;
    }
    
    answer += m['R'] >= m['T'] ? "R" : "T";
    answer += m['C'] >= m['F'] ? "C" : "F";
    answer += m['J'] >= m['M'] ? "J" : "M";
    answer += m['A'] >= m['N'] ? "A" : "N";
    
    return answer;
}

 

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

둘만의 암호/C++  (0) 2023.02.03
신고 결과 받기/C++  (0) 2023.01.03
숫자 짝꿍/C++  (1) 2023.01.03
푸드 파이트 대회/C++  (0) 2023.01.03
가장 가까운 같은 글자/C++  (0) 2023.01.03

문제 설명

두 정수 X, Y의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). X, Y의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. X, Y의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0입니다.

예를 들어, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 다른 예시로 X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 2, 5, 5로 만들 수 있는 가장 큰 정수인 552입니다(X에는 5가 3개, Y에는 5가 2개 나타나므로 남는 5 한 개는 짝 지을 수 없습니다.)
두 정수 X, Y가 주어졌을 때, X, Y의 짝꿍을 return하는 solution 함수를 완성해주세요.

 

제한사항
  • 3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000입니다.
  • X, Y는 0으로 시작하지 않습니다.
  • X, Y의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.

풀이 방법

1. map 자료형 m1을 선언하고 문자열 X의 각 원소를 담는다.

2. 문자열 Y를 순회하며 m1[c]가 0이 아니면 answer에 c를 더하고 m1[c]--를 한다.

3. answer를 내림차순으로 정렬한다.

4-1. answer가 비어 있으면 -1 리턴

4-2. 길이가 2 이상이고 answer의 첫번째 원소가 0이면 첫 번째 원소를 삭제

5. answer 리턴

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

using namespace std;

string solution(string X, string Y) {
    string answer = "";
    
    map<char, int> m1;
    
    for(int i = 0; i < X.length(); i++) m1[X[i]]++;
    
    for(auto &c : Y){
        if(m1[c] != 0){
            answer += c;
            m1[c]--;
        }
    }
    
    sort(answer.begin(), answer.end(), greater<char>());
    
    if(answer == "") answer = "-1";
    while(answer.length() > 1 && answer[0] == '0'){
        answer.erase(answer.begin());
    }
    
    return answer;
}

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

신고 결과 받기/C++  (0) 2023.01.03
성격 유형 검사하기/C++  (0) 2023.01.03
푸드 파이트 대회/C++  (0) 2023.01.03
가장 가까운 같은 글자/C++  (0) 2023.01.03
명예의 전당 (1)/C++  (0) 2023.01.03

+ Recent posts