홍시홍의 프로그래밍

[백준 14670] 병약한 영정 본문

카테고리 없음

[백준 14670] 병약한 영정

홍시홍 2019. 11. 21. 20:11

https://www.acmicpc.net/problem/14670

 

14670번: 병약한 영정

프로그램의 입력은 표준 입력으로 받는다. 입력의 첫 줄에는 약의 종류의 개수 N이 입력된다. (1 ≤ N ≤ 100) 그 다음 N개의 줄에는 각각 약의 효능과 약의 이름이 숫자로 주어진다. (0 ≤ Me, Mn ≤ 100) 각 약의 이름과 효능은 다른 어떤 약의 이름, 효능과 중복되지 않음을 보장한다. 다음 줄에는 영정이가 겪는 증상의 개수 R이 입력된다. (1 ≤ R ≤ 100) 다음 R 줄에는 증상의 개수 Li 와 증상들 (S1, S2, … SL)이

www.acmicpc.net

 

요구사항

 - 해시를 구현하여서 key가 있을 경우, key에 해당하는 value를 출력

 

#include <iostream>

using namespace std;
const int PN = 23;
const int NODE_SIZE = 101;
const int HASH_SIZE = 101;

int n, m;
struct Node {
	int data;
	int value;
	Node* next;
};
Node node[NODE_SIZE];
int idx;

struct List {
	Node *head;
	void add(int data,int value)
	{
		Node *newNode = head;
		head = &node[idx++];
		head->data = data;
		head->value = value;
		head->next = newNode;
	}
};

unsigned int get_key(int key)
{
	return (key*PN) % HASH_SIZE;
}


List Myhash[HASH_SIZE];

int contain(int data)
{
	unsigned int key = get_key(data);
	Node *temp = Myhash[key].head;
	while (temp != 0)
	{
		if (temp->data == data)
		{
			return temp->value;
		}
		temp = temp->next;
	}
	return -1;
}
int main()
{
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		int x, y;
		scanf("%d%d", &x, &y);
		int key = get_key(x);
		Myhash[key].add(x,y);
	}
	scanf("%d", &m);
	for (int i = 0; i < m; i++)
	{
		int ans[101];
		int x;
		int flag = 0;
		scanf("%d", &x);
		for (int j = 0; j < x; j++)
		{
			int y;
			scanf("%d", &y);
			int tem = contain(y);
			if (tem == -1)
			{
				flag = 1;
			}
			else
			{
				ans[j] = tem;
			}
		}
		if (flag == 1)
			printf("YOU DIED");
		else
			for (int j = 0; j < x; j++)
				printf("%d ", ans[j]);
		printf("\n");
	}
}
Comments