본문 바로가기

프로그래머스 풀이

프로그래머스 2단계 - n^2 배열자르기 (Python)

깃허브:

https://github.com/MSIQOC/Programmers/blob/main/n%5E2%20%EB%B0%B0%EC%97%B4%EC%9E%90%EB%A5%B4%EA%B8%B0.py

 

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

 

코딩테스트 연습 - n^2 배열 자르기

정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다. n행 n열 크기의 비어있는 2차원 배열을 만듭니다. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다. 1행 1열부

programmers.co.kr

하아..... 구현은 제대로 했는데 테스트 케이스 12와 13에서 막혔었다.

처음에 예제로 나온 것들을 그림으로 그려봤을 때 배열의 숫자는 행과 열 중에서 더 숫자를 가진 것이 된다는걸 깨달았다. left와 right를 lefti, leftj, righti, rightj로 나눠서 (lefti, leftj) ~ (righti, rightj) 이렇게 answer에 append 되도록 설계했다.

첫시도

def solution(n, left, right):
    answer = [] 
    lefti = left//n
    leftj = left % n
    righti = right//n
    rightj = right % n
    print(lefti, leftj, righti, rightj)
    
    if righti == lefti:
        for i in range(leftj, rightj+1):
            answer.append(max(leftj, lefti) + 1)
        return answer   
    
    for j in range(leftj, n):
        answer.append(max(lefti, j) + 1)
        
    for i in range(lefti+1, righti):
        for j in range(n):
            answer.append(max(i, j) + 1)
    
    for j in range(0, rightj+1):
        answer.append(max(righti, j) + 1)

    return answer

무슨 이유 때문인지는 몰라도 전체 케이스의 60%만 맞고 나머지는 실패했다.

구글링으로 찾았을 때 코드를 자세히는 못봤지만 아주 짧게 짰다는 것을 발견했고 내가 짠 코드를 더 간소화 시킬 수 있는 방법을 찾아냈다.

두번째시도

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

어차피 모든 숫자는 i//n이 열이 되고 i%n이 행이 되기 때문에 굳이 lefti, leftj, righti, rightj로 나눌 필요가 없었던 것이다.

.....하지만 90%까지 달성하고 꼭 테스트케이스 12와 13에서 실패했다.

다른 사람들의 풀이를 봤을 때 내가 짠 코드와 다른 점이 없었고 심지어 다른 사람의 코드로 실행을 해봤을 때에도 테스트 케이스 12와 13에서 런타임 에러가 났다.


Python

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

.....하아.....밀려드는 허무함을 아는가....

left와 right가 long 형태여서 안됐던 것이였다.

left와 right+1을 int로 감싸주었더니 통과됐다.

앞으로 안되면 long타입을 int로 형변환 시켜주는걸 생각해봐야겠다.