[프로그래머스] 행렬 테두리 회전하기 파이썬

FFTL:)·2021년 6월 8일
0

행렬 테두리 회전하기 ( https://programmers.co.kr/learn/courses/30/lessons/77485 )

프로그래머스의 문제입니다. 특별한 알고리즘이 필요하다기 보다는 설명대로 구현만 잘 해내면 풀어낼 수 있었던 문제입니다. 본인이 코딩테스트를 할 때에 어렵게 생각을 해서 풀어내지 못했던 문제입니다.

문제해결

  • 일단 주어진 rows와 columns으로 이루어진 행렬을 만들어줍니다.
  • 그리고 입력으로 주어진 queries를 하나씩 받아들여 설명대로 회전을 시키며 그 중의 최솟값을 찾아내어 answer에 담아줍니다.
def solution(rows, columns, queries):
    answer = []
    
    #form 만들기
    #주어진 rows, columns값을 가지고 rows X columns 의 form 을 만들어줍니다.
    form = []
    num = 1;
    for i in range(rows):
        now = []
        for j in range(columns):
            now.append(num);
            num += 1;
        form.append(now);
    
    #queries를 하나씩 받아들여 회전을 진행시킵니다.
    for x1, y1, x2, y2 in queries:
        min_num = 9999999999999;		#최소값을 담기 위한 변수입니다. 그냥 크게 설정을 하고싶었습니다..
        temp = form[x1-1][y2-1];		#회전을 진행하다보면 해당 줄에서 벗어나는 값이 있게 되는데 그중에 한 값을 미리 담아두어 나머지 값들이 줄을 벗어나더라도 입력될 수 있는 빈 칸을 만들어 줍니다..?
        
        #top
        #상단부분을 회전시켜줍니다.
        min_num = min(min(form[x1-1][y1-1:y2]), min_num) #상단부분의 값중에 min_num 보다 작은 값이 있다면 업데이트 시켜줍니다.
        form[x1-1][y1:y2] = form[x1-1][y1-1:y2-1];
        
        
        #left
        #좌측부분을 회전시켜줍니다.
        for x in range(x1, x2):
            min_num  = min(form[x][y1-1], min_num)	#좌측부분의 값중에 min_num 보다 작은 값이 있다면 업데이트 시켜줍니다.
            form[x-1][y1-1] = form[x][y1-1];
        
        #bottom
        #하단부분을 회전시켜줍니다.
        min_num = min(min(form[x2-1][y1-1:y2]), min_num) #하단부분의 값중에 min_num 보다 작은 값이 있다면 업데이트 시켜줍니다.
        form[x2-1][y1-1:y2-1] = form[x2-1][y1:y2];
        
        #right
        #우측부분을 회전시켜 줍니다.
        for x in range(x2-1, x1, -1): 		#우측 방향은 아래방향으로 숫자가 이동해야 하기 때문에 x 값을 감소하는 포문으로 해야 같은 값이 계속해서 들어가지 않게 됩니다.
            min_num  = min(form[x-1][y2-1], min_num)
            form[x][y2-1] = form[x-1][y2-1];
            
        form[x1][y2-1] = temp; 			#마지막 빈칸에 담아두었던 temp 값을 넣어줍니다.
        
        answer.append(min(temp, min_num))	#마지막으로 temp와 min_num을 비교하여 작은 값을 answer에 담아줍니다.
        
    #이를 반복하여 answer를 찾아냅니다.
    return answer

=> 구현하는 부분에 약하긴 했지만 반복을 통해서 익혀야 함을 느꼈습니다. 이번 문제도 역시 X축 Y축이 헷갈리는 부분이 있었지만 확인을 잘 해야 했습니다. 그리고 python의 form[x][y1:y2] 같은 문법을 사용하였는데 해당 문법이 포함하는 범위등을 잘 인지할 수 있었어야 하는 문제였습니다.

profile
생각하는 개발자가 되자!

0개의 댓글