문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/161990
소스 코드
def solution(wallpaper):
files_lu,files_rd = [],[]
for row in range(len(wallpaper)):
for col in range(len(wallpaper[row])):
if wallpaper[row][col] == '#':
files_lu.append((row,col))
files_rd.append((row+1,col+1))
min_lux,min_luy,max_rdx,max_rdy = len(wallpaper)+1,len(wallpaper[0])+1,0,0
for lu,rd in zip(files_lu,files_rd):
lux,luy,rdx,rdy = lu[0],lu[1],rd[0],rd[1]
min_lux = min(min_lux,lux)
min_luy = min(min_luy,luy)
max_rdx = max(max_rdx,rdx)
max_rdy = max(max_rdy,rdy)
return[min_lux,min_luy,max_rdx,max_rdy]
해설
- 그래프, 구현
논리 자체는 간단한데 굉장히 멍청하게 구현을 해버린 것 같네요..
정제된 풀이를 보고 결국 같은 걸 return하기 위해 생각을 너무 필터링하지 않고 코드를 짰다는 걸 깨달았습니다 🙉
드래그는 직사각형의 형태로만 가능하기 때문에 우리는 좌상단 최솟값, 우하단 최댓값만 구하면 됩니다.
따라서 for문으로 wallpaper 리스트를 돌면서 x값과 y값을 따로 저장하고,
x의 최소, x의 최대, y의 최소, y의 최대만 min, max 함수로 구해주면 됩니다.
정돈된 코드는 다음과 같습니다.
def solution(wall):
x, y = [], []
for i in range(len(wall)):
for j in range(len(wall[i])):
if wall[i][j] == "#":
x.append(i)
y.append(j)
return [min(x), min(y), max(x) + 1, max(y) + 1]
최댓값에 1을 더하는 이유는 예시의 그림에서 확인할 수 있는 것처럼 파일의 면적을 1로 생각하기 때문입니다.
하나의 파일은 가로 1, 세로 1 사이즈이기 때문에 우리가 실제로 for문을 돌면서 (i, j)로 위치를 기록한다면 우하단 좌표는 (i+1, j+1)이 됩니다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 달리기 경주 (Python) (0) | 2023.05.10 |
---|---|
[프로그래머스] 배달 (Python) (0) | 2023.03.09 |
[프로그래머스] 짝지어 제거하기 (Python) (0) | 2023.02.27 |
[프로그래머스] 대충 만든 자판 (Python) (0) | 2023.02.26 |
[프로그래머스] 둘만의 암호 (Python) (0) | 2023.02.24 |