[programmers/py] 바탕화면 정리

승민·2023년 4월 14일

알고리즘

목록 보기
14/171

바탕화면 정리

https://school.programmers.co.kr/learn/courses/30/lessons/161990?language=python3

문제설명

  • 바탕화면의 가장 왼쪽 위를 (0, 0)으로 시작해 (세로 좌표, 가로 좌표)로 표현합니다. 빈칸은 ".", 파일이 있는 칸은 "#"의 값을 가집니다.
  • 드래그를 하면 파일들을 선택할 수 있고, 선택된 파일들을 삭제할 수 있습니다.
  • 머쓱이는 최소한의 이동거리를 갖는 한 번의 드래그로 모든 파일을 선택해서 한 번에 지우려고 하며 드래그로 파일들을 선택하는 방법은 다음과 같습니다.
  • 드래그는 바탕화면의 격자점 S(lux, luy)를 마우스 왼쪽 버튼으로 클릭한 상태로 격자점 E(rdx, rdy)로 이동한 뒤 마우스 왼쪽 버튼을 떼는 행동입니다.
  • 이때, "점 S에서 점 E로 드래그한다"고 표현하고 점 S와 점 E를 각각 드래그의 시작점, 끝점이라고 표현합니다.
  • 점 S(lux, luy)에서 점 E(rdx, rdy)로 드래그를 할 때, "드래그 한 거리"는 |rdx - lux| + |rdy - luy|로 정의합니다.
  • 점 S에서 점 E로 드래그를 하면 바탕화면에서 두 격자점을 각각 왼쪽 위, 오른쪽 아래로 하는 직사각형 내부에 있는 모든 파일이 선택됩니다.

문제 설명

답 설명

  • 머쓱이의 컴퓨터 바탕화면의 상태를 나타내는 문자열 배열 wallpaper가 매개변수로 주어질 때 바탕화면의 파일들을 한 번에 삭제하기 위해 최소한의 이동거리를 갖는 드래그의 시작점과 끝점을 담은 정수 배열을 return하는 solution 함수를 작성해 주세요.
  • 드래그의 시작점이 (lux, luy), 끝점이 (rdx, rdy)라면 정수 배열 [lux, luy, rdx, rdy]를 return하면 됩니다.

제한사항

  • 1 ≤ wallpaper의 길이 ≤ 50
  • 1 ≤ wallpaper[i]의 길이 ≤ 50
  • wallpaper의 모든 원소의 길이는 동일합니다.
  • wallpaper[i][j]"#" 또는 "."의 값만 가집니다.
  • 바탕화면에는 적어도 하나의 파일이 있습니다.
  • 드래그 시작점 (lux, luy)와 끝점 (rdx, rdy)lux < rdx, luy < rdy를 만족해야 합니다.

풀이

  1. #이 들어간 줄을 구하고
  2. 줄에서 #의 위치를 구해서 최소 최대값을 반환
    좌표가 #을 제거하기위해서는 적어도 0,1,0,1 같이 #의 왼쪽위 좌표와 오른쪽 아래(+1) 값이 필요, 그래서 각 값에 +1을 해줌
    이때, 각 줄에서 #은 처음에 나올 경우와 마지막에 나오는 것 만 배열에 추가하고, 마지막 #의 인덱스에 +1을 통해 칸을 선택함
  3. 정렬해서 값을 출력
def solution(wallpaper):
    
    rows = [] # #이 있는 줄
    cols = [] # #이 있을 때 #의 열
    
    for i,w in enumerate(wallpaper):
        if w.find("#") != -1:
            rows.append(i)
            rows.append(i+1)
            cols.append(w.find('#'))
            cols.append(w.rfind("#")+1)
    
    rows.sort()
    cols.sort()
    
    return [rows[0], cols[0], rows[len(rows)-1], cols[len(cols)-1]]
  1. 이 문제의wallpaper의 길이를 생각했을 때 이중 반복문과 min,max를 통해 구할 수 있다.
def solution(wall):
    
    rows = [] # #이 있는 줄
    cols = [] # #이 있을 때 #의 열
    
    for i in range(len(wall)):
        for j in range(len(wall)):
        	if wall[i][j] == "#":
            	rows.append(i)
                cols.append(j)
    
    return [min(rows), min(cols), max(rows)+1, max(cols)+1]

0개의 댓글