[Programmers]n^2 배열 자르기

김토리·2024년 10월 7일

알고리즘

목록 보기
22/27

  1. 이 문제는 규칙을 찾으면 쉽게 느껴지는 문제이다.
    (나 또한 처음에는 굉장히 어렵게 느껴졌으나 규칙이 보이는 것 같아 공책을 펴서 직접 한 번 그려보고 규칙을 찾아냈다.)

  2. 제한사항에 자료형 선택 및 코드짜는 데에 힌트가 있다.

  • n의 입력 범위가 1 ≤ n ≤ 10^7 이기 때문에 배열을 모두 채운 후 구하는 방법이 아니라는 점 (left ~right 사이만 구해야함)
  • i를 int로 캐스팅하면 시간 초과가 나므로 long long으로 초기화한다.

=>left번째 원소부터 right번째 원소까지 출력한다.

  • m번째 줄의 num번째 원소라고 가정했을 때, m보다 num이 크거나 같으면 해당 원소의 값은 m, 그렇지 않으면 num이다.
#include <string>
#include <vector>

using namespace std;

vector<int> solution(int n, long long left, long long right) {
    vector<int> answer;
    int j ;
    for(long long i = left;i <= right;i++){
          j  = (i%n);
          int num = (i/n) <= j ?j+1 : (i/n)+1  ;
            answer.push_back(num);
    }
    return answer;
}

더욱 간략하게 코드를 짜려고 한다면 위에서 j 변수는 선언할 필요가 없긴하다.

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int n, long long left, long long right) {
    vector<int> answer;
    
    for(long long i = left;i <= right;i++){
          int num = (i/n) <= (i%n)  ?(i%n)+1 : (i/n)+1  ;
            answer.push_back(num);
    }
    return answer;
}

또한 다른 사람들의 풀이를 참고했을 때, 삼항 연산자가 아닌 max함수를 이용한 사례도 보았다.

ex) int num = max((i%n)+1 , (i/n)+1 );
또는 answer.push_back(max((i%n)+1 , (i/n)+1 ));

최종적으로 아래와 같은 코드가 가능하다.

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int n, long long left, long long right) {
    vector<int> answer;
    
    for(long long i = left;i <= right;i++){
            answer.push_back(max((i%n)+1 , (i/n)+1 ));
    }
    return answer;
}
profile
웹 개발하며 데이터 분석, AI 공부하는 jinveloper

0개의 댓글