컴퓨터기본/문제풀이

[프로그래머스] 정렬 > K번째수

차가운오미자 2021. 6. 14. 22:01

https://programmers.co.kr/learn/courses/30/lessons/42748?language=cpp

 

코딩테스트 연습 - K번째수

[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

programmers.co.kr

 

 

문제 이해:

array에는 길이 1에서 100 사이의 배열이다.

commands 는 최대 50개, 즉 최대 3*50의 벡터값이다.

command에 따라서 array를 잘라서, 자른 배열을 올림차순으로 정렬하고, 그 중 3번째에 있는 index의 값을 answer에 저장해서 반환하는 것이 과제이다.

 

command의 행은 세 요소로 이루어졌는데, i는 array자를 시작점, j는 array마지막점, k는 그 잘린 배열 중 반환할 요소이다.

예를 들어 array = {1, 2, 3, 4, 5, 6, 7}인데, command 첫 줄이 (3, 5, 2)이면,

{3, 4, 5}가 잘리고, {3, 4, 5}를 정렬한 후 (정렬해도 이 경우엔 같으니까) 그 중 두 번째 값인 4가 answer[0]에 저장되는 것이다.

 

나의 답안(맞음):

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

using namespace std;

vector<int> solution(vector<int> array, vector<vector<int>> commands) {
    vector<int> answer; // static
        
    int start, end, point, length, temp;
    //vector<int> myarr;
    
    for(int i = 0; i<commands.size(); i++){
        // i is the index of command line
        start = (commands[i][0])-1;
        end = (commands[i][1])-1;
        point = (commands[i][2])-1;
        length = end - start + 1;
        
        //cout << start << ' ' << end << ' ' << point << ' ' << length;
        vector<int> myarr;

        for(int j = 0; j<length; j++){
            myarr.push_back(array.at(start+j));
        }
        
        sort(myarr.begin(), myarr.end());
        
        temp = myarr.at(point);
        answer.push_back(temp);
        
    }
    return answer; // static
}

 

개념을 이해하고, 어떻게 할지는 머릿속에 있었으나 어려웠던 점은, 내가 C++ 문법을 아직 모른다는 점...

 

1) sort()

vector를 sort하는 경우에는 (v.begin(), v.end()) 로 하지만, 위의 경우 myarr 는 벡터가 아니라 저 함수를 사용할 수는 없다. vector로 바꿔주면 가능할지도...!

array를 sort()하는 경우 array주소와 array끝 요소+1의 주소를 주면 된다.

 

이 과정에서 난 에러가 아마 segmentation fault(core dumped)였다. 이 오류는 메모리 접근이 이상할 때 생기는데 잘 찾아보면 arr[-1]을 참조하거나 뭐 이런식으로 메모리 참조가 잘못된 경우가 있다! 잘 찾아보기

 

2) push_back

answer는 vector라서 push_back함수를 통해 저장해야함에도.. 나는 배열과 헷갈려서 그냥 '='로 저장하려고 해서 계속 에러가 떴다. 이때 뜬 에러는 계속 illegal instruction(core dumped)였다.

 

3) 이중 벡터

commands 가 vector<vector<int> >형인데, 이게 50*3 사이즈이다. 행이 50개고 열이 3개라고!!!

그래서 commands.size() 하면 최대 50이고

commands[1].size()하면 3인건데....

한시간 넘게 commands[1].size()라고 해놓고서 실험은 되는데 왜 정답이 아니지! 이러고 있었는데....

이것 때문에 계속 segmentation fault가 난 것이었다.

후...ㅎㅎ

 

'컴퓨터기본 > 문제풀이' 카테고리의 다른 글

[이것이~] 15. 구현  (0) 2021.06.14
[백준] 10828번, 1991번  (0) 2021.06.14
[이것이~] 탐욕법, 구현  (0) 2021.06.14
[백준] 2750번, 1181번, 1431번  (0) 2021.06.14
[백준] 11654번, 11720번, 10809번  (0) 2021.06.14