관리 메뉴

한다 공부

[C] 큐 : 백준 알고리즘 2164번 카드2 본문

Algorithm/문제풀이

[C] 큐 : 백준 알고리즘 2164번 카드2

사과당근 2021. 7. 15. 17:35

안녕하이소..

 

큐 문제를 풀어봤다..

아니 근데 이거 어제 금방 다 했는데

런타임 에러가 떠가지고 한 3시간 고민하다가 모르겠어서

백준 질문 게시판에 올리고 늦게 잤다.

 

아침에 일어나니 어떤 정말 고마우신 분께서 에러난 부분 알려주셨는데

int main() 써야하는걸 void main() 써서 에러난 거였다

약간 슬펐다..

그 분 아니었으면 평생 몰랐을 듯 ㅠㅠ

근데 나 void main 쓰던 사람 아닌데 왜 void main 이라 했지? 봤더니

 

처음에 return값 관련해서 에러가 나서 이것 저것 만져보다가 (해당 에러는 중간에 수정 완료..)

void로 고쳐보기도 하고.. 그랬었던 것 같은데

원래대로인 int로 수정을 안한 것 같다.

 

그러니까..

오늘의 교훈 : 평소에 안하던 짓 좀 하지말자

 

 


 

백준 알고리즘 2164번 문제

 

 

문제를 풀기 위해 생각을 해봤다. 흠

원형 큐 생성하듯이 한 다음에,

그때 그때 사이즈가 다른 원형 큐를 만들고 싶어서

동적할당을 해줬다.

malloc~ 해제는 free~

 

그리고 데이터를 옮길 때는n-1번 만큼,

앞에 카드를 빼서 dequeue 하는걸 2번,

2번째 dequeue한 건 back이라는 변수에 받아서 맨 뒤에 enqueue!

 

n-1번 반복하면 마지막에 카드 하나가 남는데,

front+1 (==rear) 번째에 있으므로 출력해주면 끝! 이다

 

문법적 실수같은 것만 조심하면 된다.. (씁쓸)

 

#include<stdio.h>

typedef int element;
typedef struct {
	int front;
	int rear;
	element *data;
}QueueType;

void init_queue(QueueType* q) {
	q->front = q->rear = 0;
}

void enqueue(QueueType* q, element item, int n) {
	q->rear = (q->rear + 1) % n;
	q->data[q->rear] = item;

}

element dequeue(QueueType* q, int n) {
	q->front = (q->front + 1) % n;
	return q->data[q->front];
}

int main() {
	int n, i, back;
	QueueType q;
	init_queue(&q);

	scanf(" %d", &n);
	//그때 그때 사이즈 맞는 원형 큐를 생성하고싶어서 동적할당
	q.data = (element*)malloc((n + 1) * sizeof(element));
	
    //데이터 삽입 1~N
	for (i = 1; i <= n ; i++)
		enqueue(&q, i, n + 1);

	//데이터 옮기기
	for (i = 1; i < n; i++) {
		dequeue(&q, n + 1);
		back = dequeue(&q, n + 1);
		enqueue(&q, back, n + 1);
		}

	printf("%d", q.data[(q.front + 1)%(n+1)]);
	
    free(q.data);
}

 

큐 문제 빨리 끝내고 덱 문제 하나 풀려고 했는데

이 문제에서 너무 많은 시간을 써서...

 

다음 공부로는 덱 문제 말고 연결리스트를 하려고 한다.

연결리스트 정리 포스팅에서 봐유~

 

파이팅!