본문 바로가기
알고리즘 문제풀이

[프로그래머스] 행렬 테두리 회전하기 (Swift)

by SiO2whocode 2022. 3. 2.
728x90

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

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
}
728x90