• 내가 만든 코드

  1. 수학적인 알고리즘에 대한 이해와 지식이 없어서 한참 헤맨 문제였다.
  2. 이 문제는 최소값을 구하는 공식이 항상 N-1의 +1회 N/2 +1회, N/3 +1회 라는 것을 알고 있으면 된다.
  3. 이 세 가지 횟수중 가장 작은 횟수를 구하면 된다.
  • 코드 체점 결과

 

  • 문제 설명

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.

어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h가 이 과학자의 H-Index입니다.

어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

  • 제한사항
  • 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
  • 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.
  • 입출력 예

  • 입출력 예 설명

이 과학자가 발표한 논문의 수는 5편이고, 그중 3편의 논문은 3회 이상 인용되었습니다. 그리고 나머지 2편의 논문은 3회 이하 인용되었기 때문에 이 과학자의 H-Index는 3입니다.

  • 내가 만든 코드
#include <string>
#include <vector>

using namespace std;

int solution(vector<int> citations) {
    int answer = 0;
    int tmp = 0;
    
    for(int i=0; i<citations.size(); i++){
        for(int j=i+1; j<citations.size(); j++){
            if(citations[i]>citations[j]){
                tmp = citations[i];
                citations[i] = citations[j];
                citations[j] = tmp;
            }
        }
    }
    
    for(int z=0; z<citations.size(); z++){
        if((citations[z]>=(citations.size()-z))){
            if(answer<citations.size()-z){
                if(citations.size()-z>=citations[z]){
                   answer = citations[z];
               } 
                else{
                   answer = citations.size()-z;
                }
            }
        }
    }
    
    return answer;
}
  • 코드 채점 결과

 

  • 문제 설명

대구 달성공원에 놀러 온 지수는 최근에 새로 만든 타일 장식물을 보게 되었다. 타일 장식물은 정사각형 타일을 붙여 만든 형태였는데, 한 변이 1인 정사각형 타일부터 시작하여 마치 앵무조개의 나선 모양처럼 점점 큰 타일을 붙인 형태였다. 타일 장식물의 일부를 그리면 다음과 같다.

그림에서 타일에 적힌 수는 각 타일의 한 변의 길이를 나타낸다. 타일 장식물을 구성하는 정사각형 타일 한 변의 길이를 안쪽 타일부터 시작하여 차례로 적으면 다음과 같다.
[1, 1, 2, 3, 5, 8, .]
지수는 문득 이러한 타일들로 구성되는 큰 직사각형의 둘레가 궁금해졌다. 예를 들어, 처음 다섯 개의 타일이 구성하는 직사각형(위에서 빨간색으로 표시한 직사각형)의 둘레는 26이다.

타일의 개수 N이 주어질 때, N개의 타일로 구성된 직사각형의 둘레를 return 하도록 solution 함수를 작성하시오.

  • 제한 사항
  • N은 1 이상 80 이하인 자연수이다.
  • 입출력 예

  • 내가 만든 코드
#include <string>
#include <vector>

using namespace std;

long long solution(int N) {
    long long answer = 0;
    long long a = 1;
    long long b = 1;
    long long tmp = 0;
    
    for(int i = 3; i<=N+1; i++){
        tmp = b;
        b = a+b;
        a = tmp;
    }
    answer = a+a+b+b;
    return answer;
}
  1. 피보나치 수열을 알고 있다면 쉽게 풀 수 있는 문제
  2. 첫 번째, 두 번째 값은 예외로 처리 그 후부터는 피보나치 수열로 가로와 세로 길이를 구함(N+1번째 까지)
  3. 둘레를 구함
  • 코드 채점 결과

 

  • 문제 설명

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.

  1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
  2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
  3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.

노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요.

  • 제한사항
  • genres[i]는 고유번호가 i인 노래의 장르입니다.
  • plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.
  • genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다.
  • 장르 종류는 100개 미만입니다.
  • 장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
  • 모든 장르는 재생된 횟수가 다릅니다.
  • 입출력 예

  • 입출력 예 설명

classic 장르는 1,450회 재생되었으며, classic 노래는 다음과 같습니다.

  • 고유 번호 3: 800회 재생
  • 고유 번호 0: 500회 재생
  • 고유 번호 2: 150회 재생

pop 장르는 3,100회 재생되었으며, pop 노래는 다음과 같습니다.

  • 고유 번호 4: 2,500회 재생
  • 고유 번호 1: 600회 재생

따라서 pop 장르의 [4, 1]번 노래를 먼저, classic 장르의 [3, 0]번 노래를 그다음에 수록합니다.

  • 내가 만든 코드
