제이슨의 개발이야기
프로그래머스 코틀린 행렬 테두리 회전하기 본문
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
- 행렬 테두리 회전하기
rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.
- x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.
다음은 6 x 6 크기 행렬의 예시입니다.
![](https://blog.kakaocdn.net/dn/cox5lo/btrARKPi7D0/Ep3pxOLzJFdaKyeL78kJK1/img.png)
이 행렬에 (2, 2, 5, 4) 회전을 적용하면, 아래 그림과 같이 2행 2열부터 5행 4열까지 영역의 테두리가 시계방향으로 회전합니다. 이때, 중앙의 15와 21이 있는 영역은 회전하지 않는 것을 주의하세요.
![](https://blog.kakaocdn.net/dn/cAzsEj/btrASvjMHqX/RRd7K7zjEQBuNKh34QCdM0/img.png)
행렬의 세로 길이(행 개수) rows, 가로 길이(열 개수) columns, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- rows는 2 이상 100 이하인 자연수입니다.
- columns는 2 이상 100 이하인 자연수입니다.
- 처음에 행렬에는 가로 방향으로 숫자가 1부터 하나씩 증가하면서 적혀있습니다.
- 즉, 아무 회전도 하지 않았을 때, i 행 j 열에 있는 숫자는 ((i-1) x columns + j)입니다.
- queries의 행의 개수(회전의 개수)는 1 이상 10,000 이하입니다.
- queries의 각 행은 4개의 정수 [x1, y1, x2, y2]입니다.
- x1 행 y1 열부터 x2 행 y2 열까지 영역의 테두리를 시계방향으로 회전한다는 뜻입니다.
- 1 ≤ x1 < x2 ≤ rows, 1 ≤ y1 < y2 ≤ columns입니다.
- 모든 회전은 순서대로 이루어집니다.
- 예를 들어, 두 번째 회전에 대한 답은 첫 번째 회전을 실행한 다음, 그 상태에서 두 번째 회전을 실행했을 때 이동한 숫자 중 최솟값을 구하면 됩니다.
입출력 예시rowscolumnsqueriesresult
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] |
100 | 97 | [[1,1,100,97]] | [1] |
이 문제는
시계 방향으로 회전하면서 해당 값들 중 가장 작은 값을 저장하면 되는 문제입니다
처음 보기에는 어려운 문제라고 생각했지만 좀만 고민 해보면 간단한 문제였습니다!
위에 이미지 처럼
1~4번 의 각 조건들을 세워서 반복하면 테두리 회전을 쉽게 구현 할 수 있습니다!
예를 들어서
1번 같은 경우
[[2,2,5,4],[3,3,6,6],[5,1,6,3]] 에서
2,2,5,4 의 좌표의 테두리를 회전하게 된다면
arr[x][y] 라고 가정 할 때
1번은
x==2 이면서 y!=4 인 경우
y++ 을 하면
1번 테두리를 하나씩 접근 할 수 있습니다!
하나씩 접근하면서 시계방향으로 숫자를 이동시켜줍니다!
나머지 2,3,4, 번 테두리 역시 앞서 1번 처럼 구현하면 쉽게 풀 수 있습니다!
class Solution {
fun solution(rows: Int, columns: Int, queries: Array<IntArray>): IntArray {
var answer = intArrayOf()
answer = IntArray(queries.size)
var arr: Array<IntArray> = Array(rows) { IntArray(columns) }
var num = 1
for (i in 0 until rows) {
for (j in 0 until columns) {
arr[i][j] = num
num++
}
}
for (i in queries.indices) {
var x1 = queries[i][0]
var y1 = queries[i][1]
var x2 = queries[i][2]
var y2 = queries[i][3]
var x = x1 - 1
var y = y1
var temp = arr[x1 - 1][ y1 - 1]
var min = temp
while (x != x1 - 1 || y != y1 - 1) {
min = Math.min(min, arr[x][y])
var temp2 = arr[x][y]
arr[x][y] = temp
temp = temp2
if (y < y2 - 1 && x == x1 - 1) {
y++
} else if (y == y2 - 1 && x != x2 - 1) {
x++
} else if (x == x2 - 1 && y > y1 - 1) {
y--
} else if (y == y1 - 1 && x > x1 - 1) {
x--
}
}
arr[x1-1][y1-1] = temp
min = Math.min(min, arr[x1-1][y1-1])
answer[i] = min
}
for(w in 0 until rows){
for(j in 0 until columns){
print(arr[w][j])
}
println()
}
return answer
}
}
fun main() {
var sol = Solution()
var answer =
sol.solution(6, 6, arrayOf(intArrayOf(2, 2, 5, 4,), intArrayOf(3, 3, 6, 6,), intArrayOf(5, 1, 6, 3)))
// for(i in answer.indices){
// println(answer[i])
// }
}
'코딩테스트' 카테고리의 다른 글
프로그래머스 코틀린 이진 변환 반복하기 월간 코드 챌린지 시 (0) | 2022.05.02 |
---|---|
프로그래머스 코틀린 양궁대회 2022 KAKAO BLIND RECRUITMENT (0) | 2022.05.02 |
프로그래머스 코틀린 배달 Summer/Winter Coding(~2018) (0) | 2022.04.27 |
코틀린 백준 1316번 문자열 집합 (0) | 2022.04.25 |
코틀린 백준 1543 문서 검색 (0) | 2022.04.23 |