본문 바로가기

CS/알고리즘

[230421] n^2 배열 자르기

반응형

 

문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이

첫 풀이

규칙을 찾아보고자 직접 나열해봤다.

// 1
// 1 2 2 2
// 1 2 3 2 2 3 3 3 3
// 1 2 3 4 2 2 3 4 3 3 3 4 4 4 4 4
// 1 2 3 4 5 2 2 3 4 5 3 3 3 4 5 4 4 4 4 5 5 5 5 5 5ㅊ

첫 번째는 1~n

두 번째는 2가 2개, 이후 숫자들 1개씩

세 번째는 3이 3개, 이후 숫자들 1개씩

네 번째는 4가 4개, 이후 숫자들 1개씩

 

function solution(n, left, right) {
    let answer = [];
    
    for(let i = 1; i <= n; i++) {
        for(let j = i; j <= n; j++) {  
            answer.push(...new Array(i === j ? i : 1).fill(j));
        }
    }
    return answer.slice(left, right + 1) 
}
  1. answer 배열에 위의 규칙에 맞는 값들을 넣는다.
  2. left 부터 right +1 까지 slice 한 값을 반환한다.

 

제출하니 싹다 런타임 에러가 발생한다. (으악)

2, 3, 12~20 런타임 에러 발생

 

 

오늘도 어김없이 질문하기의 힘을 빌렸다

 

배열을 아예 싹다 만들면 안된다. 규칙을 파악하고, 필요한 부분만 만들어야 한다.

 

두 번째 풀이

function solution(n, left, right) {
    let answer = [];
    
    for(let i = parseInt(left / n) + 1; i <= parseInt(right / n) + 1; i++) {
        for(let j = i; j <= n; j++) {
            answer.push(...new Array(i === j ? i : 1).fill(j));
        }
    }
    return answer.slice(left % n, answer.length - n + 1 + right % n);
}

left와 right가 각 해당하는 row, column을 구하고, 해당 줄의 배열만 구한다.

그리고 해당 left와 right가 각 줄의 몇 번째 인덱스인지 고려하여 배열을 자른다.

 

몇 번째 줄인지는 parseInt(left / n) 이고,

그 줄의 몇 번째 인덱스에 해당하는지는 left % n 로 구할 수 있다.

(숫자는 1부터 시작하므로, 첫 번째 for 문에서 + 1 해준다)

 

이렇게 하면 앞엔 맞는데, 여전히 뒤의 테스트는 런타임 에러로 실패한다.

15, 17~20 실패

 

 

세 번째 풀이

배열 범위를 left부터 right까지만 구해야 한다. 그러면 각 배열에 맞는 수를 어떻게 구할 수 있냐.

  0 1 2 3 4 x

0 1 2 3 4 5

1 2 2 3 4 5

2 3 3 3 4 5

3 4 4 4 4 5

4 5 5 5 5 5

y

x, y표로 작성해서 살펴봤다. 그러니까

몫과 나머지 중 큰 값 + 1 을 하면 배열에 맞는 수가 된다. 그래서,

function solution(n, left, right) {
    let answer = [];
    
    for(let i = left; i <= right; i++) { 
        answer.push(Math.max(parseInt(i/n), i % n) + 1)
    }
    return answer;
}

 

끝! 어렵다 ...

반응형

'CS > 알고리즘' 카테고리의 다른 글

[230422] 소수 찾기  (0) 2023.04.21
[230421] 모의고사  (0) 2023.04.21
[230421] 위장  (0) 2023.04.21
[230420] 캐시  (0) 2023.04.20
[230419] 괄호 회전하기  (0) 2023.04.19