/ [프로그래머스][C++]n^2배열 자르기
본문 바로가기
코테준비/수학적 알고리즘

[프로그래머스][C++]n^2배열 자르기

by sayho98 2023. 2. 10.

[문제 출처]

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

1. 문제

설명

정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.

  1. n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
  2. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
    • 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
  3. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
  4. 새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.

정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ n ≤ 107
  • 0 ≤ left  right < n2
  • right - left < 105

입출력 예

n left right result
3 2 5 [3,2,2,3]
4 7 14 [4,3,3,3,4,4,4,4]

2. 설명

 문제를 읽고 바로 하라는대로 2차원 배열을 만든후 구현해보았으나 시간초과가 떴습니다. 따라서 규칙성을 생각해 보았는데

 

1 (1| 1,1)  2 (2| 1,2)  3 (3| 1,3)
2 (4| 2,1)  2 (5| 2,2)  3 (6| 2,3)
3 (7| 3,1)  3 (8| 3,2)  3 (9| 3,3)

 

 2차원으로 생각해보았을때 x,y좌표중 큰좌표의 값을 따라간다는 것을 알 수 있었습니다. 
따라서 1차원 좌표를 2차원 좌표를 변환하기위한 연산을 활용하였고 비교하여 큰값을 벡터에 넣었습니다.

 

 잘 마무리 되었다고 생각했으나 16번부터 시간초과 오류가 발생했습니다. 아무리 고쳐도 해결하지 못했었는데 원인은 아주 간단했습니다. left~right의 값을 담는 변수의 크기 문제였습니다. int -> long long으로 바꾸어 완료하였습니다.

3. 코드

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

vector<int> solution(int n, long long left, long long right) {
    vector<int> answer;
 
    int y,x;
    
    for(long long i=left; i<=right; i++){
        y=i/n+1;
        x=i%n+1;
        if(y>=x)
            answer.push_back(y);
        else
            answer.push_back(x);
    }
    
    return answer;
}
반응형

댓글