코딩테스트

[프로그래머스] 바탕화면 정리 - Lv.1

pyflu 2023. 8. 7. 16:50

[프로그래머스] 바탕화면 정리 Lv.1 - [파이썬/python]

 

 

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

 

프로그래머스

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

programmers.co.kr


 

더보기

복잡하게 생각하실거 없습니다.

 

for문 사용하여 바탕화면(wallpaper)을 순회하면서 파일("#")을 발견하면
파일("#")의 인덱스를 저장하고

파일("#")의 인덱스인 y, x의 둘 각각 가장 작은 값과 가장 큰 값을 구하면 됩니다.

 

 

  • 파일 위치 식별
    주어진 바탕화면(wallpaper)에서 파일이 위치한 곳을 식별하는 것이 중요합니다.
    이를 위해 이중 반복문을 사용하여 "#" 문자의 위치를 찾아내야 합니다.


  • 파일의 인덱스 y, x의 최솟값과 최댓값 각각 찾기
    윗 단계에서 바탕화면(wallpaper)을 순회하다보면 파일("#")을 찾으실 수 있습니다.
    파일("#")의 찾았을 때의 위치(인덱스)를 저장하여 y, x의 각각 최솟값과 최댓값을 찾아보십시오.


  • 결과 반환
    y, x의 각각 최솟값과 최댓값을 사용하여 문제의 결과를 반환하기
    [min(y), min(x), max(y)+1, max(x)+1]

 

 

저는 일단 두 가지 방법으로 풀었는데 두 방법 다 원리는 똑같습니다.

메모리와 시간복잡도를 계산해보니 1번 방법이 조금 더 빨랐습니다.


2번 방법은 코드 보기가 편합니다.

두 코드 다 올려놓겠습니다.

 

 




정답 주의!!!




 

 

# 1번 방법 / 2번 보다 메모리 사용과 성능이 좋습니다

프로그래머스 바탕화면 정리 파이썬


def solution(wallpaper):
   
    min_y, min_x = len(wallpaper), len(wallpaper[0])
    max_y, max_x = -1, -1
    #최솟값과 최댓값을 구해야하므로 그에 반하는 값 입력
   
    for y_idx, x in enumerate(wallpaper):
    #한줄씩 확인하기
       
        if "#" in x:
        #줄에 "#"이 있을 때 확인하기
           
            if (y_idx < min_y): #맨 위쪽 좌표 구하기(y의 최솟값)
                min_y = y_idx
               
            if (y_idx+1 > max_y): #맨 아래쪽 좌표 구하기(y의 최댓값)
                max_y = y_idx+1
               
            if (x.find("#") < min_x): #맨 왼쪽 좌표 구하기(x의 최솟값)
                min_x = x.find("#")
               
            if (x.rfind("#")+1 > max_x): #맨 오른쪽 좌표 구하기(x의 최댓값)
                max_x = x.rfind("#")+1
       
    return [min_y,min_x,max_y,max_x]

프로그래머스 바탕화면 정리
프로그래머스 바탕화면 정리

 


 

# 2번 방법 

프로그래머스 바탕화면 정리 파이썬


def solution(wallpaper):
   
    file_y = [] # 파일("#")의 세로 위치를 담을 배열
    file_x = [] # 파일("#")의 가로 위치를 담을 배열
   
    # 주어진 바탕화면(wallpaper)을 한 줄씩 순회
    for y_idx, row in enumerate(wallpaper):
        for x_idx, i in enumerate(row):
       
            # 파일("#")을 찾으면,
            if i == "#":

                file_y.append(y_idx) # 해당 파일의 세로 위치를 file_y 배열에 추가
                file_x.append(x_idx) # 해당 파일의 가로 위치를 file_x 배열에 추가
   
    # min(file_y) = 파일이 존재하는 가장 위쪽 행의 인덱스 중 가장 작은 값을 찾아서 최소 세로 위치로 설정
    # min(file_x) = 파일이 존재하는 가장 왼쪽 열의 인덱스 중 가장 작은 값을 찾아서 최소 가로 위치로 설정
   
    # max(file_y) + 1 = 파일이 존재하는 가장 아래쪽 행의 인덱스 중 가장 큰 값을 찾아서 최대 세로 위치로 설정
    # max(file_x) + 1 = 파일이 존재하는 가장 오른쪽 열의 인덱스 중 가장 큰 값을 찾아서 최대 가로 위치로 설정
   
    return [min(file_y), min(file_x), max(file_y)+1, max(file_x)+1]

프로그래머스 바탕화면 정리
프로그래머스 바탕화면 정리

728x90