개발새발 로그

[JS] 백준 17143번 : 낚시왕 본문

알고리즘

[JS] 백준 17143번 : 낚시왕

이즈흐 2023. 7. 16. 15:10

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이상 인 경우를 생각하지 못했다.

 -속력이 엄청 많이 있을 경우 반복문이 너무 많이 돌게 된다.

 -그런 상황을 생각해서 방어코드를 작성해야한다.

 

728x90
반응형
LIST