문제
동물원에서 막 탈출한 원숭이 한 마리가 세상구경을 하고 있다. 그 녀석은 원주 부근을 돌아다니다가 코레스코 콘도에서 아주 재밌는 놀이를 발견했다. 그 놀이의 이름은 바로 “꼬리를 무는 숫자 나열”. 이제부터 원숭이가 그토록 좋아하던 그 놀이를 파헤쳐보자.
놀이의 방법은 간단하다. 일단 4줄짜리 표에 왼쪽부터 수를 아래로 1부터 순서대로 적어나간다. 다음에 그 예가 잘 나타나있다.
(사진1)
이제 원숭이는 두 개의 자연수를 아무거나 생각한다. 그리고 숫자판에서 두 개의 자연수 사이의 직각거리를 구하면 된다. 여기서 직각거리는 동서방향거리와 남북방향거리의 합을 뜻한다.
예를 들어 저 숫자판에서 11과 33을 생각했다고 하자. 그렇다면 11과 33사이의 직각거리는 8이 된다.(동서방향거리 : 6, 남북방향거리 : 2) 다음 그림에 잘 나타나있다.
(사진2)
하지만 원숭이는 지금 혼란스럽다. 동물원에서 탈출한지 얼마 되지 않아서 계산을 할 수 없는 경지에 이르렀다. 여러분이 불쌍한 원숭이를 좀 도와줘야겠다. 원숭이가 생각한 두 자연수 사이의 직각거리를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 원숭이가 생각한 두 개의 자연수가 주어진다. 각 수는 10,000,000 이하이다.
출력
첫째 줄에 원숭이가 생각한 두 개의 자연수 사이의 직각거리를 출력한다.
문제풀이
처음에는 저 표를 좌표평면에 대입시켰고 높이가 4이기때문에 x축과 y축에서의 수학적 규칙을 찾아 구현하였다.
#include <iostream>
#include <cmath>
using namespace std;
int main(void){
int in1, in2;
int x1, y1, x2, y2;
cin >> in1 >> in2;
if (in1%4 ==0){
x1 = in1/4;
y1 = 1;
}
else x1 = in1/4+1;
if (in1%4 == 1) y1 = 4;
if (in1%4 == 2) y1 = 3;
if (in1%4 == 3) y1 = 2;
if (in2%4 == 0){
x2 = in2/4;
y2 = 1;
}
else x2 = in2/4+1;
if (in2%4 == 1) y2 = 4;
if (in2%4 == 2) y2 = 3;
if (in2%4 == 3) y2 = 2;
cout << abs(x2-x1)+abs(y2-y1) <<endl; //abs 절대값
return 0;
}
위의 구현을 더 짧게 해보자면, a와 b를 4로 나눈 나머지의 차의 절대값은 y축의 좌표를 구할 수 있고 4로 나눈 몫의 차의 절대값은 x축의 좌표를 구할 수 있다.
//1598 더 짧은 코드
#include <bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
a--;b--;
cout<<abs(a%4-b%4)+abs(a/4-b/4);
}
'백준풀기' 카테고리의 다른 글
[c++] 백준 1075번 나누기 (0) | 2024.01.31 |
---|---|
[c++] 백준 1085번 직사각형에서 탈출 (1) | 2024.01.31 |
[c++] 백준 1547번 공 (1) | 2024.01.31 |
[c++] 백준 1837번 암호성공 (1) | 2024.01.30 |
[c++] 백준 10952번 A+B-5 (c++에선 a==b==c가 안되는 이유) (1) | 2024.01.30 |