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()
반응형