본문 바로가기
코딩테스트 준비/프로그래머스

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

by 스테디코디스트 2023. 10. 20.
반응형

<문제 소개>


<소스 코드>

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<string> wallpaper) 
{
    vector<int> answer;
    
    // 모든 파일의 왼쪽 위 점의 위치를 나타냄
    vector<vector<int>> Files;
    
    for(int i = 0; i < wallpaper.size(); i++)
    {
        for(int j = 0; j < wallpaper[i].size(); j++)
        {
            if(wallpaper[i][j] == '#')
            {
                // 파일인 경우 -> 해당 좌표를 넣음
                Files.push_back({i,j});
            }            
        }
    }
    
    // 1. 가장 왼쪽에 있는 파일 찾기
    // 2. 가장 오른쪽에 있는 파일 찾기
    // 3. 가장 위쪽에 있는 파일 찾기
    // 4. 가장 아래쪽에 있는 파일 찾기
    
    int Up = 50; // 최소
    int Down = 0; // 최대
    int Left = 50; // 최소
    int Right = 0; // 최대    
    
    for(int i = 0; i < Files.size(); i++)
    {
        int x = Files[i][0]; // 상하
        int y = Files[i][1]; // 좌우
        
        Up = min(Up, x); 
        Down = max(Down, x);       
        Left = min(Left, y); 
        Right = max(Right, y);
    }
    
    answer = {Up, Left, Down+1, Right+1};    
    
    return answer;
}

<풀이과정>

1. 현재 바탕화면의 파일들의 위치를 표시한 wallpaper를 이용해 각 파일마다의 위치를 표시할 Files 벡터를 선언한다. 

2. wallpaper의 원소들을 반복하며 '#'이 나오는 경우가 파일인 경우이므로 해당 좌표를 Files 벡터에 넣어준다.

3. 다음으로 모든 파일들을 드래그해서 선택하기 위해서는 가장 높이있는 파일의 좌표, 가장 낮게있는 파일의 좌표, 가장 왼쪽에 있는 파일의 좌표, 가장 오른쪽에 있는 파일의 좌표 이렇게 4가지 좌표가 필요하다.

4. 따라서 앞서 구한 Files 벡터를 돌면서 각 파일별 좌표를 비교해 상하좌우의 좌표값을 구해야한다.

5. 각각의 좌표값을 Up,Down,Left,Right로 선언하고, Files를 돌면서 해당 파일의 x좌표와 y좌표를 구한다.

6. 이때 파일의 x좌표는 상하를 결정하는데 사용되고, 파일의 y좌표는 좌우를 결정하는데 사용된다.

7. 그리고, Up과 Left는 최소값을 찾아야 하므로 기본값을 좌표의 최대값인 50으로 설정하고 반대로 Down과 Right의 값은 최대값을 찾아야 하므로 기본값을 0으로 설정해준다.

8. 이제 Files를 돌면서 x좌표는 Up,Down과 비교하여 Up보다 작으면 Up에 넣어주고, Down보다 크면 Down에 넣어준다.

9. 마찬가지로 y좌표는 Left,Right와 비교하여 Left보다 작으면 Left에 넣어주고, Right보다 크면 Right에 넣어준다.

10. 위의 반복이 모두 끝나 Up,Left의 최소값, Down,Right의 최대값이 구해졌다면 해당 좌표를 이용해 드래그할 범위인 answer을 구할 수 있다.

11. Files의 좌표는 왼쪽 위의 좌표를 말하는데 드래그 할 때 오른쪽과 아래의 갑은 파일의 오른쪽 아래 지점을 클릭해야 하므로 Right와 Down은 1씩 더한 좌표값이 된다.

12. 따라서 answer에는 Up,Left,Down+1, Right+1을 각각 넣어주면 된다.


<코멘트>

파일 자체가 좌표가 아니라 왼쪽위의 점이 좌표라서 살짝 헷갈리긴 했는데 생각보다 어렵지는 않았던 문제였다.


<제출결과>