37번 LRU
37번 LRU#include <iostream>#include <string>#include <vector>#include <cstdlib>
using namespace std;int main(int argc, char** argv) { int s,n, wNum, hit = -1, tmp, usedSize = 0; cin >> s >> n; vector<int> v(s);
cout << "s : " <<s << " " << "n : " << n << "\n"; for(int t = 0; t < n; t++) { cin >> wNum; for(int i = 0; i < v.size(); i++) { if(v[i] == wNum) { hit = i; break; } }
//hit일때 if(hit != -1) { tmp = v[hit]; for(int i = hit - 1; i>=0; i--) { v[i+1] = v[i]; } } else { for(int i = s-1; i>=0; i--) { v[i+1] = v[i]; } }
v[0] = wNum; hit = -1; } for(int i = 0; i < s; i++) cout << v[i] << " ";}제가 이 문제를 이렇게 풀었는데 이상하게 s값 (캐시 메모리의 크기) 가 10이 넘어가면 안되네요..ㅠㅠ 10보다 작으면 정상적으로 되는데.. 그래서 체점 해보면 1번2번은 맞는데 뒤에꺼는 틀리다고 하네요. 혹시 어떤게 문제인지 아시나요??..아무리 찾아도 못찾겠어요..ㅠㅠ
LEETO
0
1
채점시 시간초과 오류 관련
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char** argv) {
int i,j,S,N,Data,tmp,ind;
cin>>S;
cin>>N;
vector<int> v(S);
for(i=0;i<N;i++){
cin>>Data;
ind=N;
for(j=0;j<S;j++){
if(v[j]==Data){
ind=j;
break;
}
}
if(ind!=N){
for(j=ind;j>0;j--){
v[j]=v[j-1];
}
}
else{
for(j=N-1;j>0;j--){
v[j]=v[j-1];
}
}
v[0]=Data;
}
for(j=0;j<S;j++){
cout<<v[j]<<" ";
}
return 0;
}
선생님, 안녕하세요. C++로 작성한 다음 코드를 돌렸을 경우, 답은 잘 나오는 것 같은데 시간 초과가 뜹니다. 원인을 알 수 있을까요?
Dong-Hwan Kim
0
1
37번 LRU문제 for문 값 관련
//miss
if(pos==-1){
for(j=j-1; j>=1; j--){
c[j]=c[j-1];
}
}
안녕하세요! 2중 for문 내의 miss부분을 처리하는 과정에서 저는 j = s-1이라 하지 않고 j = j-1이라고 입력했는데도 채점폴더에서 100점이 나왔는데 저처럼 해도 괜찮은건가요..? 왜 되는지 의문입니다 ㅠㅠ
Jisoo Park
0
1
선생님 c++ 라이브러리? 를 사용하는것에 큰 문제가 없나요?
코딩 테스트나 코딩 대회에서는 시간 복잡도와 공간 복잡도까지 고려해야한다고 알고 있습니다. 이 문제를 저는 vector 라이브러리를 활용해서 (erase, pop_back, insert 등) 풀었습니다. 이 라이브러리를 활용하는 것이 코딩 테스트나 대회에서 불리하게 작용하나요?
비슷한 느낌으로 scanf, printf 말고 cin, cout 을 쓰는것도 살짝 느리다고 알고 있습니다. 이런 이유에서 선생님께서는 scanf, printf 를 사용하시는건가요?
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int s, n, idx = 0, i, tmp;
bool isValue = false;
scanf("%d %d", &s, &n);
vector<int> cache(s);
for (i = 0; i < n; i++) {
isValue = false;
scanf("%d", &tmp);
for (int j = 0; j < cache.size(); j++) {
if (tmp == cache[j]) {
isValue = true;
idx = j;
}
}
if (!isValue) {
cache.insert(cache.begin(), tmp);
if (cache.size() > s)
cache.pop_back();
}
else {
cache.erase(cache.begin() + idx);
cache.insert(cache.begin(), tmp);
}
}
for (unsigned i = 0; i < cache.size(); i++)
cout << cache[i] << ' ';
cout << endl;
return 0;
}
kiryanchi
0
2
선생님, 질문있습니다.
선생님, 안녕하세요?
저는 선생님의 가르침처럼 a가 들어오면 캐시에 있는 작업번호들과 하나하나 비교해보는 것이 아닌
함수를 하나 만들어서 현재 들어온 a에 대하여(제 코드 상에서는 income에 해당합니다) 캐시 전체를 일괄 탐색한 다음
만일 캐시 안에 a가 있다면 그에 맞는 작업을 진행하고 없다면 맨 앞에서부터 밀어내는 방식으로 코드를 만들어봤습니다.
이러한 방식도 그럴듯한 답이 될 수 있는가 궁금합니다.
항상 강의 감사드립니다.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int S; // 저장용량
int N; // 작업개수
bool isincache(int* cache, int income) {
int income_ = income;
for (int i = 0; i < S; i++) {
if (income_ == cache[i]) { return true; break; }
}
return false;
}
int main() {
srand(time(NULL));
scanf("%d", &S);
scanf("%d", &N);
int* cache = (int*)malloc(sizeof(int) * S);
int* work_list = (int*)malloc(sizeof(int) * N);
int income = 0;
int index = 0;
int current_cache_capacity = 0;
for (int i = 0; i < N; i++) {
work_list[i] = (rand() % 100) + 1;
}
//임의의 작업 번호를 다 집어넣음
printf("현재 작업번호 리스트 : ");
for (int i = 0; i < N; i++) { printf("%d ", work_list[i]); }
printf("\n");
int count1 = 0;
//애초에 빈 상태이니까 채우도록 하겠습니다.
while (S - current_cache_capacity >= 0) {
cache[S - current_cache_capacity] = work_list[count1++];
current_cache_capacity++;
}
//이렇게 되면 current_cache_capacity == S가 되어서, 캐시는 모두 차있는 상태
for (int i = 0; i < N; i++) {
income = work_list[i]; // income으로 for문이 돌때마다 초기화를 합니다.
//income이 work_list 안에 있는가? 없는가?를 분기로 하여 알고리즘 작성
if (isincache(cache, income)) {
int index = i;
int before = i - 1;
while (before >= 0) {
cache[before + 1] = cache[before];
before--;
}
cache[before + 1] = income;
}
else {
for (int i = S-1; i > 0; i--) {
cache[i] = cache[i - 1];
}
cache[0] = income;
}
}
for (int i = 0; i < S; i++) {
printf("%d ", cache[i]);
}
}
celestial_
0
1
문제 오류
문제에는 s 가 10 이하라고 했는데 채점폴더 input 을 보니 4번과 5번은 s 가 각각 15 과 17로 10을 넘어서 틀린 답으로 뜨네요.
acoustic0419
0
1
어디서 틀린걸까요?
#pragma warning(disable:4996)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include<time.h>
#include<iostream>
#define endl '\n';
using namespace std;
int c[1001];
int arr[20];
int main() {
int s, n,tmp,k,wh;
scanf("%d%d", &s, &n);
for (int i = 0; i < n; i++) {
scanf("%d", &tmp);
if (arr[0] == 0&&c[tmp]==0) {
arr[0] = tmp;
c[tmp] = 1;
}
else if (arr[0]!=0&&c[tmp]==0) {
for (int j = i; j > 0; j--) {
arr[j + 1] = arr[j];
arr[j] = arr[j - 1];
}
c[tmp] = 1;
arr[0] = tmp;
}
else if (arr[0] != 0 && c[tmp] == 1) {
for (k = 0; k < i; k++) {
if (arr[k] == tmp) break;
}
for (int j = k; j > 0; j--) {
arr[j + 1] = arr[j];
arr[j] = arr[j - 1];
}
arr[0] = tmp;
}
}
for (int i = 0; i < s; i++) {
printf("%d ", arr[i]);
}
}
해쉬 느낌으로 배열을 하나선언해서풀어봤습니닫
1,2,3,4,5번에서
1,2번만맞고 3,4,5에서 자꾸 틀리는데 왜틀렸는지를 모르겟어요 ...분명 이론적으로 맞았다 생각이드는데
숫자 한두개씩 틀리더라구요
blizzarduser
0
3