[level 2] n^2 배열 자르기 - 87390
성능 요약
메모리: 469 MB, 시간: 891.30 ms
구분
코딩테스트 연습 > 월간 코드 챌린지 시즌3
채점결과
Empty
문제 설명
정수 n
, left
, right
가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
n
행n
열 크기의 비어있는 2차원 배열을 만듭니다.i = 1, 2, 3, ..., n
에 대해서, 다음 과정을 반복합니다.- 1행 1열부터
i
행i
열까지의 영역 내의 모든 빈 칸을 숫자i
로 채웁니다.
- 1행 1열부터
- 1행, 2행, ...,
n
행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다. - 새로운 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
입출력 예
n | left | right | result |
---|---|---|---|
3 | 2 | 5 | [3,2,2,3] |
4 | 7 | 14 | [4,3,3,3,4,4,4,4] |
입출력 예 설명
입출력 예 #1
- 다음 애니메이션은 주어진 과정대로 1차원 배열을 만드는 과정을 나타낸 것입니다.
입출력 예 #2
- 다음 애니메이션은 주어진 과정대로 1차원 배열을 만드는 과정을 나타낸 것입니다.
나의 틀린 풀이
패턴을 정형화하여 코드를 작성하였으나 시간초과 발생
1 ≤ n ≤ 10^7 n의 사이즈가 크기 때문에 n^2 시간복잡도로 작성하면 안될듯함.
def solution(n, left, right):
answer = []
lst = [i for i in range(1,n+1)]
for i in range(1,n+1):
for k in [i for j in range(i)]+lst[i:]:
answer.append(k)
return answer[left:right+1]
나의 맞은 풀이
반복을 줄이기 위해 직접 경우의 수를 따져서 상수로 값들을 처리했다(안좋은 코드)
import itertools
def solution(n, left, right):
temp = []
lst = [i for i in range(1,n+1)]
for i in range(left//n + 1,right//n +2):
temp.append([i for j in range(i)]+lst[i:])
temp[-1] = temp[-1][:right%n+1]
answer =list(itertools.chain(*temp))[left%n:]
return answer
다른 사람의 풀이
참 규칙을 잘 찾아낸 깔끔한 풀이라고 생각된다. right-left +1 만큼만 수행되므로 시간초과도 없을 것 같은 코드다.
def solution(n, left, right):
answer = []
for i in range(left,right+1):
answer.append(max(i//n,i%n)+1)
return answer
'알고리즘 문제 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 할인 행사- python[ 구현 ] (0) | 2023.09.17 |
---|---|
[프로그래머스] 이중우선순위큐 - python[ heap ] (0) | 2023.09.16 |
[프로그래머스] 괄호 회전하기 - python[ 문자열, 구현 ] (0) | 2023.09.16 |
[프로그래머스] 연속 부분 수열 합의 개수 - python[ BruteForce ] (0) | 2023.09.14 |
[프로그래머스] 모음 사전- python[ Permutation ] (0) | 2023.09.13 |