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

LSapee·2023년 4월 16일

c++ Algorithm

목록 보기
4/7

x축을 상하 y축을 좌우로 생각하고 했습니다!

요구사항 : 바탕화면을 1번에 정리하기 위해서 필요한 시작 x,y좌표와 마지막 x,y좌표를 구하기

풀이 : 드래그는 직사각형모양으로 만들어야 하므로 최상단 좌측 과 최하단 우측의 좌표를 구해야 한다!

최상단 좌측의 x는 모든 파일이 있는 x좌표중에서 제일 작은 값이 된다.

최상단 좌측의 y는 모든 파일이 있는 y좌표중에서 제일 작은 값이 된다.

최하단 우측의 x는 모든 파일이 있는 x좌표중에서 가장 큰 값+1이 된다.

최하단 우측의 y는 모든 파일이 있는 y좌표중에서 가장 큰 값+1이 된다.

이유는 아래 이미지를 보면 다음과 같아진다.

지워야하는 파일이 O일때 1,1에서 2,2까지 드래그 해야 해당 파일이 지워진다.

하지만 해당 화면을 인자값으로 받을땐 다음과 같이 받는다.
[".....",".#...",".....",".....","....."]

해당 좌표를 찍으면 1,1가 나온다. 이것을 x,y로 두면 x,y에서 x+1,y+1까지 드래그 해야한다는 것을 알 수 있다.

아래와 같은 그림에서도 똑같이 적용된다.
필자는 초록점을 2개를 구해서 드래그 하는 방식을 사용했지만 자주색 점 2개를 구해서 풀어도 성립할 것이다.
초록점 1의 좌표는 가장작은 x,y 와 가장큰 x+1,y+1이다.
자주색은 가장 작은 x, 가장큰 y+1 와 가장큰 x+1 가장 작은 y이다.

처음 짠 코드

#include <bits/stdc++.h>
using namespace std;

vector<int> solution(vector<string> wallpaper) {
        vector<int> answer;
    vector<int> x;
    vector<int> y;
    
    for(int i=0; i<wallpaper.size(); i++){
        for(int j=0; j< wallpaper[i].size(); j++){
            if(wallpaper[i][j]=='#'){
                x.push_back(i);
                y.push_back(j);
            }
        }
    }
    sort(x.begin(),x.end());
    sort(y.begin(),y.end());
    answer.push_back(x[0]);
    answer.push_back(y[0]);
    answer.push_back(x[x.size()-1]+1);
    answer.push_back(y[y.size()-1]+1);
    return answer;
}

#이 나올 때 마다 오는 숫자를 다 기억해서 마지막에 정렬해서 최소,최대값+1를 넣었습니다.

다시 작성한 코드

#include <bits/stdc++.h>
using namespace std;

vector<int> solution(vector<string> wallpaper) {
    vector<int> answer ={55,55,-55,-55};
    
    for(int i=0; i<wallpaper.size(); i++){
        for(int j=0; j< wallpaper[i].size(); j++){
            if(wallpaper[i][j]=='#'){
                answer[0] = min(answer[0],i);
                answer[1] = min(answer[1],j);
                answer[2] = max(answer[2],i+1);
                answer[3] = max(answer[3],j+1);
            }
        }
    }
    return answer;
}

처음부터 min함수롸 max함수를 이용해서 비교해가면서 값을 구해서 넣었다!

두가지 코드 전부 통과한 코드입니다.

처음에는 그냥 생각나는대로 작성하였고 후자는 바로바로 비교하는게 더 빠르게 돌아갈것 같다는 생각에 추가 작성하였습니다.
후자의 경우가 시간도 빨리 패스되며 메모리역시 처음 작성한 코드에 비해 적게 사용되는 것을 확인 하였습니다.

0개의 댓글