문제

하샤드 수

프로그래머스 level 1

문제 설명

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

제한 조건
  • x는 1 이상, 10000 이하인 정수입니다.
입출력 예
arr return
10 true
12 true
11 false
13 false
입출력 예 설명

입출력 예 #1
10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다.

입출력 예 #2
12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다.

입출력 예 #3
11의 모든 자릿수의 합은 2입니다. 11은 2로 나누어 떨어지지 않으므로 11는 하샤드 수가 아닙니다.

입출력 예 #4
13의 모든 자릿수의 합은 4입니다. 13은 4로 나누어 떨어지지 않으므로 13은 하샤드 수가 아닙니다.

코드

#include <string>
#include <vector>

using namespace std;


bool solution(int x) {
    bool answer = true;
    int sum = 0;
    int x_old = x;

    while(x>0){
        sum += (x % 10);
        x = x / 10;
    }

    if(x_old % sum != 0){
        answer = false;
    }

    return answer;
}
728x90

문제

핸드폰 번호 가리기 문제링크

프로그래머스 level 1

 

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

제한 조건
  • s는 길이 4 이상, 20이하인 문자열입니다.
입출력 예
phone_number return
01033334444 ***4444
027778888 *****8888

리뷰

뒤에서 4번째까지만 string을 *로 바꾸면 되는 문제였다.

 

코드

#include <string>
#include <vector>

using namespace std;

string solution(string phone_number) {
    string answer = "";
    int i = 0; 

    for(i=0; i<phone_number.size()-4; i++){
        phone_number[i] = '*';
    }

    answer = phone_number;

    return answer;
}
728x90

문제

이상한 문자 만들기

프로그래머스 level 1

문제 설명

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

제한 사항
  • 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
  • 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
입출력 예
s return
try hello world TrY HeLlO WoRlD
입출력 예 설명

try hello world는 세 단어 try, hello, world로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 TrY, HeLlO, WoRlD입니다. 따라서 TrY HeLlO WoRlD 를 리턴합니다.

리뷰

처음에 문제를 잘못 읽어서 완전히 틀렸었다. 문제를 똑바로 읽자...

코드

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

string solution(string s) {

    string answer = "";
     int i = 0;
     bool start_flag = 1;

     while(i != s.size()){

         if(s[i] == ' '){ // 공백 
             answer += s[i];
             start_flag = 1;
        }else{

            if(start_flag == 1){ // 첫 문자는 무조건 짝수번째
                answer += toupper(s[i]); 
                start_flag = 0; // 플래그 갱신
            }else{ // 홀수번째
                answer += tolower(s[i]); 
                start_flag = 1; // 플래그 갱신 
            }
        }
        i++;

    }

    return answer;
}
728x90

문제

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

+ Recent posts