2. 두 개 뽑아서 더하기, 신규 아이디 추천, K번째수, 2016년, 가운데 글자 가져오기, 나누어 떨어지는 숫자 배열, 문자열 내 마음대로 정렬하기, 폰켓몬, 문자열 내림차순으로 배치하기, 서울에서 김서방 찾기

아래 모든 문제들은 프로그래머스에서 제공 되는 문제를 이용하였습니다, 감사합니다.

  • 틀린거 없음!

1. 두 개 뽑아서 더하기

문제 설명

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

제한사항

  • numbers의 길이는 2 이상 100 이하입니다.
  • numbers의 모든 수는 0 이상 100 이하입니다.

입출력 예

풀이

#include 
#include 
#include 
#include 
using namespace std;

vector solution(vector numbers) {
    vector answer;
    for (int i = 0; i < (numbers.size() - 1); i++)
    {
        for (int j = i + 1; j < numbers.size(); j++)
        {
             answer.push_back(numbers[i] + numbers[j]);
        }
    }
    sort(answer.begin(), answer.end());
    int tmp = answer[0];
    for (int i = 1; i < answer.size(); i++)
    {
        if (answer[i] == tmp)
        {
            answer.erase(answer.begin()+i);
            i--;
        }
        else
            tmp = answer[i];
    }
    return answer;
}

설명

  • 더할수 있는 경우의 수들을 모두 더하고,
  • 더한 값들을 배열에 저장
  • 저장된 배열값을 정렬한 뒤
  • 중복 되는 값 제거.
  • set으로도 풀어볼수 있을거 같다.(set은 자동 정렬도 됨.)

2. 신규 아이디 추천

문제

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

  • 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.

  • 2단계 newid에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(), 마침표(.)를 제외한 모든 문자를 제거합니다.

  • 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이 될 때까지 반복해서 끝에 붙입니다.

  • https://programmers.co.kr/learn/courses/30/lessons/72410 <-- 자세한 문제는 여기

제한사항

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

풀이

#include 
#include 

using namespace std;

string solution(string new_id) {
    string answer = "";

    for (int i = 0; i < new_id.size(); i++)
    {
        if(new_id[i] >= 'A' && new_id[i] <= 'Z') // 1단계
        {
            new_id[i] = tolower(new_id[i]);
        }
        if(!isdigit(new_id[i]) && !isalpha(new_id[i]) // 2.단계
            && new_id[i] != '-' && new_id[i] != '_' && new_id[i] != '.')
        {
            new_id.erase(new_id.begin()+i);
            i--;
        }
        else if(new_id[i] == '.')
        {
            if(i != 0 && new_id[i - 1] == '.')
            {
                new_id.erase(new_id.begin()+i);
                i--;
            }
        }
    }

    if(new_id[0] == '.')
        new_id.erase(new_id.begin() + 0);
    if(new_id[new_id.size() - 1] == '.')
        new_id.erase(new_id.begin() + (new_id.size() - 1));
    if(new_id == "")
        new_id += "a";
    if(new_id.size() > 15)
        new_id.erase(15);
    
    if(new_id[0] == '.')
        new_id.erase(new_id.begin() + 0);
    if(new_id[new_id.size() - 1] == '.')
        new_id.erase(new_id.begin() + (new_id.size() - 1));
    int tmp = new_id.size() - 1;
    for(int i = tmp; i < 2; i++)
    {
        new_id += new_id[tmp];
    }           
    answer += new_id;
    return answer;
}

설명

  • 너무 지저분하게 짰다..
  • 1~7단계 순차적으로 구현을 목표로 코드를 짰다.

3. k번쨰수

문제 설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  • array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  • 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  • 2에서 나온 배열의 3번째 숫자는 5입니다.

    배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

  • array의 길이는 1 이상 100 이하입니다.
  • array의 각 원소는 1 이상 100 이하입니다.
  • commands의 길이는 1 이상 50 이하입니다.
  • commands의 각 원소는 길이가 3입니다.

입출력 예

풀이

#include 
#include 
#include 
#include 
using namespace std;

vector solution(vector array, vector> commands) {
    vector answer;
    vector tmp;
    for (int i = 0; i < commands.size(); i++)
    {
        tmp.clear();
        for (int j = commands[i][0] - 1; j < commands[i][1]; j++)
        {
            tmp.push_back(array[j]);
        }
        sort(tmp.begin(), tmp.end());
        answer.push_back(tmp[commands[i][2] - 1]);
    }
    return answer;
}

설명

  • i값부터, j값까지 짤라냄
  • sort를 사용해서 정렬
  • 인덱스 위치를 가리켜서 리턴시켰다.
  • 정렬 문제라 sort시키는 거만 이해하고 넘어가자.

4. 2016년

문제 설명

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각 SUN,MON,TUE,WED,THU,FRI,SAT 입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요.

제한 조건

  • 2016년은 윤년입니다.
  • 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)

