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