문제 링크입니다: https://school.programmers.co.kr/learn/courses/30/lessons/87391
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
주어진 쿼리의 역순으로 계산하면 AC를 받을 수 있는 문제였습니다.
알고리즘은 아래와 같습니다.
1. 열과 행의 범위를 나타내는 pair<long long, long long> 변수를 선언하고 주어진 쿼리의 역순으로 진행합니다.
1.1 역순이므로 문제에서 주어진 방향은 반대가 되어야 합니다.
ex) query(0, dx) -> 열 번호가 증가하는 방향으로 이동하는 쿼리로 치환
1.2 또한, 정방향으로 쿼리를 진행했을 때 테두리에 위치한 모서리는 움직일 수 없도록 처리합니다.
2. 1번을 진행하는 도중 열 또는 행의 범위가 벗어날 경우 어떠한 공도 해당 위치에 도달할 수 없다는 뜻이므로 0을 반환합니다.
3. 2번의 케이스가 등장하지 않을 경우 열의 범위와 행의 범위 내 위치한 공들이 (x, y)에 도달할 수 있다는 뜻이므로 (열의 범위) * (행의 범위)가 답이고 이를 반
환해줍니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <string> | |
#include <vector> | |
#include <algorithm> | |
using namespace std; | |
bool isOutOfBounds(pair<long long, long long> row, pair<long long, long long> col, int n, int m) | |
{ | |
return row.first >= n || row.second < 0 || col.first >= m || col.second < 0; | |
} | |
long long solution(int n, int m, int x, int y, vector<vector<int>> queries) { | |
pair<long long, long long> row, col; | |
row.first = x, row.second = x; | |
col.first = y, col.second = y; | |
for (int i = queries.size() - 1; i >= 0; i--) | |
{ | |
int dx = queries[i][1]; | |
switch (queries[i][0]) | |
{ | |
case 0: | |
if (col.first != 0) | |
{ | |
col.first += dx; | |
} | |
col.second = min(col.second + dx, (m - 1) * 1LL); | |
break; | |
case 1: | |
col.first = max(col.first - dx, (long long) 0); | |
if (col.second != m - 1) | |
{ | |
col.second -= dx; | |
} | |
break; | |
case 2: | |
if (row.first != 0) | |
{ | |
row.first += dx; | |
} | |
row.second = min(row.second + dx, (n - 1) * 1LL); | |
break; | |
case 3: | |
row.first = max(row.first - dx, (long long) 0); | |
if (row.second != n - 1) | |
{ | |
row.second -= dx; | |
} | |
break; | |
} | |
if (isOutOfBounds(row, col, n, m)) | |
{ | |
return 0; | |
} | |
} | |
return (row.second - row.first + 1) * (col.second - col.first + 1); | |
} |

개발환경: Programmers IDE
지적, 조언, 질문 환영합니다! 질문 남겨주세요~
반응형
'알고리즘 > programmers' 카테고리의 다른 글
[Programmers] 매칭 점수 (0) | 2022.08.15 |
---|---|
[Programmers] 외벽 점검 (0) | 2022.08.09 |
[Programmers] 카드 짝 맞추기 (0) | 2022.08.05 |
[Programmers] 캠핑 (0) | 2022.08.02 |
[Programmers] 호텔 방 배정 (0) | 2022.07.29 |