// 직사각형에서 탈출
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() => () 안의 값중 가장 작은 값을 찾아준다.