본문 바로가기
알고리즘

백준 1913번 달팽이 Rust 풀이

by PudgeKim 2021. 10. 10.

"The Book"이라고도 불리는 러스트 프로그래밍 공식 가이드 책을 250쪽 정도까지 보고 더 진도를 나가기전에 러스트에 조금 더 익숙해지려고 잠시 멈추었습니다.

백준 문제중에 구현 카테고리에서 문제를 좀 풀어보면 익숙해지는데 도움이 좀 될거같아서 러스트로 풀어봤습니다.

문제 링크
https://www.acmicpc.net/problem/1913

 

1913번: 달팽이

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서

www.acmicpc.net

 

풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
use std::io::{self};
 
fn main() {
    // n = N, target = 위치를 찾고자하는 자연수
    let mut n = String::new();
    let mut target = String::new();
 
    // input 받기
    io::stdin().read_line(&mut n);
    io::stdin().read_line(&mut target);
 
    // 숫자로 변환 (read_line시에 줄바꿈이 포함되어있어서 trim으로 제거해주어야함)
    let mut n: usize = n.trim().parse().expect("");
    let target: i32 = target.trim().parse().expect("");
 
    // 2차원 배열 생성
    let mut arr = vec![vec![0; n]; n];
 
    // 타입 문제로 인해 변환
    let mut start_num: i32 = n as i32;
    let mut start_num: i32 = start_num*start_num;
 
    dfs(&mut arr, start_num, n, 00);
 
    // 정답 좌표
    let mut target_x: usize = 0;
    let mut target_y: usize = 0;
 
    // 정답 배열 출력
    for i in 0..n {
        for j in 0..n {
            print!("{} ", arr[i][j]);
            if arr[i][j] == target {
                target_x = i+1;
                target_y = j+1;
            }
 
        }
        println!();
    }
 
    println!("{} {}", target_x, target_y);
 
}
 
// (start_x, start_y)에서 start_num을 1씩 감소하며 바깥에서부터 배열을 채워나감
// n-1만큼 채우고 방향을 바꿈
fn dfs(arr:&mut Vec<Vec<i32>>, mut start_num: i32, n: usize, mut start_x: usize, mut start_y: usize) {
 
    if n == 1 {
       arr[start_x][start_y] = 1;
        return;
    }
 
    // 위에서 아래로
    for i in 0..n-1 {
        arr[start_x][start_y] = start_num;
        start_num -= 1;
        start_x += 1;
    }
 
    // 왼쪽에서 오른쪽으로
    for i in 0..n-1 {
        arr[start_x][start_y] = start_num;
        start_num -= 1;
        start_y += 1;
    }
 
    // 아래에서 위로
    for i in 0..n-1 {
        arr[start_x][start_y] = start_num;
        start_num -= 1;
        start_x -= 1;
    }
 
    // 오른쪽에서 왼쪽으로
    for i in 0..n-1 {
        arr[start_x][start_y] = start_num;
        start_num -= 1;
        start_y -= 1;
    }
 
    start_x += 1;
    start_y += 1;
 
    dfs( arr, start_num, n-2, start_x, start_y);
}
cs

'알고리즘' 카테고리의 다른 글

백준 12933번 오리 Rust 풀이  (0) 2021.10.11
백준 14467번 Rust 풀이  (0) 2021.10.10
카카오 인턴십 표 편집 (Python)  (0) 2021.08.21
백준 사회망 서비스(Python/Go)  (0) 2021.04.15
백준 단지번호 붙이기(Go)  (0) 2021.04.11