# [til] 알고리즘 프로그래머스 (바탕화면정리)

### 🧑‍💻 오늘의 문제: 바탕화면 정리

* **출처**: 프로그래머스 Lv.1
    

### [📌](https://school.programmers.co.kr/learn/courses/30/lessons/161990) 문제 요약

바탕화면에서 파일(#)이 있는 최소 직사각형 영역을 찾는 문제이다.  
배열에서 가장 왼쪽 위 파일의 좌표와, 가장 오른쪽 아래 파일의 좌표를 찾아내야 한다.

### 🖥️ 내가 작성한 코드

```python
def solution(wallpaper):
    answer = []
    lux = 99
    luy = 99
    rdx = 0
    rdy = 0
    for line_idx in range(len(wallpaper)):
        line_arr = list(wallpaper[line_idx])
        for paper_idx in range(len(line_arr)):
            if (line_arr[paper_idx] == "#" and lux == 99):
                lux = line_idx
            if (line_arr[paper_idx] == "#" and luy > paper_idx):
                luy = paper_idx
            if (line_arr[paper_idx] == "#"):
                rdx = line_idx + 1
            if (line_arr[paper_idx] == "#" and rdy < paper_idx):
                rdy = paper_idx
    answer = [lux, luy, rdx, rdy+1]
    return answer
```

### 🔎 내 코드의 특징 및 복기

* 초기 좌표값을 큰 수와 작은 수로 설정해 놓고, 파일(#)의 위치를 찾아가며 최소 및 최대 좌표를 갱신하는 방식이다.
    
* 좌표를 따로따로 계산하는 방식으로 정확히 의도한 대로 동작하지만, 조금 더 효율적으로 작성할 수 있을 것 같았다.
    

---

### 📌 추가적으로 찾아본 좋은 풀이 방법

다른 사람의 풀이를 살펴보다가 배열을 활용해 간단하게 해결한 코드를 발견했다.

### 🖥️ 참고한 코드

```python
def solution(wall):
    a, b = [], []
    for i in range(len(wall)):
        for j in range(len(wall[i])):
            if wall[i][j] == "#":
                a.append(i)
                b.append(j)
    return [min(a), min(b), max(a) + 1, max(b) + 1]
```

### 💡 이 풀이에서 배운 점

* 간결하게 문제를 푸는 좋은 방법이다.
    
* 좌표값을 배열로 저장한 후에 한 번에 min()[,](https://school.programmers.co.kr/learn/courses/30/lessons/161990) max()를 이용하여 계산하면 가독성이 크게 증가한다.
    
* 코드가 직관적이며, 유지 보수하기도 훨씬 좋다는 생각이 들었다.
    
* 내 풀이에서는 각 변수를 독립적으로 관리했지만, 이 풀이는 배열을 이용해 깔끔하게 처리했다.
    

---

### [✨](https://school.programmers.co.kr/learn/courses/30/lessons/161990) 느낀점 & 앞으로의 개선방향

* 변수의 초기값을 임의로 크게 잡는 것보단, 빈 배열과 min, max 함수를 적극적으로 활용하면 코드가 간결해진다는 점을 배웠다.
    
* 앞으로 비슷한 문제를 접할 때는 최대한 가독성 좋은 코드, 유지보수성이 뛰어난 코드 작성을 위해서 이런 방법을 떠올리도록 노력해야겠다.
