Level1 - -

 

 문제

문제 설명

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

재한사항
  • s는 길이가 1 이상, 100이하인 스트링입니다.
입출력 예
s return
"abcde" "c"
"qwer" "we"

 

 풀이

사용언어 : c++

#include <string>
#include <vector>

using namespace std;

string solution(string s) {
    string answer;
 
    int index = 0;
    if ( s.size() % 2 == 0 ){
        index = s.size()/2;
        string a,b;
        a = s[index-1];
        b = s[index];
        answer = a + b;
    }
    else {
        index = s.size()/2;
        answer = s[index];
    }
    
    
    return answer;
}

 

// 다른 사람 풀이

#include <string>
#include <vector>

using namespace std;

string solution(string s) {
    string answer;
 
    int index = 0;
    if ( s.size() % 2 == 0 ){
        index = s.size()/2;
        string a,b;
        a = s[index-1];
        b = s[index];
        answer = a + b;
    }
    else {
        index = s.size()/2;
        answer = s[index];
    }
    
    
    return answer;
}
```

 

 

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12903

Level1 - -

 

 문제

문제 설명

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.


제한사항
  • absolutes의 길이는 1 이상 1,000 이하입니다.
    • absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
  • signs의 길이는 absolutes의 길이와 같습니다.
    • signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.

 

입출력 예
absolutes signs result
[4,7,12] [true,false,true] 9
[1,2,3] [false,false,true] 0

입출력 예 설명

입출력 예 #1

  • signs가 [true,false,true] 이므로, 실제 수들의 값은 각각 4, -7, 12입니다.
  • 따라서 세 수의 합인 9를 return 해야 합니다.

입출력 예 #2

  • signs가 [false,false,true] 이므로, 실제 수들의 값은 각각 -1, -2, 3입니다.
  • 따라서 세 수의 합인 0을 return 해야 합니다.

 

 풀이

사용언어 : C++

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> absolutes, vector<bool> signs) {
    int answer = 0;
    
    for (int i = 0 ; i < absolutes.size(); ++i ){
        
        if (signs[i] == false){
            absolutes[i] = -absolutes[i];
        }
        
        answer += absolutes[i];
    }
    
    
    
    return answer;
}

 

 

 

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/76501

Level1 나누어 떨어지는 숫자 배열

 

 문제

문제 설명

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

제한사항
  • arr은 자연수를 담은 배열입니다.
  • 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
  • divisor는 자연수입니다.
  • array는 길이 1 이상인 배열입니다.
입출력 예
arr divisor return
[5, 9, 7, 10] 5 [5, 10]
[2, 36, 1, 3] 1 [1, 2, 3, 36]
[3,2,6] 10 [-1]
입출력 예 설명

입출력 예#1
arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다. 따라서 [5, 10]을 리턴합니다.

입출력 예#2
arr의 모든 원소는 1으로 나누어 떨어집니다. 원소를 오름차순으로 정렬해 [1, 2, 3, 36]을 리턴합니다.

입출력 예#3
3, 2, 6은 10으로 나누어 떨어지지 않습니다. 나누어 떨어지는 원소가 없으므로 [-1]을 리턴합니다.

 

 풀이

사용언어 : C++

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

using namespace std;

bool compare(int a, int b);

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

bool compare(int a, int b){
    
    return a<b;
}

 

다른사람 풀이

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

using namespace std;

vector<int> solution(vector<int> arr, int divisor) {
    vector<int> answer;
    sort(arr.begin(), arr.end());

    for (int i = 0; i < arr.size(); i++)
    {
        if (arr[i] % divisor == 0)
            answer.push_back(arr[i]);
    }

    return answer.empty() ? vector<int>(1, -1) : answer;
}

 

 

 

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12910

Level1 - 핸드폰 번호 가리기

 

 문제

문제 설명

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

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

 

 풀이

사용언어 : C++

#include <string>
#include <vector>

using namespace std;

string solution(string phone_number) {
    string answer = "";
    int count = 0;
    for ( int i = 0; i < phone_number.size()-4; ++i){
        answer += "*";
        ++count;
    }
    
    for ( int i = count; i<phone_number.size(); ++i){
        answer += phone_number[i];
    }
    
    
    return answer;
}

 

다른 사람의 풀이

포문을 두개 사용할 필요없이 풀이하는 접근이 좋았다.

#include <string>
#include <vector>

using namespace std;

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

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

    answer = phone_number;

    return answer;
}

 

 

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12948

Level

 문제

 

문제 설명

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

1-1. 입력된 수가 짝수라면 2로 나눕니다. 
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. 
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다. 

예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.

제한 사항
  • 입력된 수, num은 1 이상 8,000,000 미만인 정수입니다.
입출력 예n
n result
6 8
16 4
626331 -1
입출력 예 설명

입출력 예 #1
문제의 설명과 같습니다.

입출력 예 #2
16 → 8 → 4 → 2 → 1 이 되어 총 4번 만에 1이 됩니다.

입출력 예 #3
626331은 500번을 시도해도 1이 되지 못하므로 -1을 리턴해야 합니다.


※ 공지 - 2022년 6월 10일 다음과 같이 지문이 일부 수정되었습니다.

  • 주어진 수가 1인 경우에 대한 조건 추가

 풀이

사용언어 : 

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int solution(int num) {
    int answer = 0;
    bool state = true;
    long testNum = num;
    
    if ( testNum == 1)
        return answer;
    
    while ( state ){
        cout<<testNum<<endl;
        if ( testNum % 2 == 0 ){
            cout<<"test"<<endl;
            cout<<answer<<endl;
            cout<<testNum<<endl;
            testNum =  testNum / 2 ;
        } 
        else {
            testNum = (testNum * 3) + 1;
        }
        
        ++answer;
        if ( answer == 500){
            answer = -1;
            break;
        }
        else if  (testNum == 1){
            break;
        }
    
    }
    
    

    return answer;
}

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12943

Level1  서울에서 김서방 찾기

 

 문제

문제 설명

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

제한 사항
  • seoul은 길이 1 이상, 1000 이하인 배열입니다.
  • seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
  • "Kim"은 반드시 seoul 안에 포함되어 있습니다.
입출력 예
seoul return
["Jane", "Kim"] "김서방은 1에 있다"

 

 풀이

사용언어 : C++

#include <string>
#include <vector>
#include<iostream>

using namespace std;

string solution(vector<string> seoul) {
    string answer = "";
    
    for ( int i = 0 ; i < seoul.size(); ++i){
    
        if (seoul[i] == "Kim"){
            string num = to_string(i);
            answer = "김서방은 "+num+"에 있다";
            break;
        }
        
    }
    
    
    cout<<"김서방은"<<1<<"있다";
    
    
    return answer;
}

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12919

Level1 

 

 문제

문제 설명

두 정수 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

 

 풀이

사용언어 : C++

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

long long solution(int a, int b) {
    long long answer = 0;
    
    int front = a;
    int back = b;
    
    if ( a > b ){
        front = b;
        back = a;
    }
    
    for( int i = front ; i <= back; ++i){
        
        answer += i;

    }
    
    return answer;
}

 

다른사람의 풀이

#include <string>
#include <vector>

using namespace std;

long long solution(int a, int b) {
    return (long long)(a + b) * (abs(a - b) + 1) / 2;
}


// 시그마 공식 
// 다른 풀이의 댓글을 보고 시그마 공식이라는걸 찾아보고 수업시간에 배웠던 기억을 되짚어 볼수 있었다.



#include <string>
#include <vector>

using namespace std;

long long solution(int a, int b) {
    long long answer = 0;
    if (a > b) a ^= b ^= a ^= b;
    answer = (long long)b * -~b / 2 - (long long)a * ~-a / 2;
    return answer;
}

// 비트연산자를이용
// 이전 회사에서 비트연산자를 이용해 저장했던 기억을 되짚어 볼수 있었다.

 

 

 

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12912

Level1 나머지가 1이 되는 수 찾기

 

 문제

문제 설명

자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.


제한사항
  • 3 ≤ n ≤ 1,000,000

 


입출력
 n result
10 3
12 11

입출력 예 설명

입출력 예 #1

  • 10을 3으로 나눈 나머지가 1이고, 3보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 3을 return 해야 합니다.

입출력 예 #2

  • 12를 11로 나눈 나머지가 1이고, 11보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 11을 return 해야 합니다.

 

 풀이

사용언어 : C++

#include <string>
#include <vector>

using namespace std;

int solution(int n) {
    int answer = 0;
    
    
    for ( int i = 1; i < n; ++i ){
        
        if (n%i == 1){
            answer = i;
            break;
        }
        
        
    }
    
    return answer;
}

 

 

다른사람의 풀이

int solution(int n) {
    for(int i=2; i<n;++i)
        if(n%i==1) return i;
    return n-1;
}

 

 

 

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/87389

+ Recent posts