bdfgdfg

[레벨1] 모의고사 본문

코딩테스트/프로그래머스

[레벨1] 모의고사

marmelo12 2021. 8. 12. 21:53
반응형
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

int a[] = {1,2,3,4,5,1,2,3,4,5};
int b[] = {2,1,2,3,2,4,2,5}; 
int c[] = {3,3,1,1,2,2,4,4,5,5};


vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> stu1,stu2,stu3;
    int arr[3] = {};
    int i,s1,s2,s3 = 0;
    int len = answers.size(); //
    stu1.reserve(len);
    stu2.reserve(len);
    stu3.reserve(len);
    for(i = 0; i < len; ++i)
    {
        if(s1 >= 10)
            s1 = 0;
        if(s2 >= 8)
            s2 = 0;
        if(s3 >= 10)
            s3 = 0;
        stu1.push_back(a[s1++]);
        stu2.push_back(b[s2++]);
        stu3.push_back(c[s3++]);
    }
    
    for(i = 0; i < len; ++i)
    {
        if(stu1[i] == answers[i])
            arr[0]++;
        if(stu2[i] == answers[i])
            arr[1]++;
        if(stu3[i] == answers[i])
            arr[2]++;
    }
    int maxValue = max({arr[0],arr[1],arr[2]});
    for(i = 0; i < 3; ++i)
    {
        if(arr[i] == maxValue)
            answer.push_back(i + 1);
    }
    
    sort(answer.begin(), answer.end());
    
    
    return answer;
}

 

문제는 쉬운편이었다고 생각한다. 하지만 과연 잘 풀었는지가 궁금한데. 다른 사람의 코드를 보니.

 

나처럼 정답지의 길이만큼 학생들의 배열을 채워주고 다시 맞는지 체크하는게 아니라.

vector<int> students(3);
for(int i=0; i<answers.size(); i++) {
    if(answers[i] == a[i%a.size()]) students[0]++;
    if(answers[i] == b[i%b.size()]) students[1]++;
    if(answers[i] == c[i%c.size()]) students[2]++;
}

간단하게 위와 같이 정의함. 즉

vector<int> a = {1,2,3,4,5};
vector<int> b = {2,1,2,3,2,4,2,5}; 
vector<int> c = {3,3,1,1,2,2,4,4,5,5};

여기서. answers 길이만큼. 각각a,b,c의 요소들을 반복문 i % size로 접근하여 맞는지를 체크.

 

나보다 메모리 + 시간복잡도도 좋은 코드. 그리고 나는 어차피 학생들을 하나로 관리한게 아닌 따로 관리했기에

max({arr[0],arr[1],arr[2]}) 식으로 쉽게 구할 수 있지만. 만약 하나의 배열(다른 STL 컨테이너도 가능)에서 최소,최대값을 구하는 것이라면 (물론 반복문을 써도 되지만) algorithm헤더에 구현된 min_element(),max_element함수를 사용.

int main(void)
{
    vector<int> arr;

    for (int i = 0; i < 10; ++i)
    {
        arr.push_back(rand());
    }

    auto maxIter = max_element(arr.begin(), arr.end());
    int maxValue = *max_element(arr.begin(), arr.end());
    cout << *maxIter << " " << maxValue;

    return 0;
}

max,min_element함수는 iterator를 반환.

 

모든 컨테이너에대해서 처음부터 끝까지 돌아 선형 시간복잡도( O(N) )를 가진다고 한다. -> 물론 범위를 지정할 수 있다

 

 

반응형

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

[레벨1] 문자열 다루기 기본  (0) 2021.08.14
[레벨1] 행렬의 덧셈  (0) 2021.08.13
[레벨1] 체육복  (0) 2021.08.10
[레벨1] 완주하지 못한 선수  (0) 2021.08.09
[레벨1] 숫자 문자열과 영단어  (0) 2021.08.08
Comments