https://programmers.co.kr/learn/courses/30/lessons/77485
level2 구현
rows*columns 인 격자판이 있고, 순서대로 1부터 숫자가 채워져 있다.
사각형을 이루는 대각선의 점이 주어지고, 그 사각형의 테두리를 시계방향으로 한칸 회전한다.
여러개의 대각선 점이 주어지고, 각 테두리를 회전시키면서 만난 가장 최솟값을 반환하는 문제
접근방법
판이 커질 것 같아서 다른 방법을 고민해봤는데, 숫자의 이동이 누적되어야 하는 문제라 rows*columns 크기의 배열에 숫자를 채운 후에 시뮬레이션 하듯 처리했다.
좌상단 꼭지점, 우하단 꼭지점이 주어지는건 고정이라 회전방향이 동->남->서->북 으로 고정이다.
따라서 꼭지점을 만나면 방향을 바꿔주면 된다.
참고한 부분은 배열의 값을 회전시키는 과정에서 temp와 before 변수를 사용해야 한다는 점이었다.
현재 위치의 값을 temp에 담고, before(이전 위치)값을 현재 자리에 담고, 이제 before이 된 현재위치에 있던 temp값을 before에 담아서 다음 노드로 이동해야한다.
오답노트
코드를 짜고 나니 반복문 조건 때문에 마지막 위치의 값이 바뀌지 않아서 grid[cr][cc] = before 작업을 반복문이 끝나고 한번 더 해줬다.
가독성을 높이고자 방향이름 : 이동크기(?)를 딕셔너리로 선언하고, 꼭지점을 만나는지 확인하여 방향을 바꿔주었는데
배열로 선언하고, 방향 전환 순서대로 이동 크기를 담아두고, 꼭지점을 지나칠때마다 배열 인덱스를 1 증가시키는 방법도 좋은 것 같다.
import Foundation
func solution(_ rows:Int, _ columns:Int, _ queries:[[Int]]) -> [Int] {
var answer:[Int] = []
var directions:[String:[Int]] = ["N":[-1,0],"S":[1,0],"W":[0,-1],"E":[0,1]]
var grid:[[Int]] = Array(repeating: Array(repeating:0, count:columns), count:rows)
for r in 0..<rows {
for c in 0..<columns {
grid[r][c] = (r*columns + c+1)
}
}
for query in queries {
var x1: Int = query[0]-1
var y1: Int = query[1]-1
var x2: Int = query[2]-1
var y2: Int = query[3]-1
var cr: Int = x1
var cc: Int = y1
var direction: String = "E"
var min: Int = grid[cr][cc]
var before: Int = grid[cr][cc]
var temp: Int = before
repeat {
min = grid[cr][cc] < min ? grid[cr][cc] : min
if cr == x1 && cc == y2 {
direction = "S"
} else if cr == x2 && cc == y2 {
direction = "W"
} else if cr == x2 && cc == y1 {
direction = "N"
}
temp = grid[cr][cc]
grid[cr][cc] = before
before = temp
cr += directions[direction]![0]
cc += directions[direction]![1]
} while !(cr == x1 && cc == y1)
grid[cr][cc] = before
answer.append(min)
}
return answer
}
'알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] 멀쩡한 사각형 (Swift) (0) | 2022.03.03 |
---|---|
[프로그래머스] 큰 수 만들기 (Swift) (0) | 2022.03.02 |
[프로그래머스] 기능개발 (Swift) (0) | 2022.03.02 |
[프로그래머스] 조이스틱 (C++) (0) | 2022.03.02 |
[프로그래머스] 위장 (Swift) (0) | 2022.03.02 |