코딩테스트/기출

[월간 코드 챌린지 시즌3 / 프로그래머스] 87390번 : n^2 배열 자르기

ydin 2022. 9. 18. 19:29

- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/87390

 

나름 풀어본다고 고군분투했는데도 틀려서 답지 봤는데 풀이가 너무 짧아서 당황스럽네 

 

- 정답 풀이 

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

 

- 시도해본 풀이 

대부분 시간초과가 발생했다

def solution(n, left, right):
    matrix = [[0] * n for _ in range(n)]
    
    answer = []
    for k in range(n):
        for i in range(k + 1):
            for j in range(k + 1):
                if matrix[i][j] == 0:
                    matrix[i][j] = k + 1
    
    answer = []
    for i in range(n):
        for j in range(n):
            answer.append(matrix[i][j])
            
    return answer[left : right + 1]

 

45%까지는 맞았는데, 나머지는 시간초과 발생 

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

 

answer를 다 구하고 거기서 left ~ right를 구하기보다 

left가 속한 리스트, 그 사이의 리스트, right가 속한 리스트를 직접 구해서 진행했는데 60퍼센트까지 가서 멈췄다 

def solution(n, left, right):
    temp = [i for i in range(1, n + 1)]
    start_num = left // n
    end_num = right // n
    start = []
    end = []
               
    for _ in range(start_num + 1):
        start.append(start_num + 1)
    for i in range(start_num + 1, n):
        start.append(temp[i])
    
    mid = []
    for i in range(start_num + 1, end_num):
        for _ in range(i + 1):
            mid.append(i + 1)
        for j in range(i + 1, n):
            mid.append(temp[j])
    
    for _ in range(end_num + 1):
        end.append(end_num + 1)
    for i in range(end_num + 1, n):
        end.append(temp[i])

    answer = start[left % n : ] + mid + end[ : right % n + 1]
            
    return answer