Programmers / n^2 배열 자르기 / Python 파이썬

2022. 5. 18. 18:28·coding test - python/Programmers
728x90
반응형

 

*문제 출처는 프로그래머스에 있습니다.

문제 제목: n^2 배열 자르기 (2단계) 

 

문제 사이트: https://programmers.co.kr/learn/courses/30/lessons/87390

 

문제 설명

정수 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

입출력 예nleftrightresult
3 2 5 [3,2,2,3]
4 7 14 [4,3,3,3,4,4,4,4]

입출력 예 설명

입출력 예 #1

  • 다음 애니메이션은 주어진 과정대로 1차원 배열을 만드는 과정을 나타낸 것입니다.


Numpy를 활용한 풀이

나의 풀이

*시간 복잡도와 공간 복잡도를 고려하지 않은 순수 라이브러리 활용 풀이입니다!!!!

 

일단 처음에 넘파이를 이용해서 문제를 풀 수있을 거 같아서 풀어봤다!

 

import numpy as np

def solution(n,left,right):
    A = np.ones((n,n), dtype = int)

    for i in range(n,0,-1):
        for j in range(i):
            for k in range(j):
                A[k][j] = i
                A[j][k] = i

    for i in range(n):
        A[i][i] = i+1

    arr = A.flatten()
    return arr[left:right+1]
n = int(input())
left = int(input())
right = int(input())
print(solution(n,left,right))

 

1. A 행렬을 만들어서 np.ones 를 통해 nXn 행렬을 만들어준다! 그러면 nXn 행렬에 1이 채워져서 저장이된다.

A = np.ones((n,n), dtype = int)

2.  문제의 그림대로 행렬에 숫자를 저장한다.

for i in range(n,0,-1):
    for j in range(i):
        for k in range(j):
            A[k][j] = i
            A[j][k] = i

for i in range(n):
    A[i][i] = i+1

이렇게 중첩 for문을 통하여 그림과 똑같이 행렬을 만들어주었다.

3. 넘파이 라이브러리의 flatten 을 이용하여 벡터로 변환한다.

    arr = A.flatten()

 

벡터로 변환한 모습

    return arr[left:right+1]

최종적으로  left와 right 범위만큼 반환한다

그림에서 요구하는 결과값과 같은 것을 볼 수 있다.
근데 실행이 안된다........!!!!

 

실행이 안되는 이유는 바로, 넘파이로 저장된 1차원 벡터가 리스트의 형태로 출력이 되지 않아서이다.

따라서 이 벡터를 1차원 리스트로 변환해야한다.

    arr = A.flatten()
    answer = arr[left:right+1].tolist()

리스트로바꿀어레이.tolist() 함수를 이용해서 리스트로 변환시켜주면 된다! ㅎㅎ

올바르게 출력된 모습

최종 풀이

import numpy as np

def solution(n,left,right):
    A = np.ones((n,n), dtype = int)

    for i in range(n,0,-1):
        for j in range(i):
            for k in range(j):
                A[k][j] = i
                A[j][k] = i

    for i in range(n):
        A[i][i] = i+1

    arr = A.flatten()
    answer = arr[left:right+1].tolist()
    return answer

이렇게 풀면 테스트는 풀리지만, 최종 채점에는 런타임에러가 난다 ㅠ,ㅠ

아무래도 라이브러리를 가져와서 풀어서 연산 시간이 오래걸리는거 같다.

 

 

다른 풀이 (규칙 이용)

def solution(n, left, right):
    answer = []
    
    for i in range(left, right+1):
        answer.append(max(divmod(i, n)) + 1)

    return answer
 
print(solution(3, 2, 5)) # [3,2,2,3]

[1, 2, 3, 4, ...]

[2, 2, 3, 4, ...]

[3, 3, 3, 4, ...]

[4, 4, 4, 4, ...]

.

.

.

 

로 진행하는 배열로 규칙을 찾아서 구해주면 된다.

위치를 i 라고 한다면 i 를 n 으로 나누면 i 에 해당하는 행과 열을 구할 수 있다.

위의 규칙으로 봤을 때 해당하는 행과 열의 위치에 있는 값은 max(행, 열) + 1 이라고 할 수 있다. 

 

 

728x90
반응형

'coding test - python > Programmers' 카테고리의 다른 글

Programmers / 프린터 / Python 파이썬 - 작성중  (0) 2022.05.20
Programmers / 주식 가격 / Python 파이썬  (0) 2022.05.19
Programmers / 소수 찾기 / Python 파이썬  (0) 2022.05.13
Programmers / 가장 큰 수 / Python 파이썬  (0) 2022.05.13
Programmers / 숫자의 표현 / Python 파이썬  (0) 2022.05.11
'coding test - python/Programmers' 카테고리의 다른 글
  • Programmers / 프린터 / Python 파이썬 - 작성중
  • Programmers / 주식 가격 / Python 파이썬
  • Programmers / 소수 찾기 / Python 파이썬
  • Programmers / 가장 큰 수 / Python 파이썬
sillon
sillon
꾸준해지려고 합니다..
    반응형
  • sillon
    sillon coding
    sillon
  • 전체
    오늘
    어제
    • menu (614)
      • notice (2)
      • python (68)
        • 자료구조 & 알고리즘 (23)
        • 라이브러리 (19)
        • 기초 (8)
        • 자동화 (14)
        • 보안 (1)
      • coding test - python (301)
        • Programmers (166)
        • 백준 (76)
        • Code Tree (22)
        • 기본기 문제 (37)
      • coding test - C++ (5)
        • Programmers (4)
        • 백준 (1)
        • 기본기문제 (0)
      • 공부정리 (5)
        • 신호처리 시스템 (0)
        • Deep learnig & Machine lear.. (41)
        • Data Science (18)
        • Computer Vision (17)
        • NLP (40)
        • Dacon (2)
        • 모두를 위한 딥러닝 (강의 정리) (4)
        • 모두의 딥러닝 (교재 정리) (9)
        • 통계 (2)
      • HCI (23)
        • Haptics (7)
        • Graphics (11)
        • Arduino (4)
      • Project (21)
        • Web Project (1)
        • App Project (1)
        • Paper Project (1)
        • 캡스톤디자인2 (17)
        • etc (1)
      • OS (10)
        • Ubuntu (9)
        • Rasberry pi (1)
      • App & Web (9)
        • Android (7)
        • javascript (2)
      • C++ (5)
        • 기초 (5)
      • Cloud & SERVER (8)
        • Git (2)
        • Docker (1)
        • DB (4)
      • Paper (7)
        • NLP Paper review (6)
      • 데이터 분석 (0)
        • GIS (0)
      • daily (2)
        • 대학원 준비 (0)
      • 영어공부 (6)
        • job interview (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    programmers
    Python
    백준
    소수
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
sillon
Programmers / n^2 배열 자르기 / Python 파이썬
상단으로

티스토리툴바