[Programmers] 코딩테스트 연습- 바탕화면 정리
본문 바로가기
카테고리 없음

[Programmers] 코딩테스트 연습- 바탕화면 정리

by Midfall 2026. 7. 14.
320x100

프로그래머스 코딩테스트 연습 : 바탕화면 정리를 c++ 기준 풀이

 

https://school.programmers.co.kr/learn/courses/30/lessons/161990

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제설명

문제는 바탕화면의 모~든 파일을 선택할 수 있는 가장 작은 직사각형을 그리는 것이 과제입니다.

'가장 작은'의 기준은 L1 Distance 방법을 사용해서 끝점 좌표- 시작점 좌표로 정의됩니다.

 

직사각형 Distance 설명

여기서 특이점은,  격자라고 생각하면 보통 0,1과 2,3을 좌표로 생각하기가 쉽습니다.

하지만 이 Grid는 셀을 세는 것이 아니라 셀의 '꼭지점'을 기준으로 좌표를 정하기 때문에.
직사각형이 그려지는 마지막 꼭지점은 기존 셀 x y 좌표에 x+1,y+1을 더해야 합니다.

 

문제 요구사항

 

 

vector<int> answer;
void convertToArray(vector<string> wallpaper)
{
    int height=wallpaper.size();
    int width=wallpaper[0].size();

    vector<pair<int,int>> map;
    int y=0;
    for(string s:wallpaper)
    {
        int x=0;
        for(char c: s)
        {
            if(c=='#')
            {
                map.push_back({y,x});

            }

            x++;
        }
        y++;
    }

 

저는 map의 좌표를 저장하기 위해 pair를 사용해서 해당 파일의 위치를 y,x {row,col} 순서쌍으로 저장했습니다.

 

 if(map.size()==1)
    {
        map.push_back({map[0].first,map[0].second});

    }

 

그런데 이렇게 할 경우, 파일이 1개 있는 경우 직사각형이 그려지지 않는 문제가 생겼습니다.

테스트 4번. 파일이 1개인 경우 예외가 생긴다.

그래서 저는 별도로 테스트 4번을 핸들링하는 로직을 추가해야 했는데, 이게 제가 짠 코드의 한계였습니다.

 

 int minX=width;
    int minY=height;
    int maxX=0;
    int maxY=0;
    for(int i=0;i<map.size(); i++)
    {
        cout<< map[i].first<<","<<map[i].second<<" ";

        minX=map[i].second<minX ? map[i].second:minX;
        minY=map[i].first<minY ? map[i].first:minY;

        maxX=map[i].second > maxX? map[i].second:maxX;
        maxY=map[i].first > maxY? map[i].first:maxY;

    }

    answer.push_back(minY);
    answer.push_back(minX);
    answer.push_back(maxY+1);
    answer.push_back(maxX+1);

 

이후에는 minX,minY, maxX,maxY 네 점을 계산해서 넣어줬습니다.

min에는 비교를 위해 최댓값 X,Y를 넣어주었고,
max에는 반대로 가장 작은 0,0을 넣어주어 비교시 자동으로 map 안에 있는 값으로 초기화 되도록 만들었습니다.

 

 

프로그래머스 풀이

프로그래머스에는 훨씬 간단한 방식으로 풀어냈습니다.

for(int i=0;i<height; i++)
    {
       
        for(int j=0;j<width; 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);
             }
        }
        
    }

 

알고보니 c++의 min 함수를 이용하면 두 값 중 더 작은 값으로 업데이트 하는 것이 가능하더군요.

그리고 map pair를 별도로 만들지 않아도, min max의 XY는 서로 독립적이라서 따로 최대/최소를 구하는 것이 가능했습니다.

 

answer={999,999,-999,-999} 처럼 초기화 가능한 최대/최소 값으로 넣어주는 것은 동일했습니다.

 

프로그래머스 코드가 확실히 유지보수성이 뛰어나고 심플한 풀이가 많은 거 같습니다.

 

하다보면 늘겠죠! 같이 매일매일 즐겁게 풀어봅시다.

감사합니다.

300x250

댓글