본문 바로가기
프로그래머스

아이템 줍기 C++

by paysmile 2022. 2. 7.

https://programmers.co.kr/learn/courses/30/lessons/87694

 

코딩테스트 연습 - 아이템 줍기

[[1,1,7,4],[3,2,5,5],[4,3,6,9],[2,6,8,8]] 1 3 7 8 17 [[1,1,8,4],[2,2,4,9],[3,6,9,8],[6,3,7,7]] 9 7 6 1 11 [[2,2,5,5],[1,3,6,4],[3,1,4,6]] 1 4 6 3 10

programmers.co.kr

#include <string>
#include <vector>
#include <cstring>
#include <queue>
#include <iostream>

using namespace std;
const int MAX = 105;
struct MOVE { int x, y; };
MOVE mv[4] = { {0,1}, {0,-1}, {1,0}, {-1,0} }; //상, 하, 좌, 우
int map[MAX][MAX][4];
int visited[MAX][MAX];
struct INFO { int x, y, count; };

int solution(vector<vector<int>> rectangle, int characterX, int characterY, int itemX, int itemY) {
	int answer;

	memset(visited, -1, sizeof(visited));
	memset(map, -1, sizeof(map));

	for (int i = 0; i < rectangle.size(); i++) {
		int si = rectangle[i][0]*2; // 2
		int sj = rectangle[i][1]*2; //2
		int ei = rectangle[i][2]*2; //10
		int ej = rectangle[i][3]*2; //14

		for (int ii = si; ii <= ei; ii++) {
			map[ii][sj][2] = 1;
			map[ii][sj][3] = 1;
			map[ii][ej][2] = 1;
			map[ii][ej][3] = 1;
		}

		for (int jj = sj; jj <= ej; jj++) {
			map[si][jj][0] = 1;
			map[si][jj][1] = 1;
			map[ei][jj][0] = 1;
			map[ei][jj][1] = 1;
		}
	}

	for (int i = 0; i < rectangle.size(); i++) {
		int si = rectangle[i][0] * 2; // 2
		int sj = rectangle[i][1] * 2; //2
		int ei = rectangle[i][2] * 2; //10
		int ej = rectangle[i][3] * 2; //14

		for (int jj = sj + 1; jj < ej; jj++) {
			for (int ii = si + 1; ii < ei; ii++) {
				for (int k = 0; k < 4; k++) {
					map[ii][jj][k] = -1;
				}
			}
		}
	}

	queue<INFO> q;
	q.push({ characterX * 2,characterY * 2,0});

	visited[characterX * 2][characterY * 2] = 1;

	while (!q.empty()) {
		int mi = q.front().x;
		int mj = q.front().y;
		int count = q.front().count;
		q.pop();

		if (mi == itemX * 2 && mj == itemY * 2) {
			answer = count / 2;
			break;
		}

		for (int k = 0; k < 4; k++) {
			int movei = mi + mv[k].x;
			int movej = mj + mv[k].y;

			if (!(movei >= 0 && movei <= 100 && movej >= 0 && movej <= 100)) continue;
			if (map[movei][movej][k] == 1 && visited[movei][movej] == -1) {
				visited[movei][movej] = 1;
				q.push({ movei,movej,count + 1 });
			}
		}

	}

	return answer;
}

'프로그래머스' 카테고리의 다른 글

스타 수열 C++  (0) 2022.02.11
모두 0으로 만들기 C++  (0) 2022.02.08
2 X n 타일링 C++  (0) 2022.01.30
단어 변환 C++  (0) 2022.01.29
경주로 건설 C++  (0) 2022.01.29