문제

동물원에서 막 탈출한 원숭이 한 마리가 세상구경을 하고 있다. 그 녀석은 원주 부근을 돌아다니다가 코레스코 콘도에서 아주 재밌는 놀이를 발견했다. 그 놀이의 이름은 바로 “꼬리를 무는 숫자 나열”. 이제부터 원숭이가 그토록 좋아하던 그 놀이를 파헤쳐보자.

놀이의 방법은 간단하다. 일단 4줄짜리 표에 왼쪽부터 수를 아래로 1부터 순서대로 적어나간다. 다음에 그 예가 잘 나타나있다.

https://www.acmicpc.net/problem/1598

이제 원숭이는 두 개의 자연수를 아무거나 생각한다. 그리고 숫자판에서 두 개의 자연수 사이의 직각거리를 구하면 된다. 여기서 직각거리는 동서방향거리와 남북방향거리의 합을 뜻한다.

예를 들어 저 숫자판에서 11과 33을 생각했다고 하자. 그렇다면 11과 33사이의 직각거리는 8이 된다.(동서방향거리 : 6, 남북방향거리 : 2) 다음 그림에 잘 나타나있다.

https://www.acmicpc.net/problem/1598

하지만 원숭이는 지금 혼란스럽다. 동물원에서 탈출한지 얼마 되지 않아서 계산을 할 수 없는 경지에 이르렀다. 여러분이 불쌍한 원숭이를 좀 도와줘야겠다. 원숭이가 생각한 두 자연수 사이의 직각거리를 구하는 프로그램을 작성하시오.

 

 

입력

첫째 줄에 원숭이가 생각한 두 개의 자연수가 주어진다. 각 수는 10,000,000 이하이다.

 

 

출력

첫째 줄에 원숭이가 생각한 두 개의 자연수 사이의 직각거리를 출력한다.

 

 

풀이

간단하게 풀어서 말하자면 각각의 x,y축 좌표값을 구해준 다음

그 좌표값의 차이를 구하면 되는 문제다.

 

a의 위치와 b의 위치의 차이를 구할 때

일반적으로는 a가 작고 b가 크다고 생각해서 앞의 계산에서는 Math.abs를 빼먹을 수 있는데

(실제로 예전 코드를 보니 빼먹고 제출했는데 통과되어있다..  테스트케이스를 대충 짠 느낌이다)

a보다 b가 크다는 보장이 없기 때문에 Math.abs()로 감싸줘야 한다.

 

이를 방지하기 위해서는 Math.max(a,b), Math.min(a,b)를 통해 max, min으로 좌표값을 수정할 수 있지만

오히려 그게 더 번거로울 수 있다.

 

결론적으로 좌표값은 5의 경우 (0,1)이 되고 8의 경우 (3,2)가 되는 등

x축의 좌표는 (x-1)/4의 몫, y축의 좌표는 (x-1)%4인 나머지 값임을 알 수 있고

a, b의 x축, y축 값들의 차이를 Math.abs로 처리해 해결했다.

const [a,b] = require('fs').readFileSync('/dev/stdin').toString().trim().split(' ').map(Number)

console.log(Math.abs(Math.floor((b-1)/4)-Math.floor((a-1)/4))+Math.abs((b-1)%4-(a-1)%4) )
const [a,b] = `11 33`.split(' ').map(Number)

console.log(Math.abs(Math.floor((b-1)/4)-Math.floor((a-1)/4))+Math.abs((b-1)%4-(a-1)%4) )

'알고리즘 > 백준' 카테고리의 다른 글

[백준 JS] 1837번 암호제작  (0) 2023.03.13
[백준 JS] 1703번 생장점  (0) 2023.03.13
[백준 JS] 1547번 공  (0) 2023.03.13
[백준 JS] 1284번 집 주소  (0) 2023.03.13
[백준 JS] 1267번 핸드폰 요금  (0) 2023.03.13

+ Recent posts