본문 바로가기
Algorithm/Programmers

[프로그래머스(programmers)] (2021 Dev-Matching) 행렬 테두리 회전하기

by 광진구뚝배기 2021. 6. 3.

알고리즘 문제 풀이 / 프로그래머스 (programmers)  - 행렬 테두리 회전하기

 

 

 

 

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/77485

 

코딩테스트 연습 - 행렬 테두리 회전하기

6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]

programmers.co.kr

 

 

문제 링크

한 칸씩 이동하는 것이므로 dx, dy 배열을 만들었다.

 

 

이번 문제는 거의 2시간 정도 걸렸다. 이렇게 까지 오래 걸린지 몰랐는데 시간을 보니 훌쩍 지나있었다. 문제를 어떤식으로 풀지 생각하는건 금방 했는데 구현하는 것에서 오래걸렸다. 오래 걸리게 된 가장 큰 이유는 내가 행과 열을 자꾸 반대로 생각해서 실수가 많았다.

내가 푼 방법을 설명해보자면, 테두리를 회전시킬때 필요한 방향은 [ → ↓ ← ↑]  이므로 각각 좌,우,상,하 로 한 칸씩 이동하게 된다. 그래서 한칸씩 움직일 dx, dy 좌표 배열을 만들어줬다. 배열의 인덱스가 짝수일 때는 좌우, 홀수일때는 상하 이므로 나눠서 구했다. 예를들어 오른쪽으로 가야할 맨 윗 줄을 풀이해보자면 dx는 1, dy는 0이므로 temp변수를 만들어 처음 위치의 값을 저장해 둔다. 그 후 현재 위치인 now_dx, now_dy 에 dx, dy를 더해준 위치에 temp를 저장하는식으로 풀었다. 쉽게 말해서 temp 변수 선언후 두개의 위치를 바꿔주는 식으로 풀었다. 이번 문제는 8점 받았다.

 

 

public static int[] solution(int rows, int columns, int[][] queries) {
	int[] answer = new int[queries.length];
	int[][] matrix = new int[rows][columns];

	int[] dx = {1,0,-1,0};
	int[] dy = {0,1,0,-1};

	int start = 1;
	for(int i = 0; i < rows; i++) {
		for(int j = 0; j < columns; j++) {
			matrix[i][j] = start++;
		}
	}

	for(start = 0; start < queries.length; start++) {
		int start_dx = queries[start][1] - 1;
		int start_dy = queries[start][0] - 1;
		int min = rows * columns;
		int temp = 0;
		int now_dx = start_dx;
		int now_dy = start_dy;

		for(int move = 0; move < 4; move++) {
			if(move % 2 == 0) { // 좌우 이동
				for(int i = 0; i < queries[start][3]-queries[start][1]; i++) {
					now_dx += dx[move];
					now_dy += dy[move]; 

					if(temp == 0) {
						temp = matrix[now_dy][now_dx]; 
						matrix[now_dy][now_dx] = matrix[start_dy][start_dx];

					}else {
						int temp2 = matrix[now_dy][now_dx];
						matrix[now_dy][now_dx] = temp;
						temp = temp2;
					}
					if(temp < min) min = temp;

				}
			}else {
				for(int i = 0; i < queries[start][2]-queries[start][0]; i++) {
					now_dy += dy[move];
					now_dx += dx[move];
					int temp2 = matrix[now_dy][now_dx];
					matrix[now_dy][now_dx] = temp;
					temp = temp2;
					if(temp < min) min = temp;
				}
			}
		}

	answer[start] = min;
	}

	return answer;
}
반응형

댓글