Time does not change us. It just unfolds us.

Coding Test

[COS Pro] 1급 1차 C++

소젬 2022. 2. 27. 00:18

1차 69분

빈칸 1 3:58 3:58
빈칸 2 6:08 2:10
빈칸 3 10:55 4:47
구현  4 13:57 P 3:02
구현  5 34:47 20:50
구현  6 45:38 10:51
빈칸 7 48:44 3:06
한줄  8 52:26 3:42
한줄  9 58:14 5:48
한줄  10 1:06:25 8:11
다시  4 1:09:25 3:00

 

 


가장 오래 풀었던 5번

소용돌이 수

다음과 같이 n x n 크기의 격자에 1부터 n x n까지의 수가 하나씩 있습니다.

이때 수가 다음과 같은 순서로 배치되어있다면 이것을 n-소용돌이 수라고 부릅니다.

소용돌이 수에서 1행 1열부터 n 행 n 열까지 대각선상에 존재하는 수들의 합을 구해야 합니다.

위의 예에서 대각선상에 존재하는 수의 합은 15입니다.
격자의 크기 n이 주어질 때 n-소용돌이 수의 대각선상에 존재하는 수들의 합을 return 하도록 solution 함수를 완성해주세요.

매개변수 설명

격자의 크기 n이 solution 함수의 매개변수로 주어집니다.
* n은 1 이상 100 이하의 자연수입니다.

return 값 설명

n-소용돌이 수의 대각선상에 존재하는 수들의 합을 return 해주세요.

예시


내가푼답

 

// 하단과 깉이 include를 사용할 수 있습니다.
#include <iostream>
#include <string>
#include <vector>
#include <numeric>

using namespace std;

int solution(int n) {
  int answer = 0;
  int init = 1;
	
	vector<int> v;
	v.push_back(1);
	
  int i=1;
	while(n-i > 0) {
		v.push_back(init+(n-i)*2);
		int temp = init+(n-i)*4;
		if(temp <= n*n) {
			v.push_back(temp);
			init = temp;
		}else break;
		i += 2;
		
	}
	answer = accumulate(v.begin(), v.end(), 0);

    return answer;
}

정답

 

#include <bits/stdc++.h>
#define pb push_back
#define sz(v) (int)(v).size()
#define all(v) (v).begin(),(v).end()
#define fastio() ios::sync_with_stdio(0),cin.tie(0);
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int inf = 0x3c3c3c3c;
const ll infl = 0x3c3c3c3c3c3c3c3c;

int pane[103][103];
int inRange(int i, int j, int n){
    return 0 <= i && i < n && 0 <= j && j < n;
}
int dy[4] = {0, 1, 0, -1};
int dx[4] = {1, 0, -1, 0};
int solution(int n){
    int ci = 0, cj = 0;
    int num = 1;
    while(inRange(ci, cj, n) && pane[ci][cj] == 0){
        for(int k = 0; k < 4; k++){
            if(!inRange(ci, cj, n) || pane[ci][cj] != 0) break;
            while(1){
                pane[ci][cj] = num++;
                int ni = ci + dy[k];
                int nj = cj + dx[k];
                if(!inRange(ni, nj, n) || pane[ni][nj] != 0){
                    ci += dy[(k + 1) % 4];
                    cj += dx[(k + 1) % 4];
                    break;
                } 
                ci = ni;
                cj = nj;
            }
        }
    }
    int ans = 0;
    for(int i = 0; i < n; i++) ans += pane[i][i];
    return ans;
}