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



Programmers - [월간 코드 챌린지 시즌3] n^2 배열 자르기




사용 언어 - C++

소요 시간 - 약 46분




문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/87390




문제 요약

  1. 정해진 규칙에 따라 채워진 n x n의 배열이 있음
  2. 행 단위로 잘라 이어붙여 1차원 배열로 변환
  3. 주어진 left부터 right열의 원소만 남기고 지우기
  4. 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);   }   ```
    




풀이 절차

  1. vector[row][col]이라고 가정 했을 때, vector[row][col]의 값은 row + 1과 col + 1 중 큰 값이 들어감
  2. 배열을 잘라서 return 한다는 것은 곧, 처음부터 잘린 배열을 return 하는 것과 동일
  3. left 부터 시작해서 right로 끝나는 경우에 left와 right 위치에 해당하는 값을 어떻게 넣어줄 지 고민
  4. row는 i를 n으로 나누고, 0부터 시작하기에 +1을 해주면 올바른 값이 들어가고, col은 i를 n으로 나눈 나머지에 1을 더해주면 올바른 값이 들어감




문제 풀이 후 소감

  • 코드 자체는 간단한데 시간이 굉장히 오래 걸렸다. 불필요한 과정을 생각하게 되는 것도 그렇고, 중간 과정에 있어 너무 주어진 대로만 코드를 작성하려고 해서 그런 것 같았다. 앞으로는 중간 과정을 어떻게 줄일지도 고민해봐야겠다.