본문 바로가기
알고리즘(C++)

배열 - 배열제어하기

by 송파감자 2025. 1. 30.

1. 문제

/*
 문제 : 정수 배열 lst가 있다 배열의 중복값 제거하고, 배열데이터 내림차순으로 정렬해서 반환하는 solution함수 완성하기
 조건 : 
        - lst 길이는 2이상 1,000이하 
        - lst 원소값은 -100,000 이상 100,000이하 
*/

 

2. 문제의 코드

#include <vector>
#include <algorithm> //sort를 위해 선언
#include <iterator>
#include <iostream>

using namespace std;

vector<int> solution(vector<int> lst)
{
    
    return lst;
}
//-------------------------------------------------------------------------
#include <iostream>
#include <iterator>
void print(vector<int> vec)
{
    copy(vec.begin(), vec.end(), std::ostream_iterator<int>(cout, " "));
    cout << endl;
}
//-------------------------------------------------------------------------
int main()
{
    print(solution({ 4, 2, 2, 1, 1, 3, 4 })); // 4 3 2 1  
    print(solution({ 2, 1, 1, 3, 2, 5, 4 })); // 5 4 3 2 1

    return 0;
}

 

3. 나의 코드

또 못 풀엇다 (망코드)

vector<int> solution(vector<int> lst)
{
    sort(lst.rbegin(), lst.rend());

    auto NewTemp =  unique(lst.begin(), lst.end());
    int i = 0;

    for (auto It = lst.begin(); It != NewTemp; ++It)
    {
        lst[i] = *It;
         ++i;
    }
    cout << endl;
    
    return lst;
}

 

유니크함수 썼는데 왜 나오는겨

4. 정답 코드

vector<int> solution(vector<int> lst)
{
    sort(lst.begin(), lst.end()); // 오름차순 정렬 먼저

    auto NewEnd =  unique(lst.begin(), lst.end()); // 중복된 애를 반환함

    lst.resize(distance(lst.begin(), NewEnd));
  
    sort(lst.rbegin(), lst.rend());
    
    return lst;
}

 

5. 나의 코멘트

  • unique 함수 써야하는 건 알았다 ->하지만 얘가 뭘 반환하는지 정확히 몰랐음
    • 얘는 중복된 애들 맨 뒤로 미뤄놓고 중복된 애 첫애 위치를 반환한다
    • NewEnd는 lst 벡터에서
    • 1, 2, 2, 3, 3, 3이라면 1, 2, 3, 2, 3, 3 중에서 두번쨰 2 위치를 가리키는 애다!
  • 하지만 lst 벡터 사이즈는 그대로지! 그래서 resize를 시켜주는건디 이걸 또 어케하냐
  • distance 함수 첨봤다.. distance(위치1, 위치2) : 위치1과 위치2 사이의 거리 반환
  • 역시... 기본이 되어야 하는군....

'알고리즘(C++)' 카테고리의 다른 글

유니온 파인드 알고리즘  (0) 2025.02.03
배열 - 두개 뽑아서 더해서 정렬하기  (0) 2025.01.30
배열 - 배열정리하기  (0) 2025.01.30
큐- 요세푸스 문제  (0) 2025.01.28
스택 - 10진수를 2진수로 바꾸기  (0) 2025.01.28