반응형
문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/77485
문제 풀이 힌트
01. 2차원 배열 생성
02. 그 배열에다가 숫자를 1부터 차례대로 삽입
03. 해당 사각형 범위에 있는 숫자들을 이동 순서(위, 오른쪽, 아래, 왼쪽)대로 stack에 넣는다
- 여기서 제일 작은 값을 구할 것.
- 이 값들을 이용해서 arr값을 채울 것.
04. stack의 맨 뒤에 있는 값을 제일 앞으로 빼준다. (5번에서 arr 값 채울 건데 arr[x1][y1]의 값부터 채울거니까 그 이전값을 맨 앞으로 배치해야함)
05. arr에 차례대로 stack의 값을 채운다.
문제 풀이 코드
function solution(rows, columns, queries) {
const answer = [];
//2차원 배열 생성한다. (헷갈리지 않게 idx를 1부터 세고 싶어서 가로세로 + 1씩함)
let arr = Array.from(new Array(rows +1), () => new Array(columns + 1).fill(0))
for(let i=1; i<=rows; i++){ //생성한 2차원 배열에다가 1부터 차례대로 값을 넣어줌
for(let j=1; j<=columns; j++){
arr[i][j] = (i-1) * columns +j
}
}
for(let tc = 0; tc<queries.length; tc++){
const [x1, y1, x2, y2] = queries[tc]; //x1 = 왼쪽 위 세로, y1=왼쪽 위 가로, x2=오른쪽 아래 세로, y2= 오른쪽 아래 가로
const stack = [];
//현재 범위 내에 있는 모든 값들을 이동 순서대로 (위, 오른쪽, 아래, 왼쪽) stack에 넣는다.
for(let i= y1; i<y2; i++) stack.push(arr[x1][i]); //위
for(let i= x1; i<x2; i++) stack.push(arr[i][y2]); //오른쪽
for(let i= y2; i>y1; i--) stack.push(arr[x2][i]); //아래
for(let i= x2; i>x1; i--) stack.push(arr[i][y1]); //왼쪽
answer.push(Math.min(...stack)); //그 숫자들 중 가장 작은 값 answer에 push
const temp = stack.pop(); //arr[x1][y1]을 채울 값
stack.unshift(temp); //이 값을 stack 맨 앞에 세팅 (아래 반복문에서 arr[x1][y1]부터 채울것임)
//arr에 값을 채운다. stack에 순서대로 값이 있음.
for(let i=y1; i<y2; i++) arr[x1][i] = stack.shift();
for(let i=x1; i<x2; i++) arr[i][y2] = stack.shift();
for(let i=y2; i>y1; i--) arr[x2][i] = stack.shift();
for(let i=x2; i>x1; i--) arr[i][y1] = stack.shift();
}
return answer;
}
Only 풀이 코드
function solution(rows, columns, queries) {
const answer = [];
let arr = Array.from(new Array(rows +1), () => new Array(columns + 1).fill(0))
for(let i=1; i<=rows; i++){
for(let j=1; j<=columns; j++){
arr[i][j] = (i-1) * columns +j
}
}
for(let tc = 0; tc<queries.length; tc++){
const [x1, y1, x2, y2] = queries[tc];
const stack = [];
for(let i= y1; i<y2; i++) stack.push(arr[x1][i]);
for(let i= x1; i<x2; i++) stack.push(arr[i][y2]);
for(let i= y2; i>y1; i--) stack.push(arr[x2][i]);
for(let i= x2; i>x1; i--) stack.push(arr[i][y1]);
answer.push(Math.min(...stack));
const temp = stack.pop();
stack.unshift(temp);
for(let i=y1; i<y2; i++) arr[x1][i] = stack.shift();
for(let i=x1; i<x2; i++) arr[i][y2] = stack.shift();
for(let i=y2; i>y1; i--) arr[x2][i] = stack.shift();
for(let i=x2; i>x1; i--) arr[i][y1] = stack.shift();
}
return answer;
}
알고가는 ppoint
나의 틀린 풀이 코드
function solution(rows, columns, queries) {
let answer = [];
let graph = Array.from({length: rows}, () => new Array(columns).fill(0));
for(let i=0; i<rows; i++){
for(let j=0; j<columns; j++){
graph[i][j] = (i * columns + j+1)
}
}
for(let query of queries){
let [y1,x1,y2,x2] = query.map(v=> v-1);
let temp1 = graph[y1][x1];
let temp2 = graph[y1][x2];
let temp3 = graph[y2][x1];
let temp4 = graph[y2][x2];
let min = Number.MAX_SAFE_INTEGER;
for(let j=columns; j>=0; j--){
if(j >= x1 && j < x2){
graph[y1][j+1] = graph[y1][j]
if(min > graph[y1][j]) min = graph[y1][j]
}
}
for(let j=0; j<columns; j++){
if(j <= x2 && j > x1){
graph[y2][j] = graph[y2][j+1]
if(min > graph[y2][j+1]) min = graph[y2][j+1]
}
}
for(let i=rows; i>=0; i--){
if(i => y1 && i < y2){
graph[i+1][x2] = graph[i][x2]
if(min > graph[i][x2]) min = graph[i][x2]
}
}
for(let i=0; i<=rows; i++){
if(i <= y2 && i > y1 ){
graph[i+1][x1] = graph[i][x1]
if(min > graph[i][x1]) min = graph[i][x1]
}
}
answer.push(min);
}
return answer;
}
//그림 확인
//rows * columns (세로 (행), 가로(열))
//1~rows*colums
//직사각형 범위 선택 후 테두리 부분 숫자를, 시계방향으로 회전
//중간 숫자는 회전 안함.
//회전들 목록 queries
//return:위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아
//2차원 배열 생성 및 숫자 채우기
//queries에 따라 직사각형 확정 [5,1,6,3] 세로-1 가로-1, 세로-1 가로-1 => [4,0,5,2] y1,x1,y2,x2
//직사각형에 따라 회전(대입)
//- [4,0] => [4,1]
//- [4,1] => [4,2]
//- [4,2] => [5,2]
//- [5,2] => [5,1]
//- [5,1] => [5,0]
//- [5,0] => [4,0]
// => 오른쪽이동, 아래 이동, 왼쪽 이동, 위로 이동
// 01. 오른쪽_이동 if(y1이랑 같고, x1이상 & x2 미만)
// 02. 아래_이동 if(x2랑 같고, y1이상 & y2 미만)
// 03. 왼쪽_이동 if(y2랑 같고, x2이하 & x1 초과)
// 04. 위로_이동 if(x1랑 같고, y2이하 & y1 초과)
//그 숫자들 중 가장 작은거 answer에 push
반응형
'알고리즘 문제 풀기' 카테고리의 다른 글
프로그래머스: 문자열 압축 - javascript(반복문 관건) (0) | 2024.04.24 |
---|---|
프로그래머스: 거리두기 확인하기 - javascript(bfs, 규칙찾기) (0) | 2024.04.23 |
프로그래머스: 수식 최대화 - javascript(정규식, 숫자 계산) (1) | 2024.04.18 |
프로그래머스: [3차]방금그곡 - javascript(빡구현) (0) | 2024.04.16 |
프로그래머스: 메뉴 리뉴얼- javascript(재귀 이용한 조합, 객체) (0) | 2024.04.14 |