ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ] 21608 상어 초등학교 / C++
    공부/PS (백준) 2021. 10. 8. 02:36
    #include <stdio.h>
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    
    int N;
    
    struct st {
    	int num;
    	int friends[4];
    };
    
    struct st students[20 * 20 + 10];
    
    int seats[20 + 10][20 + 10]; // (1, 1) ~ (N, N)
    
    int dx[4] = { -1,1,0,0 };
    int dy[4] = { 0,0,-1,1 };
    
    int cur_x, cur_y;
    
    struct cand {
    	int x, y;
    	int cnt_empty;
    	int cnt_friends;
    };
    
    vector <cand> candidates;
    
    bool cmp(cand &vec1, cand &vec2)
    {
    	if (vec1.cnt_friends > vec2.cnt_friends)
    	{
    		return true;
    	}
    	else if (vec1.cnt_friends == vec2.cnt_friends)
    	{
    		if (vec1.cnt_empty > vec2.cnt_empty)
    		{
    			return true;
    		}
    		else if (vec1.cnt_empty == vec2.cnt_empty)
    		{
    			if (vec1.x < vec2.x) return true;
    			else if (vec1.x == vec2.x)
    			{
    				if (vec1.y <= vec2.y) return true;
    				else return false;
    			}
    			else return false;
    		}
    		else return false;
    	}
    	else return false;
    }
    
    void choose_seats(int idx)
    {
    	//printf("\n>> choose_seats(%d)\n", idx);
    
    	int num = students[idx].num;
    	//printf(">> student num = %d\n", num);
    	int cnt_empty = 0;
    	int cnt_friends = 0;
    
    	for (int x = 1; x <= N; x++)
    	{
    		for (int y = 1; y <= N; y++)
    		{
    			cnt_empty = 0;
    			cnt_friends = 0;
    
    			if (seats[x][y] != 0) continue; // seat already taken
    
    			for (int k = 0; k < 4; k++)
    			{
    				int nx = x + dx[k];
    				int ny = y + dy[k];
    
    				if (nx <= 0 || nx > N || ny <= 0 || ny > N) continue; // boundary
    
    				if (seats[nx][ny] == 0) cnt_empty++;
    
    				for (int n = 0; n < 4; n++)
    				{
    					if (seats[nx][ny] == students[idx].friends[n]) cnt_friends++;
    				}
    			}
    
    			struct cand data = { x,y,cnt_empty,cnt_friends };
    			candidates.push_back(data);
    		}
    
    	}
    	/*
    	for (int i = 0; i < candidates.size(); i++)
    	{
    		printf("[i = %d] (%d, %d) empty = %d, friends = %d\n", i, candidates[i].x, candidates[i].y, candidates[i].cnt_empty, candidates[i].cnt_friends);
    	}
    	*/
    	// candidates 정렬
    
    	sort(candidates.begin(), candidates.end(), cmp);
    	//printf("------------------- sort -----------------------\n");
    	/*
    	for (int i = 0; i < candidates.size(); i++)
    	{
    		printf("[i = %d] (%d, %d) empty = %d, friends = %d\n", i, candidates[i].x, candidates[i].y, candidates[i].cnt_empty, candidates[i].cnt_friends);
    	}
    	*/
    
    	int pos_x = candidates.front().x;
    	int pos_y = candidates.front().y;
    	seats[pos_x][pos_y] = num;
    	//printf("seats[%d][%d] = %d\n", pos_x, pos_y, num);
    
    	while (!candidates.empty())
    	{
    		candidates.pop_back();
    	}
    }
    
    int calculate_score(void)
    {
    	int sum = 0;
    	int cnt_near_friends[5] = { 0, };
    
    	for (int i = 1; i <= N * N; i++)
    	{
    		int num = students[i].num;
    		int cnt = 0;
    
    		for (int x = 1; x <= N; x++)
    		{
    			for (int y = 1; y <= N; y++)
    			{
    				if (seats[x][y] == num)
    				{
    					for (int k = 0; k < 4; k++)
    					{
    						int nx = x + dx[k];
    						int ny = y + dy[k];
    
    						if (nx <= 0 || nx > N || ny <= 0 || ny > N) continue; // boundary
    
    						for (int n = 0; n < 4; n++)
    						{
    							if (seats[nx][ny] == students[i].friends[n]) cnt++;
    						}
    					}
    				}
    			}
    		}
    		cnt_near_friends[cnt]++;
    	}
    
    
    	sum = cnt_near_friends[0] * 0 + cnt_near_friends[1] * 1 + cnt_near_friends[2] * 10 + cnt_near_friends[3] * 100 + cnt_near_friends[4] * 1000;
    	return sum;
    }
    
    int main(void)
    {
    	int answer = 0;
    
    	scanf("%d", &N);
    	for (int i = 1; i <= N * N; i++)
    	{
    		scanf("%d", &students[i].num);
    		for (int j = 0; j < 4; j++)
    		{
    			scanf("%d", &students[i].friends[j]);
    		}
    	}
    
    	for (int i = 1; i <= N * N; i++)
    	{
    		choose_seats(i);
    	}
    
    	/*
    	for (int i = 1; i <= N; i++)
    	{
    		for (int j = 1; j <= N; j++)
    		{
    			printf(" %d", seats[i][j]);
    		}
    		printf("\n");
    	}
    	*/
    	answer = calculate_score();
    
    	printf("%d\n", answer);
    	return 0;
    }

     

    맘에 드는 코드는 아니지만 올리고싶어서 올려본다ㅎ

    '공부 > PS (백준)' 카테고리의 다른 글

    [BOJ] 23288 주사위 굴리기 2  (0) 2022.04.24
    [BOJ] 16235 나무 재테크  (0) 2022.04.19
    [BOJ] 16236 아기 상어 / C++  (0) 2022.04.16
    골드 2 됐다 😎  (0) 2022.04.16
    [BOJ] 17086 아기 상어 2 / C++  (0) 2022.03.29
Designed by Tistory.