프로그래머스/Lv.1

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

MINU.SHINNNN 2023. 10. 22. 14:08

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

풀이

바탕화면 정보 wallpaper가 주어집니다. 빈 칸은 '.' 파일이 있다면 '#"으로 표기될 때, 모든 파일을 선택할 수 있는 맨하탄 거리가 최소가 되도록 드래그 시작점과 끝점을 결정하는 문제입니다.

 

아이디어는 파일이 존재하는 가장 최소 행과 열, 최대 행과 열을 찾고 최대 행, 열 +1을 해주는 것입니다.

wallpaper의 행, 열 크기가 50 이하이므로 2중 for문 완전탐색으로 문제를 해결할 수 있습니다.

 

완전탐색 전에, 최소 행, 열 변수 min_row, min_col은 MAX 매크로 상수로 정의하고, 최대 행, 열 변수 max_col, max_row는 0으로 초기화 해둡니다. 이 후, 완전탐색을 하며 '#'을 찾을때마다 min, max 함수를 사용해 인덱스를 업데이트 해주면 알고리즘이 완성됩니다.

 

탐색이 끝난 후에는 max_row, max_col 에 +1을 해주고 답을 리턴해줍니다.

 

리뷰

find 및 rfind 함수를 사용해 구현해보려 했다가 더 앞 또는 뒤의 값을 찾지 못하는 상황이 있어 완전탐색으로 코드를 구현했습니다. 

#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
#include <iostream>

#define MAX 123456789
using namespace std;
// 빈칸 ".", 파일 "#"
vector<int> solution(vector<string> wallpaper) {
    vector<int> answer;
    // wallpaper에서 행, 열 최소 최대 찾기
    // 끝점은 행,열 +1
    
    int min_row = MAX, min_col = MAX, max_row =0, max_col=0;
    // 완전탐색
    for (int i=0; i<wallpaper.size(); i++) {
        int row, col;
        for (int j=0; j<wallpaper[i].size(); j++) {
            if (wallpaper[i][j] == '#') {
                row = i;
                col = j;
                min_row = min(min_row, row);
                min_col = min(min_col, col);
                max_row = max(max_row, row);
                max_col = max(max_col, col);
            }
        }
        
    }
    
    max_row++;
    max_col++;
    answer.push_back(min_row);
    answer.push_back(min_col);
    answer.push_back(max_row);
    answer.push_back(max_col);
    return answer;
}