문제
https://school.programmers.co.kr/learn/courses/30/lessons/77485?language=go
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
입출력

해설
x1, y1, x2, y2가 주어졌을 때 주어진 좌표를 기준으로 외곽으로 행렬을 회전했을 때 최솟값을 리턴하는 문제이다.
전형적인 배열 회전 구현 문제이다.
이런 문제들은 많이 풀어서 직접 종이에 써가며 실행해보는 것이 좋다
이 문제는 주어진 4개의 좌표를 기준으로 직사각형을 만들었을 때 제일 외곽이 되는 부분들을 시계방향으로 회전하는 문제이다.
본인은 이런 문제가 나왔을 시 4가지로 나눠서 풀이를 진행한다.
1. 행을 증가하는 방향으로 로직처리
2. 열을 증가하는 방향으로 로직처리
3. 행을 감소하는 방향으로 로직처리
4. 열을 감소하는 방향으로 로직처리
왜 이런 식으로 처리하냐면 한 번에 여러가지를 처리하려고 하면 머리가 복잡해지기에 하나씩 뜯어서 구현하고
나중에 로봇 조립하듯이 붙이면 코딩하기 수월하기 때문이다.
시계방향으로 돌려야 되기 때문에 첫 번째로 행을 증가하는 방향으로 이전 행의 값 하나씩 갖고 온다.
그 후 2번인 열이 증가된 값을 갖고 온다.
3번 4번을 모두 실행하는데, 문제는 4번이다.
4번을 실행하면 마지막의 x1, y1인 초기 위치의 값을 갖고 올 수가 없어진다.
이것은 처음에 예외로 처리해둬서 값을 미리 저장한 뒤
마지막 실행시 반복을 덜 도는 것으로 처리해두면 된다.
매번 반복마다 최솟값을 갖고 오면 되기 때문에 모든 실행을 할 때마다 최솟값을 계속해서 갱신하고
모든 회전이 끝난 뒤에 추가하면 된다.
이런 문제들은 많이 풀어보는 것이 정말 좋다.
BOJ 사이트에서도 배열 회전하는 좋은 문제들이 많으니 몇 개를 추천한다.
https://www.acmicpc.net/problem/16926
https://www.acmicpc.net/problem/17406
https://www.acmicpc.net/problem/20327
정답코드
/*
'26. 1. 17.(토)
1. 직사각형 모양의 범위를 여러 번 선택해서, 테두리 부분에 숫자들을 시계방햐응로 회전한다.
회전 갯수는 10^4
최대 한 번 회전 갯수는 러프하게 400 (제일 외곽)
400 * 10^4이라면 그냥 모두다 쿼리를 수행해도 된다.
14 -> 8
(0, 0), (0, 1)
*/
//import "fmt"
var board [102][102]int
func min(x, y int) int{
if x > y {return y}
return x
}
func solution(rows int, columns int, queries [][]int) []int {
var insertNumber = 1
for i := 1; i <= rows; i++{
for j := 1; j <= columns; j++{
board[i][j] = insertNumber
insertNumber++
}
}
var ret = make([]int, 0)
for _, line := range queries{
//열로 증가
//행 증가
//열 감소
//행 감소
var remember = board[line[0]][line[1]]//처음 값 기억
var smallValue = remember
var x, y = line[0], line[1]
//처음에 행 증가하면서 이전값 갖고 오기
//행 증가
for ;x <= line[2];x++{
//하나 증가된 값 갖고 오기
var nx = x + 1
var ny = y
if nx > line[2]{
nx = line[2]
ny = y + 1
}
board[x][y] = board[nx][ny]
smallValue = min(smallValue, board[nx][ny])
}
x--
for ;y <= line[3];y++{
var nx = x
var ny = y + 1
if ny > line[3]{
nx = x - 1
ny = line[3]
}
board[x][y] = board[nx][ny]
smallValue = min(smallValue, board[nx][ny])
}
y--
for ; x >= line[0]; x--{
var nx = x - 1
var ny = y
if nx < line[0]{
nx = line[0]
ny = y - 1
}
board[x][y] = board[nx][ny]
smallValue = min(smallValue, board[nx][ny])
}
x++
for ; y > line[1] + 1; y--{
var nx = x
var ny = y - 1
board[x][y] = board[nx][ny]
smallValue = min(smallValue, board[nx][ny])
}
board[x][y] = remember
ret = append(ret, smallValue)
}
//var remember =
return ret
}
깃허브 :
'코딩테스트 > programmers' 카테고리의 다른 글
| 프로그래머스 / 구현 / 테이블 해시 함수 (0) | 2026.01.18 |
|---|---|
| 프로그래머스 / DFS / 무인도 여행 (0) | 2026.01.16 |
| 프로그래머스 / BFS / 리코쳇 로봇 (0) | 2025.12.29 |
| 프로그래머스 / 정수론 / 124 나라의 숫자 (0) | 2025.12.27 |
| 프로그래머스 / 정수론 / 소수 찾기 (0) | 2025.12.22 |