[C++] 프로그래머스 같은 숫자는 싫어
2020. 11. 10.
반응형

programmers.co.kr/learn/courses/30/lessons/12906

 

코딩테스트 연습 - 같은 숫자는 싫어

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은

programmers.co.kr

 

1. 서론

 

level 1의 간단한 문제이다. 효율성을 보는 게 조금 독특했다. 아마 이러한 방법으로는 풀지 말라는 일종의 제한장치인 듯.

 

2. 문제 풀이

 

배열이 있다. 그 배열에 중복되는 숫자를 제외하고 난 배열을 return 하는 게 문제이다.

입출력으로 예를 들자면

 

4 4 4 3 3 -> 4 3

 

그래서 처음에는 예전에 풀어본 것 같은데? 싶어서 배열에 앞뒤가 같은 숫자가 나오면 지우고, 다시 그 index부터 검사해서 끝까지 같은 로직을 반복한 후 그 배열을 return 했다. 그런데 좀 이상했다. 그러면 왜 arr, answer 두 개의 배열을 준 걸까? 답을 제출해보니 알 수 있었다.

나는 erase 함수를 썼는데 그게 효율성에서 딱 걸리는 바람에 효율성 테스트 케이스 4개를 전부 틀렸다. 

 

그래서 그때 알았다. 중복되는 숫자를 지우는 게 아니라 골라 담는 것이라는 것을...

 

3. 코드 설명

 

#include <vector>

using namespace std;

vector<int> solution(vector<int> arr) 
{
    vector<int> answer;
    int i, t;
    
    t = 0;
    answer.push_back(arr[0]);
    for (i = 1; i < arr.size(); i++)
    {
        if (answer[t] != arr[i])
        {
            answer.push_back(arr[i]);
            t++;
        }
    }
    return answer;
}

 

arr는 주어진 배열, answer는 답을 적어 넣는 배열.

일단 answer의 첫 번째 항에 arr의 첫번째 값을 넣는다. 그리고 그 값을 표본으로 arr를 검사해 나간다. 

만약에 arr와 answer의 값이 같으면 아무것도 하지 않고, 다른 경우에는 answer에 arr의 값을 넣고 그 넣은 값과 뒤의 arr 값을 또 비교한다.

이렇게 끝까지 돌면 중복되지 않은 값만 answer 배열에 담기는 것이다. 

 

 

 

 

 

 

 

반응형
myoskin