알고리즘/프로그래머스 1단계

프로그래머스 - 바탕화면정리 - C++

게임만드는학생 2024. 9. 19. 13:07

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);
            }
        }
    }

이중포문을 한번만 돌며 각 좌표에 대해서 업데이트를 하는 것이다.