[알고리즘] Swift -프로그래머스 연습문제 #161990(바탕화면 정리)

2023. 4. 5. 01:11ALGORITHM/Swift

728x90
반응형

문제링크

 

 

 

 

분석

바탕화면의 상태를 나타낸 문자열 배열 wallpaper

빈칸은 .(점), 파일이 있는 칸은 #의 값을 가진다.

드래그하면 파일을 선택할 수 있고, 선택된 파일들을 삭제할 수 있다.

 

최소한의 이동거리를 갖는 한 번의 드래그로 모든 파일을 선택해서 한 번에 지우려고 할 때 드래그로 파일들을 선택하는 방법

  • 드래그는 바탕화면의 격자점 S에서 E로 이동한다.
  • 점 S에서 E로 드래그할 때, 드래그 한 거리는 |E의 x값 - S의 x값| +|E의 y값- S의 y값| 로 정의한다.
  • S에서 E로 드래그하면 바탕화면 두 격자점을 각각 왼쪽 위, 오른쪽 아래로 하는 직사각형 내부에 있는 모든 파일이 선택된다.

파일이 있는 곳을 드래그해서 삭제하려고 할 때 최소한의 이동거리를 갖는 드래그의 시작점과 끝점을 리턴하는 문제

 

풀이 과정

파일의 위치를 찾아서 드래그를 하는 데 드래그 한 거리의 값을 계산하여 최소값을 찾아야한다.

일단 드래그를 하는 규칙을 생각해보면 가장 왼쪽에 있는 파일과 가장 위쪽, 가장 오른쪽, 가장 아래쪽에 있는 파일의 위치만 알면 된다.

var paperArr = [[Int]]()

for i in 0..<wallpaper.count {
    let paper = Array(wallpaper[i]).map {String($0)}
    if paper.contains("#") {
        for j in 0..<paper.count {
            if paper[j] == "#" {
                paperArr.append([i, j])
            }
        }
    }
}

일단 처음으로 입력받은 배열에서 파일이 있는 위치의 인덱스를 찾는다.

 

var lux = Int.max
var luy = Int.max
var rdx = Int.min
var rdy = Int.min
for i in 0..<paperArr.count {
    lux = min(lux, paperArr[i][0])
    luy = min(luy, paperArr[i][1])
    rdx = max(rdx, paperArr[i][0])
    rdy = max(rdy, paperArr[i][1])
}

return [lux, luy, rdx+1, rdy+1]

최대값과 최소값을 구해준다.

그리고 순서에 맞게 리턴해준다. +1을 해준 이유는 배열의 인덱스보다 파일의 끝지점이 크기 때문이다.

 

 

풀이

import Foundation

func solution(_ wallpaper:[String]) -> [Int] {
    var paperArr = [[Int]]()
    
    for i in 0..<wallpaper.count {
        let paper = Array(wallpaper[i]).map {String($0)}
        if paper.contains("#") {
            for j in 0..<paper.count {
                if paper[j] == "#" {
                    paperArr.append([i, j])
                }
            }
        }
    }

    var lux = Int.max
    var luy = Int.max
    var rdx = Int.min
    var rdy = Int.min
    for i in 0..<paperArr.count {
        lux = min(lux, paperArr[i][0])
        luy = min(luy, paperArr[i][1])
        rdx = max(rdx, paperArr[i][0])
        rdy = max(rdy, paperArr[i][1])
    }
    
    return [lux, luy, rdx+1, rdy+1]
}

 

결과

print(solution( ["..........", ".....#....", "......##..", "...##.....", "....#....."] ))

 

 


📂  정리

결과는 +4점 밖에 얻지 못했다..

다른 사람들의 풀이를 보고 아차 싶었다 ㅎㅎ

굳이 배열을 만들지 않아도 처음부터 인덱스를 찾을 수 있기 떄문이다.. 나바본가..

import Foundation

func solution(_ wallpaper:[String]) -> [Int] {
    
    var lux = Int.max
    var luy = Int.max
    var rdx = Int.min
    var rdy = Int.min
    
    for i in 0..<wallpaper.count {
        let paper = Array(wallpaper[i]).map {String($0)}
        if paper.contains("#") {
            for j in 0..<paper.count {
                if paper[j] == "#" {
                    lux = min(lux, i)
                    luy = min(luy, j)
                    rdx = max(rdx, i)
                    rdy = max(rdy, j)
                }
            }
        }
    }
    return [lux, luy, rdx+1, rdy+1]
}

코드만 짧아졌을 뿐 시간이랑 메모리같은 건 그대로이다 .

 

 

 

 

 

728x90
반응형