728x90
반응형


문제 설명
정수 배열 arr와 query가 주어집니다.
query를 순회하면서 다음 작업을 반복합니다.
- 짝수 인덱스에서는 arr에서 query[i]번 인덱스를 제외하고 배열의 query[i]번 인덱스 뒷부분을 잘라서 버립니다.
- 홀수 인덱스에서는 arr에서 query[i]번 인덱스는 제외하고 배열의 query[i]번 인덱스 앞부분을 잘라서 버립니다.
위 작업을 마친 후 남은 arr의 부분 배열을 return 하는 solution 함수를 완성해 주세요.
제한 사항
- 5 ≤ arr의 길이 ≤ 100,000
- 0 ≤ arr의 원소 ≤ 100
- 1 ≤ query의 길이 < min(50, arr의 길이 / 2)
- query의 각 원소는 0보다 크거나 같고 남아있는 arr의 길이 보다 작습니다.
입출력 예
arr | query | result |
[0, 1, 2, 3, 4, 5] | [4, 1, 2] | [1, 2, 3] |
입출력 예 #1
- 이번에 매번 처리할 query의 값과 처리 전후의 arr의 상태를 표로 나타내면 다음과 같습니다.
query의 값 | query 처리 전 | query 처리 후 | 비고 |
1 | [0, 1, 2, 3, 4] | [1, 2, 3, 4] | 1번 인덱스의 쿼리이므로 앞부분을 자른다. |
2 | [1, 2, 3, 4] | [1, 2, 3] | 2번 인덱스의 쿼리이므로 뒷부분을 자른다. |
4 | [0, 1, 2, 3, 4, 5] | [0, 1, 2, 3, 4] | 0번 인덱스의 쿼리이므로 뒷부분을 자른다. |
- 따라서 [1, 2, 3]을 return 합니다.
문제 풀이
저는 이번 문제에 처음 접근했을 때 주어진 query의 값(인덱스)에 따라 원본 배열(arr)의 요소를 삭제(erase)하는 것에 집중하였고, 실패 결과를 얻게 되었습니다.
이후 해당 코드를 수정하기 위해 생각해보니 지속적으로 erase()함수를 동작시키는 것보다, 원본 배열(arr)의 시작과 끝 인덱스를 관리하여 해당 부분만 결과로 넘겨주는 것이 효율적이라는 생각이 들었으며, 해당 방법으로 문제를 해결하게 되었습니다.
> 시작 인덱스, 종료 인덱스 선언
int startIndex = 0;
int endIndex = arr.size();
> 인덱스에 따른 처리
if (i % 2 == 0)
endIndex = startIndex + query[i];
else
startIndex += query[i];
정답 코드
더보기
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<int> arr, vector<int> query) {
vector<int> answer;
int startIndex = 0;
int endIndex = arr.size();
for (int i = 0; i < query.size(); i++)
{
if (i % 2 == 0)
{
endIndex = startIndex + query[i];
}
else
{
startIndex += query[i];
}
}
for (int i = startIndex; i <= endIndex; i++)
{
answer.push_back(arr[i]);
}
return answer;
}
728x90
반응형
'코딩테스트 > 프로그래머스 (Lv. 0)' 카테고리의 다른 글
[프로그래머스/C++ 문제 풀이] Lv. 0 - 배열 만들기 2 (0) | 2024.07.01 |
---|---|
[프로그래머스/C++ 문제 풀이] Lv. 0 - 코드 처리하기 (0) | 2024.07.01 |
[프로그래머스/C++ 문제 풀이] Lv. 0 - 최빈값 구하기 (0) | 2024.06.29 |
[프로그래머스/C++ 문제 풀이] Lv. 0 - OX퀴즈 (0) | 2024.06.29 |
[프로그래머스/C++ 문제 풀이] Lv. 0 - 다음에 올 숫자 (0) | 2024.06.25 |