티스토리 뷰

반응형

 

 

 

안녕하세요! iOS Developer, 멍구입니다. 😊

오늘은 2020 카카오인턴 코딩테스트 문제로 출제되었던, 키패드누르기를 풀어보도록 하겠습니다. 
먼저, 키패드누르기 문제의 설명을 보도록 할게요.

 

 


카카오 인턴 키패드 누르기 문제설명

키패드누르기 문제는 입력값으로 눌러야 하는 번호가 순서대로 주어졌을때, 각각의 번호를 어느쪽 엄지손가락으로 누르게 될지를 판단해서 출력하는 문제입니다. 엄지손가락으로만 키패드를 누르게 된다는 점이 제약사항입니다. 

 

 

눌러야하는 숫자의 순서와 더불어, 키패드를 누르는 사람의 왼손잡이/오른손잡이 상태를 입력받습니다. 
여기에서 조건에 대한 설명을 잘 읽어주어야 합니다. 

- 왼손 검지손가락은 *, 오른손 검지손가락은 #에서 시작합니다.
- 키패드가 1, 4, 7 인경우 왼손 검지손가락 만 / 3, 6, 9 인 경우 오른손 검지손가락만 이동해서 사용합니다. 
- 중앙의 키패드인 경우, 왼손 / 오른손 검지손가락 중 가까운 검지가 이동해서 키패드를 누릅니다.
  - 만약 왼손, 오른손 검지손가락이 현재 눌러야할 키패드까지 거리가 동일하면 -> 왼손잡이는 왼쪽이, 오른손잡이는 오른쪽이 이동합니다. 

즉, 우리는 위의 조건에 맞게 조건문을 구현해서 그에따른 정답을 도출해주면 됩니다!

 

 

제한사항과 입출력 예시입니다. numbers라는 [Int]타입 배열과, hand 문자열이 입력으로 들어옵니다. "left"면 왼손잡이, "right"면 오른손잡이임을 의미하지요. 

그리고 numbers에 있는 키패드 입력순서에 맞게 입력했을때 각각의 키패드를 입력하는 방향을 하나하나 기록해서 답으로 제출하면 됩니다. 즉, numbers 배열의 크기와 동일한 길이의 문자열이 정답으로 만들어지겠죠?

지금까지 키패드누르기 문제의 설명을 보았습니다. 해당문제는 문제의 조건을 잘 읽고 그대로 코드로 구현해내면 된답니다. 단순 구현문제라고 할 수 있습니다. 지금부터 해당문제를 swift언어를 통해 구현해보도록 하겠습니다.

 

 


카카오 인턴 키패드 누르기 스위프트 문제풀이

먼저 메서드 2개를 정의하고 가려고 합니다. 물론 메서드 분리가 없어도 되지만, 적절한 메서드 분리는 가독성을 높혀주고, 코드 구현 간 실수를 방지하겠죠. 

위의 메서드 isLeftPos, isRightPos는 현재 누를 키패드값이 1, 4, 7일 경우 왼손만 / 3, 6, 9일 경우 오른손만 터치하도록 판단하는데 사용할 메서드입니다. 

 

 

이부분이 제 풀이방식의 핵심입니다. 바로 각각의 키패드 번호 입력 위치를 좌표로 저장해두는 것입니다.

각 키패드의 입력위치를 pos 배열의 인덱스로 판단합니다. 예를들면, pos[0]은 '0' 숫자를 누를때의 키패드 위치를 의미하지요. '0'은 3행 1열에 위치하고 있습니다. (인덱스는 0부터 시작했음을 유의하세요.)

이렇게 하면 현재 위치에서 눌러야 할 키패드까지의 거리를 매우 쉽게 알 수 있습니다. 정리하자면,

- L, R : 왼손검지, 오른손검지의 키패드 위치
- pos : 각 키패드의 위치를 저장한 배열
- Ans : 정답 문자열이 들어갈 변수

