[문제 출처]
https://school.programmers.co.kr/learn/courses/30/lessons/87390
1. 문제
설명
정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
- n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
- i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
- 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
- 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
- 새로운 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;
}
반응형
'코테준비 > 수학적 알고리즘' 카테고리의 다른 글
[프로그래머스][C++][42746] 가장 큰 수 (0) | 2023.02.22 |
---|---|
[프로그래머스][C++][12913] 땅따먹기 (0) | 2023.02.20 |
[프로그래머스][C++] 멀리 뛰기 (0) | 2023.02.01 |
[프로그래머스][C++] 점프와 순간 이동 (0) | 2023.02.01 |
[프로그래머스][c++] 예상 대진표 (0) | 2023.01.31 |
댓글