입출력 예

풀이

#include 
#include 

using namespace std;

string solution(int a, int b) {
    vector day = {"THU","FRI","SAT","SUN","MON","TUE","WED"};
    vector month={0,31,29,31,30,31,30,31,31,30,31,30,31};
    string answer = "";
    int sum = b;
    for(int i = 1; i <= a; i++)
         sum += month[i - 1];
    answer += day [sum % 7];
    return answer;
}

설명

  • 1월 1일을 기준으로 a월 b일의 경우 얼마나 떨어져있는지 sum에 저장을 한다.
  • sum % 7을 통해 요일을 추측한다.

5. 가운데 글자 가져오기

문제 설명

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

재한사항

s는 길이가 1 이상, 100이하인 스트링입니다.

입출력 예

풀이

#include 
#include 

using namespace std;

string solution(string s) {
    string answer = "";
    if (s.size() % 2 == 1)
        answer += s[s.size()/2];
    else
    {
        answer += s[s.size() / 2 - 1];
        answer += s[s.size() / 2];
    }
    return answer;
}

설명

  • 그냥 풀었다.. 설명 생략..

6. 나누어 떨어지는 숫자 배열

문제 설명

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

제한사항

  • arr은 자연수를 담은 배열입니다.
  • 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
  • divisor는 자연수입니다.
  • array는 길이 1 이상인 배열입니다.

입출력 예

풀이

#include 
#include 
#include 
using namespace std;

vector solution(vector arr, int divisor) {
    vector answer;
    for (int i = 0; i < arr.size(); i++)
    {
        if (arr[i] % divisor == 0)
            answer.push_back(arr[i]);
    }
    sort(answer.begin(),answer.end());
    if (answer.size() == 0)
        answer.push_back(-1);
    return answer;
}

설명

  • 설명 생략

7. 문자열 내 마음대로 정렬하기

문제 설명

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

제한 조건

  • strings는 길이 1 이상, 50이하인 배열입니다.
  • strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
  • strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
  • 모든 strings의 원소의 길이는 n보다 큽니다.
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.

입출력 예

풀이

#include 
#include 
#include 
#include 
using namespace std;

bool compare2 (pair a, pair  b)
{
    if(a.second == b.second)
        return a.first < b.first;
    return a.second < b.second;
}

vector solution(vector strings, int n) {
    vector> value;
    vector answer;
    for (int i = 0; i < strings.size(); i++)
    {
        value.push_back(make_pair(strings[i], strings[i][n]));
    }
    sort(value.begin(), value.end(), compare2);
    // answer = strgins;
    for (int i = 0; i < value.size(); i++)
    {
        answer.push_back(value[i].first);
    }
    std::cout << value[0].first << std::endl;
    return answer;
}

설명

  • n번 째 인자를 기준으로 비교를 해야해서, compare에 n인자를 같이 보내 줄려고 햇는데
  • compare함수 매게변수를 3개로 만들고 sort를 쓰니 작동이 안됨.
  • sort에 사용될 compare함수는 매게변수 두개만 가능함.
  • 그래서 첫번쨰 두번쨰 인자에 벡터대신 pair를 사용해서 해결함.

9. 폰켓몬

문제 설명

주어지는 nums배열 중, nums.size()만큼 원소들을 고를 때 숫자들으 종류별로 가질수 있는 최대 값을 리턴하시오.

제한사항

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

입출력 예

풀이

#include 
#include 
using namespace std;

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

설명

  • 모든 값들을 set에다가 넣어서 중복되는 값들 제거
  • 최대 한 나올수 있는 종류 경우와, 선택할수 있는 횟수를 비교해서 answer값 추출

10.문자열 다루기 기본

문제 설명

문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.

제한 사항

  • str은 길이 1 이상인 문자열입니다.

입출력 예

풀이

#include 
#include 
#include 
using namespace std;
bool compare(char a, char b)
{
    return a > b;
}

string solution(string s) {
    string answer = "";
    sort(s.begin(), s.end(), compare);
    answer += s;
    return answer;
}

설명

  • 아스키 코드 순차적으로 나열한것과 같은 상황이라, 단순 문자 비교를 해서 정렬함.

서울에서 김서방 찾기

문제 설명

String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

제한 사항

  • seoul은 길이 1 이상, 1000 이하인 배열입니다.
  • seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
  • "Kim"은 반드시 seoul 안에 포함되어 있습니다.

입출력 예

풀이

#include 
#include 
#include 
using namespace std;

string solution(vector seoul) {
    string answer = "김서방은 ";
    answer += to_string((find(seoul.begin(), seoul.end(), "Kim") - seoul.begin()));
    answer += "에 있다";
    return answer;
}

설명

  • find를 통해, 벡터에서 "Kim" 값의 인덱스를 구할수 있다.
  • 정수를 문자열로 바꾸는데, to_string이 사용된다.

좋은 웹페이지 즐겨찾기