그런데 여기에서 0 ~ 9 이외에 더 좌표정보가 들어가 있는 것을 보실 수 있습니다. 여기에서 저는 임의로 10번째는 '*'의 위치, 11번째는 '#'의 위치를 저장해 두었습니다.

그래서 L, R의 초기값이 왼손 검지, 오른손 검지의 초기 위치가 되는 10, 11이 되는 것입니다.

 

 

이제 numbers 배열을 하나하나 순차적으로 순회하면서 키패드를 눌러야할 검지손가락의 방향을 기록할 겁니다. 여기에서 for in 루프를 통해서 순회해도 되지만 저는 forEach를 사용했습니다.

배열의 전체 값을 순회해야만 하는 상황이라면 배열 값을 순회할 때 forEach를 사용해도 무방합니다. 도중에 break문을 사용할 일이 없다면 알이지요.


보시면 leftDist, rightDist가 있는데요. 이들 상수의 목적은 아래와 같습니다. 

- leftDist : 좌측검지 ~ 눌러야할 키패드까지의 거리를 계산합니다.
- rightDist : 우측검지 ~ 눌러야할 키패드까지의 거리를 계산합니다.

abs를 통해 절대값 연산을 하는 이유는 거리 계산 간 마이너스가 발생할 수 있기 때문입니다. 스위프트에서 기본적으로 제공하는 abs는 Double타입에 사용할 수 있으므로, 타입변환 과정을 거치면서 abs 절대값 연산을 수행했습니다. 


이렇게 좌측 검지 ~ 키패드까지 거리 / 우측 검지 ~ 키패드까지 거리를 구했습니다. 

이제 우리가 해야할 것은 눌러야할 키패드 위치에 따라, 왼손잡이 / 오른손잡이 여부에 따라 어느쪽 검지로 키패드를 눌러야 하느냐를 구하면 됩니다. 조건식을 잘 정의해서 말이죠. 이어서 가보겠습니다. 

21 ~ 26행) 을 보시면 먼저, 좌측검지로만 누를 수 있는 위치(1, 4, 7)라면 좌측 검지로 누르게 / 우측검지로만 누를 수 있는 위치(3, 6, 9)라면 우측 검지로 누르는 것으로 정의하고 있습니다. 이렇게 먼저 가장 크게 필터링 될 수 잇는 두가지 경우를 필터링 했습니다. 

이렇게 1, 3, 4, 6, 7, 9 키패드를 눌렀을때의 값에 대한 제크는 커버가 됩니다. 남은 것은 가운데 패드(2, 5, 8, 0)를 눌렀을때이죠. 바로 가보겠습니다. 

 

 

그 다음 27행의 else if 분기에서는 왼손잡이일 경우의 분기를 정의하고 있습니다. 

왼손잡이인데, 좌측검지 ~ 눌러야 할 키패드 거리가 우측검지 ~ 눌러야 할 키패드 거리보다 가깝거나 같으면 좌측검지가 이동합니다. 그 외에는 우측 검지가 이동하지요.

마지막 35행의 else문은 오른손잡이일 경우이죠. 27행의 조건분기 연산과 반대로 조건을 구현하시면 됩니다. 이렇게 문제는 해결됩니다.

해당 문제는 문제를 제대로 읽고, 그대로 조건식으로 구현해낸다면 충분히 풀 수 있는 문제였습니다. 

 

 

이렇게 프로그래머스의 키패드누르기 문제를 통과하는 것을 볼 수 있습니다. 

 

 


지금까지 프로그래머스의 카카오 인턴 기출문제 1번, 키패드누르기 문제를 스위프트(swift)로 풀어봤습니다. 이런 문제는 단순 구현문제이지만 방심하지 말고, 문제를 제대로 읽고 차분히 풀어내야하는 문제입니다. 

문제를 침착하게 읽고 완벽하게 조건식을 구현해내는 연습을 하시면 좋을 것 같습니다. 👨🏻‍💻

 

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함