일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 백준nodejs
- 프로그래머스
- 리액트댓글기능
- js코테
- 백준구현
- 프로그래머스JS
- css기초
- 백준js
- 안드로이드 스튜디오
- dp알고리즘
- 리액트커뮤니티
- JS
- 포이마웹
- 백준알고리즘
- 자바스크립트
- 백준
- 백준골드
- 몽고DB
- 백준구현문제
- 알고리즘
- 프로그래머스코테
- 코딩테스트
- 코테
- CSS
- 다이나믹프로그래밍
- HTML
- JS프로그래머스
- HTML5
- 익스프레스
- 리액트
- Today
- Total
개발새발 로그
[JS] 백준 17143번 : 낚시왕 본문
https://www.acmicpc.net/submit/17143
로그인
www.acmicpc.net
📋풀이방법.
1. arr배열에 상어의 위치를 표시해놓는다.
2. 낚시꾼이 오른쪽으로 갈 때까지 반복한다.
낚시꾼이 한칸 이동한다
1.낚시꾼이 한칸 이동하고, 그 열에서 맨위 에있는 상어를 잡는다.
2. 상어의 위치를 다시 shark배열에 저장한다. -> 상어가 하나 잡혔을 수 있으니까
3.상어의 정보가 저장된 shark배열을 하나씩 순회하면서 방향대로 속력만큼 이동한다.
이때 r길이는 2인데 속도가 1000이라면 엄청나게 왔다갔다해야된다. 같은 위치에 있을 경우의 규칙을 찾아야된다.
-속력이 (R-1)*2 나 (C-1)*2 면 다시 바라보는 방향도 똑같이 제자리로 돌아오게 된다.
-이를 mod연산을 통해서 이 이상 값이 나오면 계산해서 너무 많은 속력으로 인한 많은 반복을 없애준다.
-위에서 구한 속력 s값동안 반복한다.
-방향에 따라 상하좌우 증가 혹은 감소한다
-상어가 만약 벽을 만나게 된다면 방향을 바꿔준다.
-하나의 상어가 이동이 끝나고 계산된 좌표로 이동했을 때 상어가 있으면 크기를 비교해준다
->이때 상어를 좌표에 이동시켜줄 때 완전히 빈 배열 부터 시작해야 겹치지않는다.
-크기가 현재 상어가 크면 덮어씌워준다.
-상어가 안겹치면 좌표에 넣어준다.
4. 이를 반복한다.
🤟내 제출
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim();
input=input.replace(/\r/g,"").split("\n");
let [R,C,M]=input.shift().split(" ").map(Number);
let shark=[];
let arr=Array.from({length:R},()=>Array(C).fill(0));
for(var i=0;i<M;i++){
let [y,x,speed,de,weight]=input.shift().split(" ").map(Number);
arr[y-1][x-1]=[speed,de,weight];
}
let go={ 1:[-1,0],2:[1,0],3:[0,1],4:[0,-1]};
let result=0;
//낚시꾼이 한칸 이동한다. 그 열에서 맨위의 상어를 잡는다.
for(let fisher=0;fisher<C;fisher++){
for(var i=0;i<R;i++){
if(arr[i][fisher]!=0){
result+=arr[i][fisher][2];
arr[i][fisher]=0;
break;
}
}
shark=[];
for(var i=0;i<R;i++){
for(var j=0;j<C;j++){
if(arr[i][j]!=0){
shark.push([i,j,...arr[i][j]]);
}
}
}
arr=Array.from({length:R},()=>Array(C).fill(0));
//상어가 이동
shark.forEach((tt)=>{
let [r,c,s,d,z] =tt;
console.log(s+'--')
//속력이 (R-1)*2 나 (C-1)*2 면 다시 바라보는 방향도 똑같이 제자리로 돌아오게 된다.
if(d==1 || d==2){
s=s%((R-1)*2);
}
else {
s=s%((C-1)*2)
}
console.log(s)
for(var i=0;i<s;i++){
let ny=r+go[d][0];
let nx=c+go[d][1];
//상어가 벽을 만나면
if(nx<0 || nx>=C){
if(d==3) d=4;
else if(d==4) d=3;
}
else if(ny<0 || ny>=R){
if(d==1) d=2;
else if(d==2) d=1;
}
c+=go[d][1];
r+=go[d][0];
}
//상어가 겹치면
if(arr[r][c]!=0){
if(arr[r][c][2]<z){
arr[r][c]=[s,d,z];
}
}
//상어가 안겹치면
else{
arr[r][c]=[s,d,z];
}
})
}
console.log(result)
💢어려웠던점
1. 계속해서 배열의 크기를 넘어가는 값이 들어갔다.
- 새롭게 shark값을 갱신할 때 값을 이상하게 넣어서 시간을 많이 소비했다.
2. 속력이 1000이상 인 경우를 생각하지 못했다.
-속력이 엄청 많이 있을 경우 반복문이 너무 많이 돌게 된다.
-그런 상황을 생각해서 방어코드를 작성해야한다.
'알고리즘' 카테고리의 다른 글
[JS] 백준 1931번 : 회의실 배정 - 그리디 (0) | 2023.07.20 |
---|---|
[JS] 백준 11559 : PuyoPuyo - 구현문제 (0) | 2023.07.20 |
[JS] 백준 2363 : 치즈(2변이상이면 녹는 치즈) (0) | 2023.07.15 |
[JS] 백준 15684번 : 사다리 조작 (0) | 2023.07.14 |
[JS] 백준 15685번 : 드래곤 커브 (0) | 2023.07.13 |