문제

x만큼 간격이 있는 n개의 숫자 문제링크

프로그래머스 level 1

문제 설명

함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.

제한 조건

  • x는 -10000000 이상, 10000000 이하인 정수입니다.
  • n은 1000 이하인 자연수입니다.

입출력 예

x n answer
2 5 [2,4,6,8,10]
4 3 [4,8,12]
-4 2 [-4, -8]

리뷰

자료형을 주의하면 되는 문제였다.

int

4byte 크기 (대강 -2,147,000,000 ~ 2,147,000,000 )

printf 서식문자 %d

long long

8byte 크기

-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

printf 서식문자 %lld

 

자료형 출력시 서식문자는 자꾸 헷갈리지만.. 자꾸 보면 익숙해지겠지.

코드

#include <string>
#include <vector>

using namespace std;

vector<long long> solution(int x, int n) {
    vector<long long> answer;
    long long init_num = x;

    for(; n>0; n--){ 
        answer.push_back(init_num);
        init_num += x;
    }

    return answer;
}
728x90

문제

제일 작은 수 제거하기 문제링크

프로그래머스 level 1

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요.

단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요.

예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

제한 조건
  • arr은 길이 1 이상인 배열입니다.
  • 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
입출력 예
arr return
[4,3,2,1] [4,3,2]
[10] [-1]

리뷰

algorithm 헤더파일 에는 유용한 메소드가 참 많다. min_element() 함수로 편하게 풀 수 있었다.

코드

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> solution(vector<int> arr) {
    if(arr.size() == 1) {
        arr[0] = -1;
    } else {
        arr.erase(min_element(arr.begin(), arr.end()));
    }
    return arr;
}
728x90

문제

2016년 문제링크 프로그래머스 level 1

 

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일같은 날짜는 주어지지 않습니다)

입출력 예

a b result
5 24 TUE

리뷰

윤년이라서 2월이 29일 까지 있다는 것만 주의하면, 나머지연산(%)을 이용해 금방 풀수있었다.

풀고나서 다른사람들의 코드를 구경했는데.

앞의 달의 날짜를 31+29+31+30+31 이렇게 직접 코딩한 분이 있어서 재미있었다.

반복문 안쓰고 일일히 다 쓴게 너무 귀여웠다. 웃고간다는 댓글이 수두룩이었다. ㅋㅋ

코딩은 역시 같이해야 재미있다.

코드

#include <string>
#include <vector>
using namespace std;

int month_days[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
string days_arr[] = {"THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"};

string solution(int a, int b) {
    string answer = "";
    int days = 0;  
     int i = 0, days_diff = 0;
    /*    
    2월 이라면, days에 1월까지 더하고 시작
    3월 이라면, days에 2월까지 더하고 시작  
    */
    for(i = 1; i <a; i++){
        days += month_days[i]; 
    }
    days += b;
    days_diff = (days % 7); // 요일 알아내기 
    answer = days_arr[days_diff];

    return answer;
}
728x90

문제

모의고사

프로그래머스 level 1

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 조건
  • 시험은 최대 10,000 문제로 구성되어있습니다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.
입출력 예
answers return
[1,2,3,4,5] [1]
[1,3,2,4,2] [1,2,3]
입출력 예 설명

입출력 예 #1

  • 수포자 1은 모든 문제를 맞혔습니다.
  • 수포자 2는 모든 문제를 틀렸습니다.
  • 수포자 3은 모든 문제를 틀렸습니다.

따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.

입출력 예 #2

  • 모든 사람이 2문제씩을 맞췄습니다.

리뷰

가장 높은 점수를 받은 사람이 여럿인 경우에 오름차순 정렬 출력을 어떻게 할지가 고민이었다.

일단 max() 함수로 최고점 받은 사람을 알아내고 나니깐 풀렸다.

코드

#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

int first[] = {1, 2, 3, 4, 5};
int second[] = {2, 1, 2, 3, 2, 4, 2, 5};
int third[] = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

vector<int> solution(vector<int> answers) {

    vector<int> answer;
    vector<int> score = {0, 0, 0}; // 수포자 1, 2, 3번이 맞춘 문제 개수 

    int len_answer = answers.size();
    int i = 0, max_score = 0;

    for(i=0; i<len_answer; i++){

        if(answers[i] == first[i%5]) score[0]++;
        if(answers[i] == second[i%8]) score[1]++;        
        if(answers[i] == third[i%10]) score[2]++;
    }
    // 셋 중에 최대값  
    max_score = max(score[0], max(score[1], score[2]) );

    for(i=0; i<3; i++){
        if(max_score == score[i]) {
            answer.push_back(i+1);
        }
    }

    return answer;
}
728x90

문제

같은 숫자는 싫어

프로그래머스 level 1

문제 설명

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,

  • arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
  • arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.

배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 배열 arr의 크기 : 1,000,000 이하의 자연수
  • 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

입출력 예

arr answer
[1,1,3,3,0,1,1] [1,3,0,1]
[4,4,4,3,3] [4,3]

리뷰

수열의 순서는 유지하되, 중복숫자만 걷어내면 된다.

iterator를 사용해서 erase 하려다가 잘 안되서 새 벡터에 옮겨담아서 풀었다.

다른 풀이를 보니 unique() 함수로 erase() 한 코드가 있었다.

unique()함수는 헤더를 추가해서 사용하면 된다.

범위 내에 중복된 원소를 제거한다.

#include <algorithm>
#include <vector>
using namespace std;

int main(){
    vector<int> arr v{1, 1, 3, 0, 0};
    v.unique(arr.begin(), arr.end());  // unique(시작점, 끝점)

    return 0;
}

unique와 erase로 중복제거 참고 포스팅

c++ 레퍼런스

다른 분들 코드

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

vector<int> solution(vector<int> arr) 
{

    arr.erase(unique(arr.begin(), arr.end()),arr.end());

    vector<int> answer = arr;
    return answer;
}

코드

#include <vector>
#include <iostream>
using namespace std;

vector<int> solution(vector<int> arr) 
{
    vector<int> answer;
    int i = 0;
    int temp = arr[0];

    answer.push_back(temp);

    for(i=1; i<arr.size(); i++){

        if(temp != arr[i]){ // 직전 숫자와 다르면 push_back()
            answer.push_back(arr[i]);
        }
        temp = arr[i];
    }

    return answer;
}


도움이 되셨다면 '공감'을 눌러주세요 :)

