• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

[질문은 아니고 해결법&코드 공유] deque로 풀어봤어요!

24.01.10 11:50 작성 24.01.10 12:17 수정 조회수 124

0

저는 37번 LRU 문제를 Deque랑 삽입 정렬로 풀었습니다.

삽입 정렬은 강사님 설명대로 반복된 입력값을 정렬시킬 때 사용했습니다.

 

deque는 캐시메모리 크기를 초과할 때 pop(제거)를 위해 사용했습니다.

 

처음에는 vector로 풀었는데, 이럴 경우

입력값 : 1 2 3 2 6 2 3 5 7

index :

0 1 2 3 4

vector<int> v :

1 6 2 3 5

에서 처음 입력됐던 1이 삭제돼야하는데, vector는 pop_back()만 있어서 앞쪽인 1이 아니라 뒤쪽인 5가 삭제됩니다.

 

그래서 pop_front() 혹은 pop_back()랑 push_front가 동시에 컨테이너가 없을까 찾아보다가, 양방향 입력/제거 가능한 deque를 사용했습니다!

(queue도 앞으로 들어오고 뒤로 나가는 거지만 정렬하기 힘드니까 패스!)

 

아래 코드 첨부합니다!

최근에 해시 공부하면서 익힌 iterator(반복자)도 사용했는데, iterator가 처음이신 분들은 대충 index처럼 요소 접근하는걸로 이해해주시면 됩니다!(정확히는 주소 접근이지만!)

 

#include<iostream>
#include<deque>
#include<algorithm>

using namespace std;

int main() {
	int S{}, N{};
	deque<int> dq;

	// 중복 값 정렬
	cin >> S >> N;
	for (int i = 0; i < N; i++) {
		int tmp{};
		cin >> tmp;

		// 중복값 찾기
		deque<int>::iterator it = find(dq.begin(), dq.end(), tmp);
		if (it == dq.end()) dq.push_front(tmp); // 중복 없으면 그냥 앞에서 삽입
		else { // 중복값 있다면
			// (tmp = *it을 할 필요없음 : 그 값이 그 값이니까)
			// 하나씩 뒤로 밀기. 제일 앞쪽에 도착하면 it-1을 못하니까 반복 종료
			for (it; it != dq.begin(); it--) {
				*it = *(it - 1);
			}
			*it = tmp;
		}

		// 제일 뒤쪽 삭제
		if (dq.size() > S) dq.pop_back();
	}

	for (int i = 0; i < dq.size(); i++)
		cout << dq[i] << " ";
}

 

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.12

안녕하세요, 인프런 AI 인턴입니다.

고객님께서 37번 LRU 문제를 Deque와 삽입 정렬을 사용하여 해결하셨다니 정말 대단하세요! vectorpop_back() 기능만으로는 최신 값을 유지하기 어려운 문제를 deque를 활용하여 스마트하게 해결하셨네요. 반복자(iterator)를 사용한 경험도 다른 분들에게 도움이 되리라 생각됩니다.

이런 풀이 공유는 다른 학습자들에게도 많은 영감을 줄 수 있겠어요. 더 많은 질문이나, 토론이 필요하시면 언제든지 인프런의 수강 전 문의 게시판을 통해 지식공유자님께 질문을 남길 수 있다는 점을 참고해 주세요.

강의에 대해 더 궁금한 사항이 있으시다면 아래 링크를 통해 문의를 남기실 수 있습니다.
문의하기

앞으로도 즐거운 코딩 학습이 되시길 바랍니다!