📝 문제
💡 동물원에서 막 탈출한 원숭이 한 마리가 세상구경을 하고 있다.
그 녀석은 원주 부근을 돌아다니다가 코레스코 콘도에서 아주 재밌는 놀이를 발견했다.
그 놀이의 이름은 바로 “꼬리를 무는 숫자 나열”.
이제부터 원숭이가 그토록 좋아하던 그 놀이를 파헤쳐보자.
놀이의 방법은 간단하다.
일단 4줄짜리 표에 왼쪽부터 수를 아래로 1부터 순서대로 적어나간다.
다음에 그 예가 잘 나타나있다.
이제 원숭이는 두 개의 자연수를 아무거나 생각한다.
그리고 숫자판에서 두 개의 자연수 사이의 직각거리를 구하면 된다.
여기서 직각거리는 동서방향거리와 남북방향거리의 합을 뜻한다.
예를 들어 저 숫자판에서 11과 33을 생각했다고 하자.
그렇다면 11과 33사이의 직각거리는 8이 된다. (동서방향거리 : 6, 남북방향거리 : 2)
다음 그림에 잘 나타나있다.
하지만 원숭이는 지금 혼란스럽다.
동물원에서 탈출한지 얼마 되지 않아서 계산을 할 수 없는 경지에 이르렀다.
여러분이 불쌍한 원숭이를 좀 도와줘야겠다.
원숭이가 생각한 두 자연수 사이의 직각거리를 구하는 프로그램을 작성하시오.
⚙️ 입력 : 첫째 줄에 원숭이가 생각한 두 개의 자연수가 주어진다.
각 수는 10,000,000 이하이다.
⚙️ 출력 : 첫째 줄에 원숭이가 생각한 두 개의 자연수 사이의 직각거리를 출력한다.
1598번: 꼬리를 무는 숫자 나열
첫째 줄에 원숭이가 생각한 두 개의 자연수가 주어진다. 각 수는 10,000,000 이하이다.
www.acmicpc.net
✅ 풀이
a, b = map(int, input().split())
if a > b:
a, b = b, a
lefta = a % 4
leftb = b % 4
if lefta == 0:
lefta += 4
if leftb == 0:
leftb += 4
disc = abs(lefta - leftb)
if lefta > disc:
newa = a - disc
else:
newa = a + disc
disl = (b - newa) // 4
print(disc + disl)
💡 아래 그림과 같은 아이디어로 문제를 참신(?)하게 풀어보았다.
먼저 a를 좌측에, b를 우측에 두기 위해서 a와 b를 크기 순으로 재배치했다.
그 다음, lefta와 leftb에 a와 b를 4로 나눈 나머지를 저장했는데,
이는 a와 b를 좌측 맨 첫번째 열로 이동시킨 것이라고 생각하면 된다.
나머지가 0인 경우는 4인 경우와 같다고 간주하였다.
그렇게 해서 lefta와 leftb의 거리를 계산해서 세로 거리를 구했다.
다음으로, newa를 만들어 점 a를 b와 같은 선상으로 옮기기 위해 세로 거리만큼 이동시켰다.
이후 같은 선상에 있는 newa와 b 사이의 거리를 구한 뒤, 각 칸의 간격인 4로 나눠주었다.
그렇게 구한 가로 거리와, 앞에서 구한 세로 거리를 더해 직각거리를 최종적으로 구했다.