제주 탈출 일지

[c++] nhn pre-test 1 - 1 본문

코딩 테스트

[c++] nhn pre-test 1 - 1

귀건 2020. 10. 24. 16:04
728x90
반응형

1번을 정말 공들여서 풀었지만,,, 다른 문제를 제대로 못풀게 되었다. 시간이 없어서 코드도 못가져옴.ㅠㅠ

#include <iostream>
#include <sstream>
#include <map>
#include <vector>
#include <algorithm>

using namespace std;

void solution(int numOfAllPlayers, int numOfQuickPlayers, char *namesOfQuickPlayers, int numOfGames, int *numOfMovesPerGame) {
	
	map<char, int> game_;//술래 걸린 횟수.
	for(int i = 0; i < numOfAllPlayers; i++) // 참여하는 인원 수 만큼 map을 초기화.
	{
		game_[i+65] = 0;
	}
	if(0 >= numOfQuickPlayers || numOfQuickPlayers > numOfAllPlayers / 2) // 빠른 인원 수 제한
	{
		cout << "error" << endl;
		return;
	}
	vector<char> fast;// 빠른 인원.
	for(int i = 0; i < numOfGames; i++) 
	{
		fast.push_back(namesOfQuickPlayers[i]); //빠른 인원 초기화
	}
	vector<int> gnum(numOfGames); //술래가 동작하는 방식.
	for(int i = 0; i < numOfGames; i++) // 술래 움직임 초기화.
	{
		gnum[i] = numOfMovesPerGame[i];
	}
	//첫번째 술래는 A
	//A는 gnum의 [0]처럼 움직인다. 
	char tagger = 'A'; // A는 처음 술래.
	game_[tagger] += 1;
	int tag_idx = 0;
	map<int, char> set; // 앉을 자리
	
	for(int i = 0; i < numOfAllPlayers-1; i++) // B부터 자리를 만듬
	{
		set[i] = 66+i;
	}
	// 첫번째 움직임 gnum.front();
	vector<int>::iterator iter2;
	for(iter2 = gnum.begin(); iter2 != gnum.end(); iter2++)
	{
		if(tag_idx + *iter2 < 0)  // 인덱스가 0보다 작아지는 경우
	{ 
		map<int, char>::reverse_iterator iter = set.rbegin();
		if(find(fast.begin(), fast.end(), set[iter->first - tag_idx + *iter2 + 1]) != fast.end() )// 빠른 사람이다.
			 {
				 game_[tagger] += 1; //빠른 사람은 술래가 되지 않기 때문에 술래가 한번 더.
				tag_idx = iter->first - tag_idx + *iter2 + 1;
			 }
		else //빠른 사람이 아니다.
		{
			char tmp = tagger;
			tagger = set[iter->first - tag_idx + *iter2 + 1];
			set[iter->first - tag_idx + *iter2 + 1] = tmp; //술래와 자리 변경
			game_[tagger] += 1; //해당 자리의 사람은 이제 술래.
			tag_idx = iter->first - tag_idx + *iter2 + 1;
			
		}
	}
	else if(tag_idx + *iter2 > numOfAllPlayers-1) //최대자리보다 인덱스가 커지는 경우.
	{
		//set[set.front()->first - tag_idx + gnum.front + 1]
		if(find(fast.begin(), fast.end(), set[tag_idx + *iter2 - numOfAllPlayers]) != fast.end())//빠른 사람이다.
		{
				game_[tagger] += 1;
				tag_idx = tag_idx + *iter2 - numOfAllPlayers;
		}
		else //빠른 사람이 아니다.
		{
			char tmp = tagger; //?
			tagger = set[tag_idx + *iter2 - numOfAllPlayers];
			set[tag_idx + *iter2 - numOfAllPlayers] = tmp; //술래와 자리 변경
			game_[tagger] += 1; //해당 자리의 사람은 이제 술래.
			tag_idx = tag_idx + *iter2 - numOfAllPlayers;
		}
  }
			
	else 
	{
		if(find(fast.begin(), fast.end(), set[tag_idx + *iter2]) != fast.end())//빠른 사람이다.
		{
				game_[tagger] += 1;
				tag_idx = tag_idx + *iter2;
		}
		else //빠른 사람이 아니다.
		{
			char tmp = tagger;
			tagger = set[tag_idx + *iter2];
			set[tag_idx + *iter2] = tmp; //술래와 자리 변경 
			game_[tagger] += 1; //해당 자리의 사람은 이제 술래.
			tag_idx = tag_idx + *iter2;
		}
	}
	}
	//12시 방향부터 시계 방향으로 앉아 있는 사람들의 이름 및 술래에 걸린 횟수 출력
	//set<int, char>
	for(int i = 0; i < set.size(); i++)
	{
		cout << set[i] << " " << game_[set[i]] << endl;
	}
	cout << tagger << " " << game_[tagger];

}

struct input_data {
  int numOfAllPlayers;
  int numOfQuickPlayers;
  char *namesOfQuickPlayers;
  int numOfGames;
  int *numOfMovesPerGame;
};

void process_stdin(struct input_data& inputData) {
  string line;
  istringstream iss;

  getline(cin, line);
  iss.str(line);
  iss >> inputData.numOfAllPlayers;

  getline(cin, line);
  iss.clear();
  iss.str(line);
  iss >> inputData.numOfQuickPlayers;

  getline(cin, line);
  iss.clear();
  iss.str(line);
  inputData.namesOfQuickPlayers = new char[inputData.numOfQuickPlayers];
  for (int i = 0; i < inputData.numOfQuickPlayers; i++) {
    iss >> inputData.namesOfQuickPlayers[i];
  }

  getline(cin, line);
  iss.clear();
  iss.str(line);
  iss >> inputData.numOfGames;

  getline(cin, line);
  iss.clear();
  iss.str(line);
  inputData.numOfMovesPerGame = new int[inputData.numOfGames];
  for (int i = 0; i < inputData.numOfGames; i++) {
    iss >> inputData.numOfMovesPerGame[i];
  }
}

int main() {
  struct input_data inputData;
  process_stdin(inputData);

  solution(inputData.numOfAllPlayers, inputData.numOfQuickPlayers, inputData.namesOfQuickPlayers, inputData.numOfGames, inputData.numOfMovesPerGame);
  return 0;
}
728x90
반응형
Comments