반응형
https://school.programmers.co.kr/learn/courses/30/lessons/87390
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이 (1차 시도)
효율성 문제 때문에 어려운거 같다.
def solution(n, left, right):
# n x n 배열
# 1 2 3 4
# 2 2 3 4 [1, 0]
# 3 3 3 4 [2, 0] [2, 1]
# 4 4 4 4 [3, 0] [3, 1] [3, 2]
# 2차원 배열 선언하기
array = [[0 for j in range(n)] for i in range(n)]
for i in range(n):
for j in range(n):
if i > j:
array[i][j] = i + 1
else:
array[i][j] = j + 1
arrayOne = []
for j in array:
arrayOne += j
answer = arrayOne[left:right+1]
return answer
풀이 (2차 시도)
많이 괜찮아졌다
def solution(n, left, right):
# n x n 배열
# 1 2 3 4
# 2 2 3 4 [1, 0]
# 3 3 3 4 [2, 0] [2, 1]
# 4 4 4 4 [3, 0] [3, 1] [3, 2]
#모든 배열을 만드는게 시간이 걸린다...
#left 와 right의 제한이 있기때문에 그 부분만 알아내는 규칙 찾기
start = divmod(left, n)
end = divmod(right, n)
print(start)
print(end)
# 2차원 배열 선언하기
array = [[0 for j in range(n)] for i in range(n)]
for i in range(n):
if start[0] > i or end[0] < i:
continue
else:
for j in range(n):
if i > j:
array[i][j] = i + 1
else:
array[i][j] = j + 1
arrayOne = []
for j in array:
arrayOne += j
answer = arrayOne[left:right+1]
return answer
풀이 (3차 시도)
열심히 변경해봤는데 리스트로 2차 배열을 만드면 아무리 생각해도 효율성이 안좋은거 같다.
def solution(n, left, right):
# n x n 배열
# 1 2 3 4
# 2 2 3 4 [1, 0]
# 3 3 3 4 [2, 0] [2, 1]
# 4 4 4 4 [3, 0] [3, 1] [3, 2]
#모든 배열을 만드는게 시간이 걸린다...
#left 와 right의 제한이 있기때문에 그 부분만 알아내는 규칙 찾기
start = divmod(left, n)
end = divmod(right, n)
# 2차원 배열 선언하기
array = [[0] * n for _ in range(n)]
array1d = []
for i in range(start[0], end[0]+1):
for j in range(n):
if i > j:
array[i][j] = i + 1
else:
array[i][j] = j + 1
if start[0] == i:
array1d += array[i][start[1]:]
elif end[0] == i:
array1d += array[i][:end[1]+1]
else:
array1d += array[i]
return array1d
풀이 (4차 시도)
열심히 변경해봤는데 리스트로 2차 배열을 만드면 아무리 생각해도 효율성이 안좋은거 같다.
def solution(n, left, right):
# n x n 배열
# 1 2 3 4
# 2 2 3 4 [1, 0]
# 3 3 3 4 [2, 0] [2, 1]
# 4 4 4 4 [3, 0] [3, 1] [3, 2]
#모든 배열을 만드는게 시간이 걸린다...
#left 와 right의 제한이 있기때문에 그 부분만 알아내는 규칙 찾기
start = divmod(left, n)
end = divmod(right, n)
# 2차원 배열 선언하기
array = []
for i in range(n):
if start[0] > i or end[0] < i:
array.append([])
else:
list = []
for j in range(n):
list.append(0)
array.append(list)
array1d = []
for i in range(start[0], end[0]+1):
for j in range(n):
if i > j:
array[i][j] = i + 1
else:
array[i][j] = j + 1
if start[0] == i:
array1d += array[i][start[1]:]
elif end[0] == i:
array1d += array[i][:end[1]+1]
else:
array1d += array[i]
return array1d
풀이 (4차 시도)
효율성 때문에 쓸데없는 배열은 없애야 통과 할 수 있다
def solution(n, left, right):
#모든 배열을 만드는게 시간이 걸린다...
#left 와 right의 제한이 있기때문에 그 부분만 알아내는 규칙 찾기
start = divmod(left, n)
end = divmod(right, n)
#1 2 3 4
#2 2 3 4
#3 3 3 4
#4 4 4 4
# 2차원 배열 선언하기
array1d = []
for i in range(start[0], end[0]+1):
# 시작과 마지막이 같은 층일 때
if i == start[0] and i == end[0]:
for j in range(start[1], end[1]+1):
if i > j:
array1d.append(i + 1)
else:
array1d.append(j + 1)
# 시작 층 일 경우
elif i == start[0]:
for j in range(start[1], n):
if i > j:
array1d.append(i + 1)
else:
array1d.append(j + 1)
# 마지막 층 일 경우
elif i == end[0]:
for j in range(end[1]+1):
if i > j:
array1d.append(i + 1)
else:
array1d.append(j + 1)
# 시작과 마지막 층 사이 일 경우
else:
for j in range(n):
if i > j:
array1d.append(i + 1)
else:
array1d.append(j + 1)
return array1d
반응형
'코딩 테스트 > Programmers' 카테고리의 다른 글
[Python] [Level 2] 해시 위장 (Hash, Dictionary) ...Hash Table 처럼 풀기! (0) | 2023.03.01 |
---|---|
[Python] [Level 2] 기능 개발 (0) | 2022.11.05 |
[Python] [Level 2] 괄호 회전하기 (0) | 2022.11.03 |
[Python] [Level 2] 튜플 (0) | 2022.11.01 |
[Python] [Level 2] 행렬의 곱셈 (0) | 2022.10.31 |