알고리즘 - [백준] 1085번 직사각형에서 탈출

Seong Hyeon Kim·2022년 9월 1일
0

알고리즘

목록 보기
15/20

문제

풀이과정

  • 나의 초기 코드
    // 직사각형에서 탈출
    const fs = require("fs");
    const input = fs
    .readFileSync("input.txt")
    .toString()
    .trim()
    .split(" ")
    
    const x = input.shift();
    const y = input.shift();
    const w = input.shift();
    const h = input.shift();

    const xResult = Math.abs(x-w); // Math.abs()는 정수 값을 절대값으로 바꿔준다 
    const yResult = Math.abs(y-h);

    let xyMin=0;
    let answer =0;

    if(xResult <= yResult){
        xyMin +=xResult
    }else{
        xyMin += yResult
    }

    if(xyMin <= x && y){
        answer += xyMin
    }else{
        if(x <= y){
            answer += x
        }else{
            answer += y
        }
    } 

 console.log(answer)


/*
x - w 가 0-x 보다 작으면 
return

y- h 가 0-y 보다 작으면

*/

우선 문제를 이해하기 위해서 그림을 그려보고 시작했는데,
단순하게 생각해서 x,y 위치와 직사각형의 위치를 생각하며
현재 위치와 직사각형의 변의 위치를 뺏을때의 길이를 먼저 구하면 되겠다 라는 생각을 했는데,

예제입력2 를 보면 꼭 w-x 의 위치보다 그냥 단순 x의 위치가 더 직가각형 변에 가까울 수도 있다 라는 생각이 들었고,

두개의 값을 비교해서 더 가까운 값을 콘솔로 찍으면 되겠다는 생각으로
지금의 코드를 짜게 되었다.

우선 vs코드 상에서는 작동이 잘 되었지만, 백준 문제 제출은 실패가 나왔다.

아마도 예상못한 에러처리가 안된것 같아서 스터디원들에게 발표하명 이야기해본 결과
꽤나 많은 부분의 수정이 필요했다.

    // 직사각형에서 탈출
    const fs = require("fs");
    const input = fs
    .readFileSync("input.txt")
    .toString()
    .trim()
    .split(" ")
    .map(Number); /* 		숫자형으로 바꿔주지 않으면 문자형으로 인식할 수 있다. 
					 		기존의 방법이 성공한 이유는 자바스크립트라서...ㅋㅋ      */
   
    
    /*
	const x = input.shift();
    const y = input.shift();
    const w = input.shift();
    const h = input.shift();
	*/
	
	const{x,y,w,h} = input		/// 위 4줄은 이렇게  구조분해할당 으로 간단하게 할 수있다.

    const xResult = (w-x);		/// 여기서 문제조건에 항상 w가 x보다 1이 크다는 조건이 있어서
    const yResult = (h-y);		/// Math.abs() 사용할 필요가 없다.

    let xyMin=0;
    let answer =0;

/*
    if(xResult <= yResult){
        xyMin +=xResult
    }else{
        xyMin += yResult
    }
*/
	xyMin = Math.min(xResult, yResult)		/// 이부분도 if문을 사용할 필요 없이 이렇게 가능하다

/*
    if(xyMin <= x && y){
        answer += xyMin
    }else{
        if(x <= y){
            answer += x
        }else{
            answer += y
        }
    } 
 */

	xyMin = Math.min(xResult, yResult)		/// 이부분도 if문을 사용할 필요 없이 이렇게 가능하다

 console.log(answer)


/*
x - w 가 0-x 보다 작으면 
return

y- h 가 0-y 보다 작으면

*/

지금처럼 충분히 더 짧고 간결하게 코드를 짤수 있다는 걸 스터디를 통해 알게 되었다.

최종적으로 요약하자면

const fs = require("fs");
    const input = fs
    .readFileSync("input.txt")
    .toString()
    .trim()
    .split(" ")
    .map(Number)

	
	const[x,y,w,h] = input		

    const xResult = (w-x);		 
    const yResult = (h-y);		

    let xyMin=0;
    let answer =0;

	xyMin = Math.min(xResult, yResult)		
    
    answer = Math.min(xyMin,x,y)

 console.log(answer)

이렇게 짧게도 가능하다. 지금의 답으로 백준 제출도 완료된 상태이다


그리고 추가로 더더욱 짧게 코드를 짠 팀원들의 답을 적자면

const fs = require("fs");
    const input = fs
    .readFileSync("input.txt")
    .toString()
    .trim()
    .split(" ")
    .map((e) => Number(e.replaceAll('\r', '')));

	let arr = [x, w-y, y, h-y]
    console.log(arr.sort(a,b)=>a-b[0]);

이렇게 같은 코드의 내용이더라도 비교도 안되게 짧은 코드로도 가능하며

가장 충격적인건

const fs = require("fs");
    const input = fs
    .readFileSync("input.txt")
    .toString()
    .split(" ")
    .map(Number)
    
    console.log(Math.min(x, y, w-x, h-y))
    

이렇게 한줄로도 가능하다.....ㅋㅋㅋㅋㅋㅋㅋㅋ





느낀점

자료구조를 이해하기도 하고 코드 작성 능력도 향상시키기 위해서 하는 스터디지만
역시나 하길 잘했다 싶은 느낌이다.

아마 스터디를 안했다면 나는 첫번재 코드 정도의 작성능력만 있엇을텐데
스터디를 하고나니 확실히 더 짧고 간결하게 사용할 수 는 없을까 라는 생각을

조금 안한것 같기도 하고, 기본적으로 문제를 풀때 더 쉽게 풀 수 있었을텐데
그렇지 못한 부분도 좀 보인 것 같다.

기본적으로 나는 메소드에 관해서 좀더 공부를 해야 되겠다 라는 생각도 많이 든 문제풀이였다.

새로 알게된 메소드

Math.abs() => () 안의 값을 절대값으로 바꿔준다 - 일경우 그 값 그대로 양수로 바꿔준다.
Math.min() => () 안의 값중 가장 작은 값을 찾아준다.

profile
삽질도 100번 하면 요령이 생긴다. 부족한 건 경험으로 채우는 백엔드 개발자

0개의 댓글