프로그래밍 알고리즘

[정올 1516] 단어 세기

꾸준한사람 2023. 1. 5. 01:35
반응형

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=788&sca=99&sfl=wr_hit&stx=1516 

 

JUNGOL

 

www.jungol.co.kr

#include <stdio.h>

char stc[205];
struct Node {
	Node* pPrev;
	Node* pNext;
	int len, cnt;
	char* pWord;

	Node() : pPrev(nullptr), pNext(nullptr), len(0), cnt(0), pWord(nullptr) {}
	Node(Node* prev, Node* next) : pPrev(prev), pNext(next), len(0), cnt(1), pWord(nullptr)
	{
		next->pPrev = prev->pNext = this;
	}
	~Node() {
		if (pWord) delete[] pWord;
	}
} H, T;

int strcmp(const char* pA, const char* pB, int lenA, int lenB)
{	//A가 크면 1, 같으면 0, B가 크면 -1
	int len = (lenA > lenB) ? (lenB) : (lenA);
	for (int i = 0; i < len; i++) {
		if (pA[i] > pB[i]) return 1;
		else if (pA[i] < pB[i]) return -1;
	}
	if (lenA > lenB) return 1;
	else if (lenA == lenB) return 0;
	else return -1;
}

int Input() {
	for (int i = 0; i < 205; i++) stc[i] = 0;
	fgets(stc, sizeof(stc), stdin);
	if (strcmp("END", stc, 3, 3) == 0) return 0;
	else return 1;
}

Node* GetLink(char* p, int len) {
	Node* tmp = H.pNext;
	while (tmp != &T) {
		int rslt = strcmp(tmp->pWord, p , tmp->len, len);
		if (rslt == 1) { //tmp가 더 큰 경우, tmp 바로 앞에 달아야 한다.
			return tmp->pPrev;
		}
		else if (rslt == 0) { //둘이 같은 경우
			tmp->cnt++;
			return nullptr;
		}
		else { //p가 더 큰 경우
			tmp = tmp->pNext;
		}
	}

	return tmp->pPrev;
}

int main(void) {
	while (Input()) {
		H.pNext = &T; T.pPrev = &H;
		H.len = -1; T.len = -2;

		for (int i = 0, j = 0; stc[i] != 0; i += j + 1)	{
			for (j = 0; stc[i + j] != ' ' && stc[i + j] != '\n'; j++)	{}
			Node* pInsert = GetLink(stc + i, j);
			if (pInsert) {
				Node* pNew = new Node(pInsert, pInsert->pNext);
				pNew->len = j;
				pNew->pWord = new char[j + 1];
				for (int k = 0; k < j; k++) pNew->pWord[k] = stc[i + k];
				pNew->pWord[j] = 0;
			}
			if (stc[i + j] == '\n')	break;
		}
		for (Node* pPrint = H.pNext; pPrint != &T;)	{
			printf("%s : %d\n", pPrint->pWord, pPrint->cnt);
			Node* pDel = pPrint;
			pPrint = pPrint->pNext;
			delete pDel;
		}
	}
	   
	return 0;
}
반응형

'프로그래밍 알고리즘' 카테고리의 다른 글

[정올 1535] 단어집합2  (0) 2023.01.05
[정올 1534] 10진수를 2,8,16진수로  (0) 2023.01.05
[정올 1462] 보물섬  (0) 2023.01.05
[정올 1457] 영역 구하기  (0) 2023.01.05
[정올 1419] 엔디안  (0) 2023.01.04