아모가 가장 좋아하는 메뉴의 번호를 입력하는 문제
문제에서 아모가 가장 좋아하는 메뉴의 이름은 1_c_3_c_0__ff_3e라고 한다.
코드를 분석해서 해당 메뉴의 번호를 얻으면 해결할 수 있다.
코드
처음부터 해석해보면
1. menu_str 변수를 선언
2. org 변수에 메뉴 번호를 저장 후 int로 변경
3. st라는 리스트 생성 후 NULL값으로 초기화
for문을 보면
1. res 변수에 org 를 4*i만큼 오른쪽으로 쉬프트 한 값과 0xf와 &연산을 진행한 값을 저장
2. ~res 와 0xf를 &연산한 값이 0x4라면 st에 '_'를 저장, 아니라면 res를 저장
3. 만약 res값이 12 이상이라면 hex로 변환 후 저장
처음에는 위의 코드 분석을 통해 하나하나 비트 연산을 진행했다.
res = (org >> (4*i)) & 0xf
위의 코드를 생각해보면,
org 값을 오른쪽으로 4칸씩 쉬프트를 진행하고
0xf와 &연산을 통해 4개의 비트만을 남긴다는 것을 알 수 있다.
~res & 0xf == 0x4
먼저 ~res & 0xf == 0x4가 나오는 경우를 생각해보았다.
0xf == 1111이고 0x4 == 0100 이므로 ~res는 0100이 되어야한다.
그러므로 res의 값은 1011이 될 것이라고 생각했다.
이후 나오는 계산은 16진수로 변환하거나 10진수를 그대로 사용한다.
그래서 처음 접근은 수작업으로 하나하나 써가면서 역연산을 진행했다.
파이썬 코드
이후에는 파이썬으로 코드를 짜서 해당 문자열을 역연산을 진행했다.
C++이 주 언어이고, python도 공부할 겸 코드를 짜보려했는데,
혼자는 힘들어서 아래 블로그를 참고했다.
https://hackingis.art/110