Notice
Recent Posts
Recent Comments
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

블로그 언저리인 무언가

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

Programming/BOJ

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

he1fire 2022. 9. 16. 20:22
728x90

문제 : 1022 소용돌이 예쁘게 출력하기

 

1022번: 소용돌이 예쁘게 출력하기

첫째 줄에 네 정수 r1, c1, r2, c2가 주어진다.

www.acmicpc.net

[0,0], [1,1], [2,2].. 는 1, 9, 25...로 제곱수로 나타나기 때문에

[x, x]=(x*2+1)^2를 이용해 기준점으로 잡고 구현해나가면 된다.

 

좌표 중 절댓값이 큰 것을 기준으로  x번째 껍질에 들어가게 되는데

이때 어느 변에 있냐에 따라서 네 꼭짓점을 기준으로 더해주거나 빼면

시뮬레이션 작업 없이도 구현할 수 있다.

이후 가장 큰 값을 기준으로 setw() 함수를 이용해 공백을 출력해주면 된다.


Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll r1, r2, c1, c2, mx, bl;
ll f(ll x, ll y){
    ll ret=0, chk=max(abs(x),abs(y));
    ret=(chk*2+1)*(chk*2+1); // 오른쪽아래 꼭짓점 값
    if (x==chk) // 아랫변
        ret+=y-chk;
    else if (-x==chk) // 윗변
        ret-=y+chk*5;
    else if (y==chk) // 오른쪽변
        ret-=x+chk*7;
    else // 왼쪽변
        ret+=x-chk*3;
    return ret;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> r1 >> c1 >> r2 >> c2;
    for (int i=r1;i<=r2;i++){
        for (int j=c1;j<=c2;j++)
            mx=max(mx,f(i,j));
    }
    for (;mx;bl++,mx/=10); // 공백길이 지정
    for (int i=r1;i<=r2;i++){
        for (int j=c1;j<=c2;j++){
            if (j!=c1)
                cout << " ";
            cout << setw(bl) << f(i,j);
        }
        if (i!=r2)
            cout << "\n";
    }
}
728x90
Comments