하 .. 최종 구현할때 질게에 있는 반례 다 잘돌아가고 시간복잡도 넉넉한데 왜 틀렸을까하고 코드 첫부분부터 보다가 깨달았음ㅋ 전역 배열 선언할때 사이즈 서로 착각해서 잘못 선언해놨던것임 하하 하하하하 하하하 .. 사실 안웃겨
그리고 문제 조건에서 오래된거 없애는거 보고 처음 접근할땐 무작정 큐로 했는데 사실 내가 사용했던 자료구조로는 큐쓰면 해당 학생을 찾는게 안되기때문에 큐사용이 의미없어짐..ㅎㅎ 다 구현할때쯤 깨달았음 하하 차라리 구조체로 자료구조 쓴다음 큐쓰거나 하면 좀 달랐을까 싶지만 더 꼬일거같아서 걍 코드 갈아엎고 다시짰다 ㅎ.. 무튼 .. 무작정 구현하려들지말자 ..
그리고 초안 짜는게 매우 중요하구나 .. 싶었다 .. 두번째 코드 다시 갈아엎을때 주석으로 초안짜고 넘어가니 걍 넘술넘술 잘 구현됨ㅋ
int main(){
// 0. input 받기
// 1. 기존에 추천된 학생인가?
// 1-a. 기존 추천 학생일때
// 1-b. 기존 추천 학생 아닐때
// 1-b-1. 사진틀이 다 안찼을때
// 1-b-2. 사진틀이 다 찼을때
// 2. 사진틀 정렬 후 출력
return 0;
}
정답 코드
#include <cstdio>
#include<algorithm>
int N, M,thisS;
int photo[20 + 1]; //사진 틀
int recmd[100 + 1]; //추천수
int queueS[1000 + 1]; // 추천하는 횟수
int existNum; // 기존 추천학생일시, 그 학생의 번호
int pt;
int main() {
scanf("%d %d", &N, &M);
for (int i = 0; i < M; i++) {
scanf("%d", &thisS);
bool isExist = false;
bool isLeft = false;
// 1. 기존에 추천된 학생인가?
for (int j = 0; j < N; j++) {
if (photo[j] == thisS) {
isExist = true;
existNum = photo[j];
break;
}
}
if (isExist) { // 1-a. 기존 추천 학생일때
recmd[existNum]++;
}
else { // 1-b. 기존 추천 학생 아닐때
for (int j = 0; j < N; j++) {
if (photo[j] == 0) {
pt = j;
isLeft = true;
break;
}
}
if (isLeft) { // 1-b-2. 사진틀이 다 안찼을때
photo[pt] = thisS;
queueS[i] = thisS;
recmd[thisS]++;
}
else { // 1-b-1. 사진틀이 다 찼을때
int outN = 0;
int outQN = 0;
int minR = 1001; // 최소 추천횟수인 학생을 찾기위한, 최대 추천횟수+1
for (int j = 0; j <= i; j++) {
if (recmd[queueS[j]] < minR && recmd[queueS[j]]!=0) {
minR = recmd[queueS[j]]; // 최소 추천횟수
outN = queueS[j]; // 삭제할 학생 번호
outQN = j; // 시간순 배열에서 삭제할 인덱스
}
}
//printf("빠지게될 학생번호: %d\n", outN);
queueS[outQN]=0;
recmd[outN] = 0;
for (int j = 0; j < N; j++) {
if (photo[j] == outN) {
photo[j] = thisS;
recmd[thisS]++;
queueS[i] = thisS;
break;
}
}
}
}
// 검토용 출력
//printf("%d번째 : ", i + 1);
//for (int k = 0; k < N; k++) {
// printf("%d ", photo[k]);
//}
//printf("\n");
}
std::sort(photo, photo + N);
for (int i = 0; i < N; i++) {
if(photo[i]!=0)
printf("%d ", photo[i]);
}
}