https://school.programmers.co.kr/learn/courses/30/lessons/161990
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<string> wallpaper) {
vector<int> answer;
vector<int>a;
vector<int>b;
for(int i=0;i<wallpaper.size();i++)
{
for(int j=0;j<wallpaper[0].length();j++)
{
if(wallpaper[i][j]=='#')
{
a.push_back(j);
b.push_back(i);
}
}
}
sort(a.begin(),a.end());
sort(b.begin(),b.end());
answer.push_back(b[0]);answer.push_back(a[0]);
answer.push_back(b[b.size()-1]+1);answer.push_back(a[a.size()-1]+1);
return answer;
}
주어진 문자열 벡터를 보고 한번의 드래그로 모든 파일을 선택할 때, 가장 작은 드래그 크기를 만드려면 드래그의 시작좌표와 끝 좌표가 어때야하는가가 로 문제를 해석했다.
보드를 가로와 세로로 각각 압축시켜서 한줄로 만든 후, 이 때 가장 앞쪽과 뒤쪽에 있는 좌표를 이용하면 된다.
그 압축시킨 줄을 벡터 a,b로 표현한다.
이중포문을 돌며 a와 b에 각 좌표를 저장하고 정렬을 시킨다.
드래그의 시작점은 가장 왼쪽에 있는 파일과 가장 위쪽에 있는 파일의 교차점이어야 하며,
드래그의 끝점은 가장 오른쪽, 가장 아래쪽에 있는 파일의 교차점이어야하기 때문이다.
하지만 더 간단한 방법이 있다.
int minRow = board.size(), minCol = board[0].size();
int maxRow = -1, maxCol = -1;
for (int i = 0; i < board.size(); ++i) {
for (int j = 0; j < board[i].size(); ++j) {
if (board[i][j] == '#') {
minRow = min(minRow, i);
minCol = min(minCol, j);
maxRow = max(maxRow, i);
maxCol = max(maxCol, j);
}
}
}
이중포문을 한번만 돌며 각 좌표에 대해서 업데이트를 하는 것이다.
'알고리즘 > 프로그래머스 1단계' 카테고리의 다른 글
프로그래머스 - 가장 많이 받은 선물 - C++ (0) | 2024.07.26 |
---|---|
프로그래머스 - 신고결과 받기 - C++ (0) | 2024.07.26 |
프로그래머스 - 달리기 경주 - C++ (0) | 2024.07.26 |
프로그래머스 - 성격 유형 검사하기 - C++ (0) | 2024.07.26 |
프로그래머스 - 키패드 누르기 - C++ (0) | 2024.07.25 |