본문 바로가기
코딩테스트/[python]프로그래머스

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

by o_oo 2022. 4. 13.

서론

없음.


문제

 

코딩테스트 연습 - 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 함수를 완성해주세요.

 

제한사항
  • 1 ≤ n ≤ 107
  • 0 ≤ left  right < n2
  • right - left < 105

나의 풀이

# 1차 실패
def solution(n, left, right):
    return [i%n+1 if i//n<i%n else i//n+1 for i in range(left, right+1)]

# 2차 실패
def solution(n, left, right):
    return [max(i%n+1, i//n+1) for i in range(left, right+1)]

파이썬이란 언어에 대한 무지로 해매며 조금을 구글링을 첨가해서 풀었다.(내가 온전히 푼건 아니지만 참고하시길...)

 

1차에서는 결과는 맞게 나오나 2개의 테스트케이스에서 런타임 에러가 발생하였다. 처음엔 for loop가 원인이었나 싶으면서 조금의 구글링으로 문제의 수학 공식을 알게 되었다. 바로 행, 열 번호 중 큰 값이 출력값이라는 것이다.(단순하지만 혼자선 발견 못한 나란놈...) 그래서 max()를 사용하여 코드를 수정하였으나 2차 실패가 나왔다.

 

동일한 테스트 케이스에서 런타임 에러. 아무래도 큰 값 입력 때문이겠거니해서 또 for loop가 문제인가 싶었다.(발전이 없구만...) 아무튼 다시 구글링으로 알아보니 overflow가 원인이었나 싶다. 파이썬에서는 자료형을 사용하지 않다보니 생각하지 못하였다.

# 통과
def solution(n, left, right):
    return [max(i%n, i//n)+1 for i in range(int(left), int(right)+1)]

런타임 에러를 발생시키는 left와 right가 아무래도 overflow를 일으킬 정도로 큰 값인가 보다.

그래서 두 값을 int()로 감싸주니 통과가 되었다.

 

이건 파이썬의 자료형과 파이썬의 overflow에 관해 내가 더 공부해봐야겠다. 따라서 공부가 되고 내용이 정리되면 이 글에 내용을 더 붙여 수정해야겠다. 끝.


+ 피드백과 새로운 풀이 방법은 언제든지 환영입니다!

댓글