프로그래머스_n^2배열자르기

임정민·2023년 9월 20일
1

알고리즘 문제풀이

목록 보기
105/173
post-thumbnail

프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

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

[나의 풀이]

⌛ 시간초과 (55/100 점)


def solution(n, left, right):
    from collections import deque

    arr = deque([])
    can_stop = False

    for i in range(1,n+1):
        for j in range(i,n+1):
            if i==j:
                for k in range(1,i+1):
                    arr.append(j)
            else:
                arr.append(j)

            if len(arr)>=right+1:
                can_stop=True
                break
        if can_stop:
            break

    answer = list(arr)[left:right+1]

    return answer

규칙을 가진 2차원 배열에서 특정값들을 추출하는 문제입니다. 수의 패턴을 파악하는 것이 핵심인 문제였습니다. 2차원 배열을 구현하기 위해 위와 같이 2중 for문을 사용한 뒤 right갯수만큼 카운트 되었을 때 종료하여 값을 추출하는 방식으로 구현에는 성공하였지만 절반 정도의 케이스에서 시간 초과가 나 다른 풀이를 참고하였습니다.🐆🐆🐆

[다른사람의 풀이1]


def solution(n, left, right):
    answer = []

    for i in range(left, right + 1):
        answer.append(max(i // n, i % n) + 1)

    return answer

예상과 다르게 하나의 for문으로 해결한 풀이였습니다. 문제에서 입력되는 n만큼 2차원 배열이 생성되고 이에 따라 조건에 맞는(left,right) 특정값들이 결정되므로 n과 left,right 간의 수식을 구하여 해결할 수 있는 문제였습니다.
left ~ right 사이값들에서 n으로 나눴을 때의 몫과 나머지 중 큰 값이 답을 구해내는 수식이였습니다.🐺🐺🐺

[다른사람의 풀이2]


def solution(n, left, right):
    return [max(divmod(i,n))+1 for i in range(left,right+1)]

같은 원리로 구현한 풀이이되 몫과 나머지를 구하기 위해 간단히 divmod()를 적용한 방식이였습니다.

감사합니다.

profile
https://github.com/min731

0개의 댓글