inflearn logo
강의

Course

Instructor

Introduction to Algorithm Problem Solving for IT Employment (with C/C++): Coding Test Preparation

37. Least Recently Used (Insertion Sort Code Style)

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

304

ydkrkek

1 asked

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] << " ";
}

 

c++ 코딩-테스트 deque 자료구조

Answer 1

0

communityai8509

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

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

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

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

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

87번 채점 프로그램에 오류가 있는 것 같습니다.

0

88

2

그리디 파트

0

114

2

안녕하세요. 선생님(54번 코드 관련 문의)

0

141

2

테스트 파일 exit_coe_1, time_limit_exceeded 질문

0

142

1

C언어로 코드를 짜면 채점 시에 한 문제 빼고 시간 초과가 발생하는데 해결하는 방법이 있을까요?

0

171

1

19번 질문있습니다

0

121

1

6번 관련 채점오류입니다

0

88

2

22번 문제는 C로 풀어주신 건가요 C++로 풀어주신 건가요?

0

166

2

dev C++ 콘솔창 바로 닫힘

0

245

1

최신화하기

0

171

1

채점이 안되요...

1

260

1

안녕하세요 강사님 정렬에 대해서 설명이 조금 더 듣고 싶습니다.

0

113

1

45번 공주구하기 문제를 list를 이용해서 이렇게 풀어도 될까요?

0

155

1

39번 두 배열 합치기 문제 채점 오류인가 코드 오류인가

0

155

0

채점기에서 틀렸다고 나오는데 이유를 모르겠습니다.

0

149

2

해당 강의에서 C언어로만 진행하는 강의 문의 건

0

144

2

87번 문제 섬나라 아일랜드 질문

0

128

1

16번 문제에서 직접 답을 대입하면 정답이 나오는데 채점에서 wrong answer가 나옵니다.

0

149

1

40번 교집합 문제

0

166

1

43번 뮤직비디오 문제 테스트케이스 4번을 만족 못합니다.

0

169

1

41. 연속된 자연수의 합 문제 질문있습니다.

0

165

1

질문있습니다.

0

191

2

시간초과가 나요

0

172

1

43번 문제 3 ~ 5번에 문제가 있는것 같습니다.

0

247

1