코딩테스트

[JS] n^2 배열 자르기

미안하다 강림이 좀 늦었다 2023. 12. 6. 22:25

 

 

난이도: Lv.2

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

 

프로그래머스

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

programmers.co.kr

 

 

알고리즘

빨간색 칸이 left에 해당하는 칸이고 파란색 칸이 right에 해당하는 칸이다. 첫 번째 for문에서는 left가 위치한 행에 있는 원소 중 left 위치의 열부터 행의 끝까지 push 한다.

두 번째 for문에서는 행 안에 있는 모든 원소를 push 한다.

세 번째 for문에서는 right가 위치한 행의 첫 원소부터 right 위치의 열까지 push 한다.

 

 

 

 

위의 논리로는 left와 right가 같은 행에 위치하면 올바른 결과를 얻을 수 없다. 따라서 동일한 행에서 left 위치의 열부터 right 위치의 열까지 push 해준다.

 

 

 

코드

function solution(n, left, right) {
    var answer = [];
    const startRow = Math.floor(left / n) + 1;
    const startCol = left % n + 1;
    const endRow = Math.floor(right / n) + 1;
    const endCol = right % n + 1;

    if (startRow !== endRow) {
        for (let i = startCol; i <= n; i++) {
            answer.push(Math.max(startRow, i));
        }
        for (let i = startRow + 1; i <= endRow - 1; i++) {
            for (let j = 1; j <= n; j++) {
                answer.push(Math.max(i, j));
            }
        }
        for (let i = 1; i <= endCol; i++) {
            answer.push(Math.max(endRow, i));
        }
    } else {
        for (let i = startCol; i <= endCol; i++) {
            answer.push(Math.max(startRow, i));
        }
    }

    return answer;
}

 

 

주저리

left 행이랑 right 행이 같을 경우 생각 못하고 멍하니 있다가 질문하기 보고 깨닫고 고쳤더니 잘 돌아갔다. 다들 코드가 간단하던데 논리는 비슷하니까 이 코드도 괜찮...지...않을까.....