[프로그래머스] n^2 배열 자르기
Programmers - [월간 코드 챌린지 시즌3] n^2 배열 자르기
사용 언어 - C++
소요 시간 - 약 46분
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/87390
문제 요약
- 정해진 규칙에 따라 채워진 n x n의 배열이 있음
- 행 단위로 잘라 이어붙여 1차원 배열로 변환
- 주어진 left부터 right열의 원소만 남기고 지우기
- arr[left] ~ arr[right] 배열 return
최종 코드
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int n, long long left, long long right) {
vector<int> answer;
long long row, col;
for(long long i = left; i <= right; i++)
{
row = i / n + 1;
col = i % n + 1;
long long temp = row > col ? row : col;
answer.push_back(temp);
}
return answer;
}
트러블 슈팅
- 순서대로 생각하다보니 처음에 2차원 배열을 만들고 이를 다시 행 단위로 잘라 1차원 배열로 만드려고 해서 꽤 많은 시간을 소모
- 중간 과정을 줄이는 연습을 하는 것도 좋을 것 같음 → 코드 상에 문제가 없고, 올바른 과정을 통해 도출된 식이라면 중간 과정을 대체할 수 있다는 걸 깨달음
- 처음에 변수들의 자료형을 int로 선언했는데, 시간 초과가 발생
- 아무래도 변수 타입 오버플로우가 발생해서 시간 초과가 발생하는 듯 하여 변수들의 자료형을 다시 주어진 left와 right 처럼 long long 타입으로 선언 후 해결 ```cpp int row, col;
for(int i = left; i <= right; i++) { row = i / n + 1; col = i % n + 1;
int temp = row > col ? row : col; answer.push_back(temp); } ```
풀이 절차
- vector[row][col]이라고 가정 했을 때, vector[row][col]의 값은 row + 1과 col + 1 중 큰 값이 들어감
- 배열을 잘라서 return 한다는 것은 곧, 처음부터 잘린 배열을 return 하는 것과 동일
- left 부터 시작해서 right로 끝나는 경우에 left와 right 위치에 해당하는 값을 어떻게 넣어줄 지 고민
- row는 i를 n으로 나누고, 0부터 시작하기에 +1을 해주면 올바른 값이 들어가고, col은 i를 n으로 나눈 나머지에 1을 더해주면 올바른 값이 들어감
문제 풀이 후 소감
- 코드 자체는 간단한데 시간이 굉장히 오래 걸렸다. 불필요한 과정을 생각하게 되는 것도 그렇고, 중간 과정에 있어 너무 주어진 대로만 코드를 작성하려고 해서 그런 것 같았다. 앞으로는 중간 과정을 어떻게 줄일지도 고민해봐야겠다.