‡ CODING TEST STUDY ‡/º 프로그래머스

프로그래머스 [Lv1] | 키패드 누르기

Trudy | 송연 2023. 7. 27. 15:33

2020 카카오 인턴쉽 기출문제
 

 

이번에도 string을 적절히 이용했어야 했고, vector을 이용해야했다.

C++ STL Vector 사용법 : 네이버 블로그 (naver.com)

그냥 배열인데 삽입/삭제를 할 수 있는 함수들이 추가돼서 이용하기 좀 더 편리한 배열같은 느낌.

 


처음에는 2차원 배열을 사용해야 하나...? 하다가 든 생각은 이번에도 수학적으로 접근하기. 냅다 그냥 막 풀어버리기

이렇게 푸는게 절대 최선을 아니겠지만.. 생각나는 게 이 방법이니 일단 풀어보자싶었음

제일 아래의 0을 11이라고 가정

'2', '5', '8', '0'인 경우 '1', '4', '7' 과 '3', '6', '9'와의 거리를 따져보면

두 숫자의 차이 = 1이면 무조건 거리가 1이다.

두 숫자의 차이 = 2이면 무조건 거리가 2이다.

두 숫자의 차이 = 3이면 무조건 거리가 1이다.

두 숫자의 차이 = 4이면 무조건 거리가 2이다.

두 숫자의 차이 = 5이면 무조건 거리가 3이다.

두 숫자의 차이 = 6이면 무조건 거리가 2이다.

두 숫자의 차이 = 7이면 무조건 거리가 3이다.

두 숫자의 차이 = 8이면 무조건 거리가 4이다. (3과 0인 경우)

두 숫자의 차이 = 9이면 무조건 거리가 3이다. (2와 0인 경우)

두 숫자의 차이 = 10이면 무조건 거리가 4이다. (1과 0인 경우)

이를 코딩하기 쉽게 배열로 거리에 따라 정리하면

거리 = 1인 경우 : 두 수의 차이 = 1, 3

거리 = 2인 경우 : 두 수의 차이 = 2, 4, 6

거리 = 3인 경우 : 두 수의 차이 = 5, 7, 9

거리 = 4인 경우 : 두 수의 차이 = 8, 10

그걸 함수로 구현해서 테스트를 해보니..

 

 

 

 

틀렸다. 요놈인데 뭐 때문에 틀렸을까하다가 생각난 이 문제의 첫번째 조건

"왼쪽 손가락은 *, 오른쪽 손가락은 #에서 시작한다."

고래서 왼쪽 손가락과 오른쪽 손가락의 현재 위치를 저장해주는 변수 l, r을 초기화해주는 부분을 아래처럼 10과 12로 바꿔서 적어줬다.

그러고 테스트를 실행해 주니

 

 

 

솔직히 무슨 손가락으로 누를지가 정해졌을때 사용되는

answer.append(1,'_'); _ = numbers[i];

이 두 문장을 함수로 구현하고 싶었는데 실패하고 테스트가 다 통과됨에 신나서 제출해버렸다.

흠.. 그렇다. 그것만 구현해도 코드가 반은 적었을텐데 말이지.

&을 붙여 Call by reference로 구현했다면 가능했을거 같기도하다.

이것은 내가 1학년때 필기해둔 call by reference 내용


그리고 어느 분들의 코드!

이 분들도 수학적으로 접근을 했는데 내가 실패한 방법으로 구현하셨다!!

나는 숫자 차를 이용해서 풀었는데 풀기전 3으로 나누기/나머지 연산을 해서 할 수 있을 것 같아서 끄적이다 실패하고 차를 이용해 냅다 나열해서 푼 것이다.

이 분들도 똑같이 왼쪽 손가락, 오른쪽 손가락의 현재 위치를 나타내는 변수 curr_L과 curr_R을 사용하셨고

numbers[] 를 하나씩 탐색하면서 검사한다.

numbers[i] % 3 == 1이면 "L"이고

numbers[i] % 3 == 0 && numbers[i] % 3 != 0 이면 "R"이다.

 

여기까지는 정말 비슷한데 가운데 2, 5, 8, 0을 처리하는 부분이 다르다.

만약 numbers[i] == 0 이면 11로 바꿔준다.

if(curr_L % 3 == 1) dist_L = abs(tmp - curr_L - 1) / 3 + 1; else dist_L = abs(tmp - curr_L) / 3; if(curr_R % 3 == 0) dist_R= abs(tmp - curr_R + 1) / 3 + 1; else dist_R = abs(tmp - curr_R) / 3;

현재 왼쪽 손가락의 위치 % 3 == 1라는 것은 현재 왼쪽 손가락의 위치가 1, 4, 7 위에 있는 경우를 뜻한다.

이럴 경우 |현재 숫자 - 현재 위치 - 1| / 3 + 1을 dist_L에 저장해준다.

예를 들어 현재위치는 4, 현재 숫자가 8인 경우 : |4 -8-1| / 3 + 1 = 2

와 그러고 보니 2가 4와 8의 거리네??

이렇게 계산해줄 수 있었던 거구만요. 지니어스. 카카오 입사하슈.

else문에 걸리는 경우는 현재 왼쪽 손가락의 위치가 2, 5, 8, 0 일 때이다.

이 경우 3으로 나눠주기만하면 거리가 나온다. 대박!