난이도: Lv.2
문제: https://school.programmers.co.kr/learn/courses/30/lessons/87390
알고리즘
빨간색 칸이 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 행이 같을 경우 생각 못하고 멍하니 있다가 질문하기 보고 깨닫고 고쳤더니 잘 돌아갔다. 다들 코드가 간단하던데 논리는 비슷하니까 이 코드도 괜찮...지...않을까.....
'코딩테스트' 카테고리의 다른 글
[JS] H-Index (0) | 2023.12.08 |
---|---|
[JS] 할인 행사 (1) | 2023.12.08 |
[JS] 괄호 회전하기 (0) | 2023.12.05 |
[JS] 연속 부분 수열 합의 개수 (0) | 2023.12.04 |
[JS] 귤 고르기 (1) | 2023.12.02 |