문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/77485
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 핵심
ows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.
- x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.
알고리즘
1.입력받은대로 2차원 배열 생성
2.쿼리들 순회하기
-첫가로줄순회
-오른쪽세로줄순회
-아래가로줄순회
-왼쪽세로순회
3.순회하면서 최솟값구하고 해당값 다음 좌표 저장하기
-다음좌표값은 시계방향대로 이며, 각줄 끝자리 값 잘 처리하기
코드
public static int[] solution(int rows, int columns, int[][] queries) {
int[] answer = new int[queries.length];
int[][] matrix = new int[rows][columns];
int num = 1;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
matrix[i][j] = num++;
}
}
System.out.println(Arrays.deepToString(matrix));
int anserIndex = 0;
for (int[] query : queries) {
int srow = query[0] - 1;
int scol = query[1] - 1;
int erow = query[2] - 1;
int ecol = query[3] - 1;
System.out.println("srow=" + srow + ", scol=" + scol + ", erow=" + erow + ", ecol=" + ecol);
int min = Integer.MAX_VALUE;
List<int[]> nums = new LinkedList<>();
for (int i = scol; i <= ecol; i++) {
System.out.print(matrix[srow][i]);
if(i==ecol){
nums.add(new int[] { matrix[srow][i], srow+1, i });
}else{
nums.add(new int[] { matrix[srow][i], srow, i+1 });
}
if (min > matrix[srow][i]) {
System.out.println("1최소수갱신");
min = matrix[srow][i];
}
}
System.out.println(nums.stream().map(Arrays::toString).toList());
for (int i = srow + 1; i <= erow; i++) {
System.out.print(matrix[i][ecol]);
if(i==erow){
nums.add(new int[] { matrix[i][ecol], i, ecol-1 });
}else{
nums.add(new int[] { matrix[i][ecol], i+1, ecol });
}
if (min > matrix[i][ecol]) {
System.out.println("2최소수갱신");
min = matrix[i][ecol];
}
}
System.out.println(nums.stream().map(Arrays::toString).toList());
for (int i = ecol - 1; i >= scol; i--) {
System.out.print(matrix[erow][i]);
if(i==scol){
nums.add(new int[] { matrix[erow][i], erow-1, i });
}else{
nums.add(new int[] { matrix[erow][i], erow, i-1 });
}
if (min > matrix[erow][i]) {
System.out.println("3최소수갱신");
min = matrix[erow][i];
}
}
System.out.println(nums.stream().map(Arrays::toString).toList());
for (int i = erow - 1; i > srow; i--) {
System.out.print(matrix[i][scol]);
if(i==srow){
nums.add(new int[] { matrix[i][scol], i, scol+1 });
}else{
nums.add(new int[] { matrix[i][scol], i-1, scol });
}
if (min > matrix[i][scol]) {
System.out.println("4최소수갱신");
min = matrix[i][scol];
}
}
System.out.println("최소수: " + min);
answer[anserIndex] = min;
anserIndex += 1;
Collections.rotate(nums, 1);
System.out.println(nums.stream().map(Arrays::toString).toList());
for(int[]numArr:nums){
matrix[numArr[1]][numArr[2]]=numArr[0];
}
}
System.out.println(Arrays.deepToString(matrix));
System.out.println(Arrays.toString(answer));
return answer;
}
결과

gpt피드백
1. 알고리즘 평가
현재 알고리즘에는 불필요한 작업이 하나 있어.
이미 목적지 좌표를 계산했는데 Collections.rotate(nums, 1)까지 수행하고 있다는 점이야.
2. 코드 평가
개선점
① 반복되는 최솟값 비교
② LinkedList 대신 ArrayList
③ 불필요한 조건문 제거
후기
얼핏 보기엔 어려운 문제같아보였으나
하나씩 쪼개면 쉬운문제였다
'코테 > lvl2' 카테고리의 다른 글
| 프로그래머스 혼자놀기의달인(lvl2) 풀어보기 (0) | 2026.10.22 |
|---|---|
| 프로그래머스 이모티콘 할인행사(lvl2) 풀어보기 (0) | 2026.10.20 |
| 프로그래머스 귤고르기(lvl2) 풀어보기 (0) | 2026.10.19 |
| 프로그래머스 괄호 변환(lvl2) 풀어보기 (0) | 2026.10.19 |
| 프로그래머스 의상(lvl2)풀어보기 (0) | 2026.10.16 |