#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<string> genres, vector<int> plays) {
    vector<int> answer;
    vector<int> plays2;
    vector<string> genres2;
    vector<int> tmp;
    vector<string> tmp2;
    int tmp3;
    string tmp4;
    int max,max2 = -1;
    vector<int> cnt = {-1,-1};
    
    for(int z=0; z<plays.size(); z++){
        plays2.push_back(plays[z]);
        genres2.push_back(genres[z]);
    }
    
    for(int i = 0; i<plays.size();i++){
        tmp.push_back(plays[i]);
        tmp2.push_back(genres[i]);
        for(int j=i+1; j<plays.size();j++){
            if(genres[i].compare(genres[j])==0){
                tmp[i] += plays[j];
                plays.erase(plays.begin()+j);
                genres.erase(genres.begin()+j);
                j--;
            }
        }
    }
    
    for(int a=0; a<tmp.size();a++){
        for(int b=a+1; b<tmp.size(); b++){
            if(tmp[a]<tmp[b]){
                tmp3 = tmp[a];
                tmp4 = tmp2[a];
                tmp[a] = tmp[b];
                tmp2[a] = tmp2[b];
                tmp[b] = tmp3;
                tmp2[b] = tmp4;
            }
        }
    }
    
    for(int i=0; i<tmp.size();i++){
        for(int j=0; j<plays2.size(); j++){
            if(tmp2[i].compare(genres2[j])==0&&max==plays2[j]&&max2<max){
                max2 = max;
                cnt[1] = j;
            }
            if(tmp2[i].compare(genres2[j])==0&&max<plays2[j]){
                max2 = max;
                max = plays2[j];
                cnt[1] = cnt[0];
                cnt[0] = j;
            }
            if(tmp2[i].compare(genres2[j])==0&&max2<plays2[j]&&max>plays2[j]){
                max2 = plays2[j];
                cnt[1] = j;
            }
        }
        if(cnt[1] == -1){
            answer.push_back(cnt[0]);
        }
        else if(cnt[1] > -1){
            answer.push_back(cnt[0]);
            answer.push_back(cnt[1]);
        }
        cnt[0] = -1;
        cnt[1] = -1;
        max = 0;
    }
    return answer;
}
  1. 장르가 같은 음악들의 플레이 총 횟수를 구한다.(vector 하나에는 장르 이름을 넣고 다른 하나에는 총 플레이 횟수를 넣는다. -> 순서 동일)
  2. 총 플레이 횟수가 가장 많은 순서대로 sort 한다.(장르 이름을 저장한 vector도 똑같이 순서를 바꿔줌)
  3. 가장 큰 횟수와 2번째로 큰 횟수를 가진 트랙을 저장한다.(1개만 있으면 1개만 저장)
  • 코드 채점 결과

 

  • 문제 설명
  • array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
  • divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
  • 제한사항
  • arr은 자연수를 담은 배열입니다.
  • 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
  • divisor는 자연수입니다.
  • array는 길이 1 이상인 배열입니다.
  • 입출력 예

  • 입출력 예 설명
  • 입출력 예#1
    arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다. 따라서 [5, 10]을 리턴합니다.
  • 입출력 예#2
    arr의 모든 원소는 1으로 나누어 떨어집니다. 원소를 오름차순으로 정렬해 [1, 2, 3, 36]을 리턴합니다.
  • 입출력 예#3
    3, 2, 6은 10으로 나누어 떨어지지 않습니다. 나누어 떨어지는 원소가 없으므로 [-1]을 리턴합니다.
  • 내가 만든 코드
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

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);
    }
    sort(answer.begin(),answer.end());
    return answer;
}
  • 코드 채점 결과

  • 문제 설명

두 정수 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의 대소관계는 정해져있지 않습니다.
  • 입출력 예

  • 내가 만든 코드
#include <string>
#include <vector>

using namespace std;

long long solution(int a, int b) {
    long long answer = 0;
    if(a>=b){
        for(int i = b; i<a+1; i++){
            answer += i;
        }
    }
    else{
        for(int i = a; i<b+1; i++){
            answer += i;
        }
    }
    return answer;
}
  • 코드 채점 결과

 

  • 문제 설명

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 배열 arr에서 제거되고 남은 수들을 return 하는 solution 함수를 완성해 주세요. 단, 제거된 후 남은 수들을 반환할 때는 배열 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보다 작거나 같은 정수
  • 입출력 예

  • 내가 만든 코드
#include <vector>
#include <iostream>

using namespace std;

vector<int> solution(vector<int> arr) 
{
    vector<int> answer;
    for(int i = 1; i<arr.size(); i++){
        if(arr[i]==arr[i-1]){
            continue;
        }
        else{
            answer.push_back(arr[i-1]);
        }
    }
    answer.push_back(arr[arr.size()-1]);
    return answer;
}
  • 코드 채점 결과

  • 처음에는 arr자체에서 중복되는 값들을 비워내는 형식으로 진행했었다.
  • 물론 정확성 테스트는 모두 통과를 했으나 효율성에서 시간 초과가 나와 다시 한번 생각해보았다.
  • 다시 생각해낸 방법은 비어있는 vector에 중복되는 값을 push 해주는 방식이었다.
  • 이 방식을 사용하니 훨씬 더 빨리 테스트를 마칠 수 있었다.
  • 문제 설명

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

  • 제한사항
  • s는 길이가 1 이상, 100이하인 스트링입니다.
  • 입출력 예

  • 내가 만든 코드
#include <string>
#include <vector>

using namespace std;

string solution(string s) {
    if(s.size()%2==1){
        return s.substr(s.size()/2,1);
    }
    else if(s.size()%2==0){
        return s.substr(s.size()/2-1,2);
    }
}
  1. 주어진 string의 길이가 홀수이면 가운데 한 글자만 return
  2. 주어진 string의 길이가 짝수이면 size()/2 - 1에서 2글자 return
  • 코드 채점 결과

 

+ Recent posts