티스토리 뷰

https://programmers.co.kr/learn/courses/30/lessons/87390

 

코딩테스트 연습 - n^2 배열 자르기

정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다. n행 n열 크기의 비어있는 2차원 배열을 만듭니다. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다. 1행 1열부

programmers.co.kr

 

문제 설명

 

정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.

  1. n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
  2. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
    • 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
  3. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
  4. 새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.

정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.

 


 

문제 풀이

문제에서 주어진 조건을 구현하며 따라가다 보면 쉽게 구현할 수 있는데 제한 조건을 보게 되면 n의 크기가 최대 10^7이기 때문에 이중 for문을 사용해서는 절대 문제를 해결할 수 없다.

 

그러므로 문제에서 규칙을 찾는 것이 중요하다. n이 3, 4, 5일 때를 그려보면 특정한 규칙이 보이는 것을 알 수있다. 해당 숫자가 위치한 자리의 x축 y축 좌표를 구해서 둘 중 더 큰 좌표값을 기준으로 +1을 하게되면 해당 자리에서의 값을 알 수 있다. 문제를 그려보지 않고 규칙을 찾기는 굉장히 힘들 것 같다 !

 

프로그래머스 채점 시스템에서 약간의 오류가 있는 것 같다. TC 12,13번이 계속해서 런타임 에러가 발생하는데 반복문을 도는 과정에서 left와 right에 int로 명확하게 형 변환을 시켜주면 테스트 케이스가 통과한다.

 

def solution(n, left, right):
    answer = []

    for num in range(int(left), int(right)+1):
        i, j = num // n, num % n
        
        cnt = max(i,j) + 1
        answer.append(cnt)

    return answer
댓글