티스토리 뷰

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


1. 접근 방식

  • lux, luy, rdx, rdy는 각각 가장 위쪽, 가장 왼쪽, 가장 아래쪽, 가장 오른쪽에 있는 좌표이다.

바탕화면 wallpaper 리스트를 행별로 순회하면서 lux, luy, rdx, rdy를 초기화하면 된다. 좀 더 자세히 말하면 다음과 같다.

 

  • lux는 #가 존재하는 첫 번째 행이다.

따라서 처음 lux는 -1로 초기화하고, #가 존재하는 첫 행을 만나면 해당 행으로 lux를 초기화한다. 이때 lux == -1이라는 조건문을 사용하는데, 첫 행으로 초기화되고나면 -1이 아니므로 해당 조건문을 계속 건너뛰어 최초의 lux를 유지할 수 있다.

 

  • luy는 각 행에서 가장 왼쪽에 존재하는 #의 열이다.

따라서 기존에 저장된 luy와 현재 행에서 가장 처음에 존재하는 #의 열을 비교하여 더 작은 값이 luy에 저장되도록 해야 한다.

 

  • rdx는 (#이 존재하는 가장 아래쪽 행 + 1)이다.

위 그림에서 가장 아래쪽에 있는 파일은 2행 3열에 존재하지만, 해당 파일까지 포함하려면 3행 4열까지 드래그해야 한다. 따라서 마지막 행에 +1을 해주어야 하며, 이는 rdy도 마찬가지이다.

 

  • rdy는 각 행에서 가장 오른쪽에 존재하는 #의 열이다.

따라서 기존에 저장된 rdy와 현재 행에서 가장 끝에 존재하는 #의 열을 비교하여 더 큰 값이 rdy에 저장되도록 해야 한다.

 

 

2. 정답 코드

def solution(wallpaper):
    lux, luy, rdx, rdy = -1, 51, -1, -1
    
    length = len(wallpaper[0])
    for i, wp in enumerate(wallpaper):
        if wp.find('#') == -1:
            continue
            
        if lux == -1:
            lux = i
        rdx = i + 1
        
        left = wp.index('#')
        luy = left if left < luy else luy
        
        right = length - wp[::-1].index('#')
        rdy = right if rdy < right else rdy
        
    return [lux, luy, rdx, rdy]
728x90