728x90

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 2016년 c++  (0) 2020.07.20
[프로그래머스] 모의고사 c++  (0) 2020.07.18
두 정수 사이의 합  (0) 2020.07.17
문자열 내 마음대로 정렬하기  (0) 2020.07.17
시저 암호  (0) 2020.07.17

문제

두 정수 사이의 합

프로그래머스 level 1


문제 설명

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.

제한 조건
  • a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
  • a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
  • a와 b의 대소관계는 정해져있지 않습니다.
입출력 예
a b return
3 5 12
3 3 3
5 3 12


코드

#include <string>
#include <vector>
using namespace std;

long long solution(int a, int b) {

    long long answer = 0;
    int i = 0;
    int big = (a > b) ? a : b;    
    int small = (a < b) ? a : b;

    for(i=big; i>=small; i--){
        answer += i;
    }

    return answer;
}
728x90

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 모의고사 c++  (0) 2020.07.18
[프로그래머스] 같은 숫자는 싫어 c++  (0) 2020.07.17
문자열 내 마음대로 정렬하기  (0) 2020.07.17
시저 암호  (0) 2020.07.17
문자열 다루기 기본  (0) 2020.07.17

문제

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

프로그래머스 level 1 문제

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

제한 조건

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

입출력 예

strings n return
[sun, bed, car] 1 [car, bed, sun]
[abce, abcd, cdx] 2 [abcd, abce, cdx]

입출력 예 설명

입출력 예 1
sun, bed, car의 1번째 인덱스 값은 각각 u, e, a 입니다. 이를 기준으로 strings를 정렬하면 [car, bed, sun] 입니다.

입출력 예 2
abce와 abcd, cdx의 2번째 인덱스 값은 c, c, x입니다. 따라서 정렬 후에는 cdx가 가장 뒤에 위치합니다. abce와 abcd는 사전순으로 정렬하면 abcd가 우선하므로, 답은 [abcd, abce, cdx] 입니다.

리뷰

입출력 예 두번째것을 소홀히 봤다가 어디가 틀렸나 헤맸었다.

compare 함수를 신경쓰면 금방 답을 찾을 수 있었다.

특정 인덱스를 기준으로 두 단어가 같은 경우에는. 사전순으로 앞선 문자열이 앞쪽에 와야하니까 a<b 를 리턴하면 된다.

코드

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int limit; // 비교 기준이 되는 인덱스 정하기 

bool compare(string &a, string &b){

    if(a[limit] != b[limit]){ // 특정 글자 기준 
        return a[limit] < b[limit];
    }else{ // 그게 아니라면 사전 순서 
        return a < b;
    }

}
vector<string> solution(vector<string> strings, int n) {

    limit = n;
    sort(strings.begin(), strings.end(), compare);

    return strings;
}

도움이 되셨다면 '공감'을 눌러주세요 :)

728x90

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 같은 숫자는 싫어 c++  (0) 2020.07.17
두 정수 사이의 합  (0) 2020.07.17
시저 암호  (0) 2020.07.17
문자열 다루기 기본  (0) 2020.07.17
다리를 지나는 트럭  (0) 2020.07.16

+ Recent posts