새소식

반응형
알고리즘/백준 문풀

[C++] 백준 BOJ - 후보 추천하기 (1713)

  • -
728x90
반응형

링크 : https://www.acmicpc.net/problem/1713

 

1713번: 후보 추천하기

첫째 줄에는 사진틀의 개수 N이 주어진다. (1 ≤ N ≤ 20) 둘째 줄에는 전체 학생의 총 추천 횟수가 주어지고, 셋째 줄에는 추천받은 학생을 나타내는 번호가 빈 칸을 사이에 두고 추천받은 순서대

www.acmicpc.net

TIL

1) 풀면서 놓쳤던점 

하 .. 최종 구현할때 질게에 있는 반례 다 잘돌아가고 시간복잡도 넉넉한데 왜 틀렸을까하고 코드 첫부분부터 보다가 깨달았음ㅋ 전역 배열 선언할때 사이즈 서로 착각해서 잘못 선언해놨던것임 하하 하하하하 하하하 .. 사실 안웃겨

 

그리고 문제 조건에서 오래된거 없애는거 보고 처음 접근할땐 무작정 큐로 했는데 사실 내가 사용했던 자료구조로는 큐쓰면 해당 학생을 찾는게 안되기때문에 큐사용이 의미없어짐..ㅎㅎ 다 구현할때쯤 깨달았음 하하 차라리 구조체로 자료구조 쓴다음 큐쓰거나 하면 좀 달랐을까 싶지만 더 꼬일거같아서 걍 코드 갈아엎고 다시짰다 ㅎ.. 무튼 .. 무작정 구현하려들지말자 ..

 

그리고 초안 짜는게 매우 중요하구나 .. 싶었다 .. 두번째 코드 다시 갈아엎을때 주석으로 초안짜고 넘어가니 걍 넘술넘술 잘 구현됨ㅋ

하하

그런의미에서 초안만 한눈에 보자면 아래와 같다 ^.^ 첫시도엔 걍 냅다 신나서 초안 안짜고 풀었더니 시간낭비 쩔게 했음ㅋㅎㅋㅎ

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]);
	}
}
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.