
이 문제는 규칙을 찾으면 쉽게 느껴지는 문제이다.
(나 또한 처음에는 굉장히 어렵게 느껴졌으나 규칙이 보이는 것 같아 공책을 펴서 직접 한 번 그려보고 규칙을 찾아냈다.)
제한사항에 자료형 선택 및 코드짜는 데에 힌트가 있다.
=>left번째 원소부터 right번째 원소까지 출력한다.
#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;
}