-> 문제는 간단하다.
-> 2의 몇 제곱할 것인지, 그리고 행, 열이 입력 값으로 들어온다.
-> 그럼 입력받은 행과 열에는 무슨 숫자가 있는지 찾으면 된다.
제일 키 포인트였던 것은 이거였다.
이전 것에 4를 곱하면 원래 지금 내가 된다.
- 결국 당연한 얘기였다.
- 하지만, 여기에서 4가 아니라 3을 곱하면 어떻게 될까?
위의 그림은 n이 3일 때이다.
위에서 말했던 것처럼 나는 이전 것에 3을 곱해볼 것이다.
3 * (2^2 * 2^2) => 48
=> 결과로 4번째 블록의 첫 번째 값이 나왔다!
어? 이렇게해서 값을 구할 수 있다면, 이런식으로 접근을 해보자
블록들을 다 2*2 블록으로 만든다.
-> 2*2 블록으로 만든 이유는 2*2 블록에서의 첫 번째 값을 구하기만 한다면 나머지 값들 구하는 것은 완전 쉬웠기 때문이다.
-> 예를 들어, 48, 49, 50, 51 의 2*2 블록이 있다면, 48의 값을 찾고 각각 +1, +2, +3을 더해주면 된다.
식 세우기
2^(n+1) * (2 * 2)
-> 2 * 2의 코드 블록이 2의 n-1제곱만큼 있어야 한다.
블록 생각해보기
5행과 5열에 있는 값을 구해보고자 한다.
일단 그림으로 그렸을 때 5행 5열은 51이다.
블록을 2개로 쪼개었으니까 이 5행 5열을 2로 나누게 되면 2블록 / 2블록이 나오게 되고, 5행 5열은 그다음 3블록 3번째라는 정보가 나오게 된다!
-> 여기서 이제 행이 짝수일 경우, 행이 홀수일 경우 등을 고려하여 각각 +1, +2, +3을 구해주면 답이 나오게 된다.
=> 하지만, 계속 짜다보니 이 방법은 너무 더러운 방법 같았다..!
=> 블록을 2개로 짜르는 것보단, 사분면을 이용해서 풀 수 있을 것 같기에 사분면으로 도전!
* 여기에서는 편의를 위해 1사분면이 왼쪽 위, 2사분면이 오른쪽 위, 3사분면이 왼쪽 아래, 4사분면이 오른쪽 아래라고 정의
N, r, c = map(int, input().split())
result = 0
while(N != 0):
if((r < (2**(N-1)) and ( c < (2**(N-1))))): # 만약, 1사분면이라면
result += 0 * (2**(N-1)) * (2**(N-1))
elif((r < (2**(N-1)) and (c >= (2**(N-1))))): # 2사분면
result += 1 * (2**(N-1)) * (2**(N-1))
c -= 2**(N-1)
elif((r >= (2**(N-1)) and (c < (2**(N-1))))): # 3사분면
result += 2 * (2**(N-1)) * (2**(N-1))
r -= 2**(N-1)
else: # 4사분면
result += 3 * (2**(N-1)) * (2**(N-1))
r -= 2**(N-1)
c -= 2**(N-1)
N -= 1
print(result)
-> 코드는 수도코드 그대로다!
자바스크립트 : &&
파이썬 : and