solved.ac 기준 실버 5

 

1913번: 달팽이

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

www.acmicpc.net

아이디어/참고

https://codepractice.tistory.com/81 해당 페이지에 있는 사진을 참고하였다.

 (0, 0) 좌표에서 입력받은 값 n의 2승(=n^2) 부터 시작하여 행(row)의 값이 증가하는 방향으로 시작

 

테스트 환경

- OS: Windows 10

- IDE: Visual Studio Code

- 컴파일러: Visual C++

 

첫 번째 답

- 코드 용량: 1988KB

- 실행 시간: 156ms

- 아이디어

실행 순서

- 답안

#include <iostream>

using namespace std;

void snail(int n, int find)
{
    int l = n;
    int value = n * n;
    int row = -1;
    int col = 0;
    int dir = 1;
    int x, y;
    int** arr;
    arr = new int* [n];
    for(int i=0; i<n; i++) arr[i] = new int[n];

    while (l > 0){
        for (int i=0; i<l; i++){
            row = row + dir;
            arr[row][col] = value;
            if (value == find){
                x = col + 1;
                y = row + 1;
            }
            value--;
        }
        l--;
        for (int i=0; i<l; i++){
            col = col + dir;
            arr[row][col] = value;
            if (value == find){
                x = col + 1;
                y = row + 1;
            }
            value--;
        }
        dir = dir * (-1);
    }

    for(int i=0; i<n * n; i++){
        int r = i / n;
        int c = i % n;
        cout << arr[r][c] << " ";
        if((i % n) == n - 1) cout << endl;
    }

    cout << y << " " << x << endl;
    
    for(int i=0; i<n; i++) delete[] arr[i];
    delete[] arr;
}

int main()
{
    int n, find;
    cin >> n >> find;
    snail(n, find);
    return 0;
}

 

두 번째 답

첫 번째 코드의 경우 아이디어를 따왔던 게시글에 있는 코드와 유사하게 짰음.

이번엔 꼭지점에 도달할 경우 방향을 바꾸는 방식으로 진행.

- 코드 용량: 1988KB

- 실행 시간: 156ms

- 아이디어

첫 열에 대해 값 입력.
꼭지점에 도달하고, 두 번째 열이 첫번째가 되도록 함.
꼭지점에 도달하고, 네 번째 행이 마지막이 되도록 함.

 

 

 

 

 

 

 

 

 

 

 

 

- 답안

#include <iostream>

using namespace std;

void snail(int n, int find)
{
    int row = 0, col = 0;
    int value = n*n;
    int rfirst = 0, cfirst = 0;
    int rlast = n-1, clast = n-1;
    int x, y;
    int** arr;
    arr = new int* [n];
    for(int i=0; i<n; i++) arr[i] = new int[n];

    while (value > 0){
        arr[row][col] = value;
        if (value == find){
            x = col + 1;
            y = row + 1;
        }
        value--;
        if (row < rlast && col == cfirst){
            row++;
            if (row == rlast) cfirst++;
        }
        else if (row == rlast && col < clast){
            col++;
            if (col == clast) rlast--;
        }
        else if (row > rfirst && col == clast){
            row--;
            if (row == rfirst) clast--;
        }
        else if (row == rfirst && col > cfirst){
            col--;
            if (col == cfirst) rfirst++;
        }
    }
    
    for(int i=0; i<n * n; i++){
        int r = i / n;
        int c = i % n;
        cout << arr[r][c] << " ";
        if((i % n) == n - 1) cout << endl;
    }

    cout << y << " " << x << endl;
    
    for(int i=0; i<n; i++) delete[] arr[i];
    delete[] arr;
}

int main()
{
    int n, find;
    cin >> n >> find;
    snail(n, find);
    return 0;
}

 

'기초쌓기 > PS' 카테고리의 다른 글

백준 1074번: Z (작성중)  (0) 2020.07.09
백준 10845번: 큐  (0) 2020.05.27
백준 10828번: 스택  (0) 2020.05.26
백준 1316번: 그룹 단어 체커  (0) 2020.05.25
백준 2750번: 수 정렬하기  (0) 2020.05.25

+ Recent posts