코테/프로그래머스

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

내꺼블로그 2024. 5. 7. 09:43

문제

https://school.programmers.co.kr/learn/courses/30/lessons/161990?language=cpp

 

프로그래머스

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

programmers.co.kr

 


 

코드

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<string> wallpaper) {
    vector<int> answer;
    int min_x = 50, min_y=50, max_x=0, max_y=0;
    for(int i=0;i<wallpaper.size();i++){
        for(int j=0;j<wallpaper[i].size();j++){
            int temp_x=i;
            int temp_y=j;
            if(wallpaper[i][j]=='#'){
                min_x=min(min_x, temp_x);
                min_y = min(min_y, temp_y);
                max_x = max(max_x, temp_x);
                max_y = max(max_y, temp_y);
            }
        }
    }
    answer.push_back(min_x);
    answer.push_back(min_y);
    answer.push_back(max_x+1);
    answer.push_back(max_y+1);
    return answer;
}

 


 

풀이

내 주제를 깨닫고 쉬운 문제를 풀었다.

그림으로 보아도 알 수 있다시피 모든 파일을 전부 선택하기 위해서는 파일 위치 중 가장 작은 x값과 y값 한 쌍부터 가장 큰 x값과 y값 한 쌍까지를 드래그해야만 한다.

 

위 그림을 기준으로 가장 작은 x값은 배열 (1, 5)에 위치한 파일에 따라 1이 되며, 가장 작은 y값은 배열 (3, 3)에 위치한 파일에 따라 3이 된다.

고로 드래그의 시작점은 (1, 3)이 된다.

 

가장 큰 값은 조심해야 되는 부분이 배열의 인덱스는 파일 위치의 왼쪽 상단을 뜻하므로 배열의 인덱스를 그대로 가지고 올 경우 파일이 짤리게 되기에 각각의 값에 +1을 연산해주어야 한다.

위 그림의 경우 배열의 (4, 4) 인덱스에 파일이 위치하는데, 이 파일을 선택하기 위해서는 그보다 더 밑인 5까지 드래그해주어야 한다.

또한 가장 끝에 있는 파일의 배열 인덱스는 (2, 7)로 실제 파일을 다 선택하기 위해서는 그보다 더 오른쪽인 8까지 드래그해주어야 한다.

그러므로 드래그의 끝 지점은 (5, 8)이 된다.

 

이처럼 파일이 존재하는 위치 중 가장 작은 배열 인덱스 x와 y, 가장 큰 배열 인덱스 x와 y를 각각 +1한 값을 return하면 끝!

 

 

 

 

다른 분들 풀이도 대부분 비슷하니 다른사람 풀이는 생략