프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📄 문제

개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.

코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼
아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.

  • 대기실은 5개이며, 각 대기실은 5x5 크기입니다.
  • 거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.
  • 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.

5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.

 

📝 풀이

#include <string>
#include <vector>

using namespace std;

int sDx[4]{ -1, 1, 0, 0 };
int sDy[4]{ 0, 0, -1, 1 };

int nsDx[4]{ -1, 1, 1, -1 };
int nsDy[4]{ -1, -1, 1, 1 };

int nsDsx[4][2]{ {-1, 0}, {0, 1}, {1, 0}, {0, -1} };
int nsDsy[4][2]{ {0, -1}, {-1, 0}, {0, 1}, {1, 0} };

bool success(vector<string> s)
{
	for (int y = 0; y < 5; ++y)
		for (int x = 0; x < 5; ++x)
		{
			// 해당 위치에 사람이 있지 않으면 검사하지 않음
			if (s[y][x] != 'P')
				continue;

			for (int i = 0; i < 4; ++i)
			{
				int yy = y + sDy[i];
				int xx = x + sDx[i];

				if (yy == -1 || yy == 5 || xx == -1 || xx == 5)
					continue;

				// 상하좌우 방향에 사람이 있다면 거리두기 규칙 X
				if (s[yy][xx] == 'P')
					return false;

				// 상하좌우 방향에 빈 테이블일경우
				if (s[yy][xx] == 'O')
				{
					// 그 다음 칸에 사람이 있는지 검사
					int yyy = yy + sDy[i];
					int xxx = xx + sDx[i];

					if (yyy == -1 || yyy == 5 || xxx == -1 || xxx == 5)
						continue;

					if (s[yyy][xxx] == 'P')
						return false;
				}
			}
			for (int i = 0; i < 4; ++i)
			{
				int yy = y + nsDy[i];
				int xx = x + nsDx[i];

				if (yy == -1 || yy == 5 || xx == -1 || xx == 5)
					continue;

				// 대각선 위치에 사람이 있다면?
				if (s[yy][xx] == 'P') // 대각선 위치를 가리는 두 방향에 하나라도 파티션이 없다면 거리두기 규칙 X
					if (s[y + nsDsy[i][0]][x + nsDsx[i][0]] != 'X' || s[y + nsDsy[i][1]][x + nsDsx[i][1]] != 'X')
						return false;
			}
		}

	return true;
}

vector<int> solution(vector<vector<string>> places) {
	vector<int> answer;
	for (vector<string> v : places)
		answer.push_back(success(v) ? 1 : 0);

	printf("%d", answer[0]);
	return answer;
}
  • 직관적인 풀이 방식으로, 모든 방향에 대하여 검사를 진행합니다.
bonnate