n^2 배열 자르기

 

https://school.programmers.co.kr/learn/courses/30/lessons/87390

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


 

해결전략

 

동적계획법, Dynamic Programming, DP

구현


 

첫번째 시도 코드 - 시간초과

 

#include <string>
#include <vector>
using namespace std;
vector<int> solution(int n, long long left, long long right) {
vector<int> result(n*n);
vector<int> answer(right - left + 1);
vector<vector<int>> v(n, vector<int>(n));
for (int y = 0; y < n; y++) {
for (int x = 0; x < n; x++) {
if (y > x) v[y][x] = y+1;
else v[y][x] = x+1;
}
}
int j = 0;
for (int i = 0; i < n * n; i++)
{
if (i > 0 && i % n == 0) j++;
result[i] = v[j][i%n];
}
for (long long i = left, j = 0; i <= right; i++, j++)
{ // 범위가 long long 타입이므로 반복문 변수도 맞춰줌.
answer[j] = result[i];
}
return answer;
}

 


 

두 번째 시도 - 시간초과

 

#include <string>
#include <vector>
using namespace std;
vector<int> solution(int n, long long left, long long right) {
vector<int> result(n*n);
vector<int> answer(right - left + 1);
int i = 0;
int j = 0;
for (int y = 0; y < n; y++) {
for (int x = 0; x < n; x++, i++) {
if (y > x) result[i] = y+1;
else result[i] = x+1;
if (left <= i && i <= right)
answer[j++] = result[i];
}
}
return answer;
}

 

 

 


 

정답 코드

 

#include <string>
#include <vector>
using namespace std;
vector<int> solution(int n, long long left, long long right) {
vector<int> answer(right - left + 1);
int j = 0;
for (long long i = left; i <= right; i++)
{
// y x x 2차원 배열이라 상상하면
int y = i / n; // y(세로)값은 i/n이다.
int x = i % n; // x(가로)값은 i%n이다.
// answer 1차원 배열에는 left~right 사이의 값만 담아주어야 하기 때문에
// 변수 j를 0부터 증가시키며 answer[0], answer[1], answer[2],...순서로 담는다.
// 문제 설정 상 시작값이 0이 아닌 1이기 때문에 +1을 해준다.
if (y > x) answer[j++] = y+1;
else answer[j++] = x+1;
}
return answer;
}