TIL

[코딩 테스트] 구현 연습하기 #python

ainniz 2024. 6. 2. 14:54

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

 

프로그래머스

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

programmers.co.kr

 

풀이1

회전을 어떻게 구현할지 고민하다가 새로운 1차원 배열을 만들고, 한 칸 뒤로 밀린 또 다른 새로운 배열을 만들어 다시 maps에 반영해주는 방법을 생각했다.

또한 1번째 행,열부터 시작이므로 편의상 0번째 행,열을 0으로 채운 maps를 만들어 문제를 풀었다.

코드

def solution(rows, columns, queries):
    answer = []
    
    # 행렬 만들기
    maps = [[0 for _ in range(columns+1)]]
    maps += [[i*columns + j for j in range(columns+1)] for i in range(rows)]
    for i in range(rows+1):
        maps[i][0] = 0
    
    # 회전 적용
    for query in queries:
        x1,y1,x2,y2 = query
        arr = []
        for j in range(y1,y2):
            arr.append(maps[x1][j])
        for i in range(x1,x2):
            arr.append(maps[i][y2])
        for j in range(y2,y1,-1):
            arr.append(maps[x2][j])
        for i in range(x2,x1,-1):
            arr.append(maps[i][y1])
        answer.append(min(arr))
        new_arr = [arr[-1]]+arr[:-1]

        k=0
        for j in range(y1,y2):
            maps[x1][j] = new_arr[k]
            k += 1
        for i in range(x1,x2):
            maps[i][y2] = new_arr[k]
            k += 1
        for j in range(y2,y1,-1):
            maps[x2][j] = new_arr[k]
            k += 1
        for i in range(x2,x1,-1):
            maps[i][y1] = new_arr[k]
            k += 1
        
    return answer

 

연산량이 많고 거의 같은 내용의 데이터를 담는 배열을 여러 개 사용해 불필요한 메모리를 사용하는 거 같았다.

또한 0번째 행과 열을 사용하지 않고 0을 더해주는 것도 찝찝했다.

 

풀이2

회전을 하면서 1개의 요소만 temp에 저장하면 나머지는 기존의 배열 내에서 갱신할 수 있었다.

또한 0번째 행,열을 0으로 채우지 않고 그대로 사용했다.

코드

def solution(rows, columns, queries):
    answer = []
    
    # 행렬 만들기
    maps = [[i*columns + j + 1 for j in range(columns)] for i in range(rows)]
    
    # 회전 적용
    for x1,y1,x2,y2 in queries:
        x1,y1,x2,y2 = x1-1,y1-1,x2-1,y2-1 # 인덱스 조정
        temp = maps[x1][y1]
        m = min(10000,temp)
        
        for i in range(x1,x2):
            maps[i][y1] = maps[i+1][y1]
            m = min(m, maps[i][y1])
            
        for j in range(y1,y2):
            maps[x2][j] = maps[x2][j+1]
            m = min(m, maps[x2][j])
            
        for i in range(x2,x1,-1):
            maps[i][y2] = maps[i-1][y2]
            m = min(m, maps[i][y2])
            
        for j in range(y2,y1,-1):
            maps[x1][j] = maps[x1][j-1]
            m = min(m, maps[x1][j])

        maps[x1][y1+1] = temp
        answer.append(m)
        
    return answer