나의 기록, 현진록

[Swift] 백준 1022 소용돌이 예쁘게 출력하기 본문

Programming/Algorithm & Data Structure

[Swift] 백준 1022 소용돌이 예쁘게 출력하기

guswlsdk 2025. 3. 10. 15:26
반응형

https://www.acmicpc.net/problem/1022

 

 

1. 문제이해

  • 0행 0열 반시계 방향 순서로 숫자가 작성된 표를 입력 받은 크기 만큼 출력하기
  • 출력할 때 가장 큰 숫자의 자릿수 만큼 채워야 함(자릿수가 부족할 때 공백으로 채우기)

2. 접근방법

  • 테이블 채우기
    • 제한 사항 때문에 입력 받은 네 점의 크기 만큼만 2차원 배열을 만들어야 함
    • 메모리는 제한되었지만 시간에 대해서는 5000*5000으로 여유
    • 수를 순서대로 증가시키고 표의 크기 내부인 경우에만 표에 접근하여 저장하면 됨
    • 반시계 방향 소용돌이에 맞게 인덱스를 수정하기
  • 출력
    • 최대 값의 길이만큼 자릿수 채우기

3. 코드

 

func solution(){
    let input = readLine()!.split(separator: " ").map{Int(String($0))!}
    let r1 = input[0]
    let r2 = input[2]
    let c1 = input[1]
    let c2 = input[3]
    var map = Array(repeating: Array(repeating: 0, count: c2-c1+1), count: r2-r1+1)
    var maxValue = 0
    
    func fill(){
        // 우, 상, 좌, 하 순서
        let dx = [0, -1, 0, 1]
        let dy = [1, 0, -1, 0]
        var dIndex = 0
        
        var x = 0
        var y = 0
        
        var currentNum = 1
        var countForTurn = 1 // 몇 번 이동할 때마다 회전 해야 하는지
        var moveCount = 0 // countForTurn을 위한 이동 횟수
        
        while map[0][0] == 0 || map[r2-r1][0] == 0 || map[0][c2-c1] == 0 || map[r2-r1][c2-c1] == 0{
            if x >= r1, x <= r2, y >= c1, y <= c2{
                map[x-r1][y-c1] = currentNum
            }
            
            currentNum += 1
            moveCount += 1
            x = x + dx[dIndex]
            y = y + dy[dIndex]

            if moveCount == countForTurn{
                moveCount = 0
                if dIndex == 1 || dIndex == 3 { // 왼쪽, 오른쪽 방향일 때 방향을 꺽기까지 이동하는 횟수가 증가함
                    countForTurn += 1
                }
                dIndex = (dIndex + 1) % 4
            }
        }

        maxValue = currentNum - 1 // 가장 큰 수 저장 (가장 큰 수의 길이)
    }
    
    func printResult(){
        let strLen = String(maxValue).count
        for i in 0..<r2-r1+1{
            for j in 0..<c2-c1+1{
                print(String(format: "%\(strLen)d", map[i][j]), terminator: " ")
            }
            print()
        }
    }
    fill()
    printResult()
}
solution()
반응형