본문 바로가기

알고리즘/프로그래머스

[프로그래머스]Lv1. 바탕화면 정리(Python)

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

 

프로그래머스

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

programmers.co.kr

 

문제 접근

 

솔직히 그림 하나만 그려봐도 바로 풀 수 있는 쉬운 문제.. 하지만 난 30분 걸림^^ 

 

생각의 흐름

1. wallpaper은 일차원 배열이므로 이를 문자로 분리해서 graph라는 이차원 배열에 저장

2. 각 #의 위치를 저장할 빈 리스트 할당 후 graph의 인덱스 i, j로 표현하면 location[i][j] => i는 행, j는 열 

3. 교차하는 선을 쫙쫙 그어보면, 가장 작은 [i, j] 그리고 가장 큰 [i+1, j+1]이 드래그의 시작점, 끝점이므로 이 또한 반복문을 두번 사용해서 행에서 최소, 최대 찾고 열에서 최소, 최대를 찾자

 

코드
def solution(wallpaper):
    answer = []
    graph = []	
    location = []
    
    for string in wallpaper:  # 문자열을 문자로 쪼개서 이차원 배열에 저장 
        row = []
        for char in string:
            row.append(char)
        graph.append(row)
        
    # graph를 순회하면서 '#'을 찾고 그 위치(인덱스)를 location에 저장하기
    for i in range(len(graph)):
        for j in range(len(graph[i])):
            if graph[i][j] == '#':
                location.append([i,j])
                
    print(location)  # 찍어보는 용도 
    
    min_i, max_i = location[0][0], location[0][0]
    min_j, max_j = location[0][1], location[0][1]
    
    for x in location:
        if x[0] <= min_i:
            min_i = x[0]
        elif x[0] >= max_i:
            max_i = x[0]
    
    for y in location:
        if y[1] <= min_j:
            min_j = y[1]
        elif y[1] >= max_j:
            max_j = y[1]
            
    # answer에 몽땅 넣기 
    answer.append(min_i)
    answer.append(min_j)
    answer.append(max_i+1)
    answer.append(max_j+1)
              
    return answer

 

문제 회고

 

솔직히 내 코드가 조잡하고 긴 것 같은디.. 다른 사람의 풀이를 보자

와 그냥 너무 간단하다.. 굳이 graph라는 이차원 배열을 안 만들고도 할 수 있다니!!

무엇보다 내 코드는 파이썬 문법의 장점을 전혀 사용하고 있지 않은 코드 ㅠㅠ

def solution(wall):
    a, b = [], []
    for i in range(len(wall)):
        for j in range(len(wall[i])):
            if wall[i][j] == "#":
                a.append(i)
                b.append(j)
    return [min(a), min(b), max(a) + 1, max(b) + 1]