n^2 배열 자르기

최민수·2023년 3월 27일
0

알고리즘

목록 보기
42/94
def solution(n, left, right):
    answer = []
    
    # left, right으로 시작과 끝의 행,열 정보 알아내기
    qs, rs = left // n, left % n
    qe, re = right // n, right % n
    
    for rowNum in range(qs, qe+1):
        # 특정 열의 요소
        rowItems = []
        for k in range(rowNum+1):
            rowItems.append(rowNum+1)
        for item in range(rowNum+2, n+1):
            rowItems.append(item)
        
        # 조건에 맞게 추가
        if rowNum == qs == qe:
            answer.extend(rowItems[rs:re+1])
            continue
        if rowNum == qs:
            answer.extend(rowItems[rs:])
        elif rowNum == qe:
            answer.extend(rowItems[:re+1])
        else:
            answer.extend(rowItems)
    
    return answer

문제를 보면 단순 노가다 후 문자열 처리를 하는 문제가 아님은 감이 온다.

조금만 생각해보면, 2차원 배열은 눈 속임이고 n*n 배열에서 시작과 끝 지점을 n으로 나눈 몫과 나머지에 관한 규칙이 있음을 캐치할 수 있다.

그래서 나는 위 코드같이 짰는데, 아래 코드는 다른 사람이 푼 코드 중에서 정말 대단하다고 생각한 로직이다. 이 사람은 한 발자국 더 나아가서 숫자들의 배치 규칙을 알아내 이용했다.

숫자들의 배치를 잘 보면 정사각형 왼쪽 위에서 오른쪽 아래 대각선을 기준으로 숫자 배치의 규칙성을 알아챌 수 있는데, 이는 몫과 나머지 중 큰 수+1 이라는 속성을 가지고 있음을 도출할 수 있다. 즉, max(item/n, item%n)+1 이 쓰여진 숫자인 것이다.

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

그렇게 하면 이렇게 짧고 간결한 로직의 코드를 짤 수 있다. 아주 훌륭하다.


프로그래머스 연습문제, https://school.programmers.co.kr/learn/courses/30/lessons/87390

profile
CS, 개발 공부기록 🌱

0개의 댓글