https://programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

문제

휴대폰 숫자패드

숫자 배열이 주어집니다. 정해진 규칙에 따라 왼손 혹은 오른속으로 숫자패드를 누르게 되는데, 어떤 손으로 눌렀는지를 출력하세요.

 

발상

우선 왼쪽라인은 왼손, 오른쪽 라인은 오른손으로 정해져있으니, 먼저 고정값들을 반환하고

그 뒤에 현재 왼손,오른손 검지의 위치와 목표숫자의 거리를 계산하는 것이 포인트였다.

 

1. 숫자패드가 정해져있으니 숫자패드를 [1,2,~10,11,12] 숫자배열로 추상화하고

2. 엄지와 목표값의 거리를 3x4 배열의 특성을 이용하여 3으로 나눈 몫을 y거리, 3으로 나눈 몫의 나머지를 x거리로 잡아서

3. x와 y의 값을 더하여 각 손의 거리를 구하고 비교하기로 하였다.

 

 

의사코드

1. 초기값 세팅(숫자패드, 왼손, 오른손 위치)

2. 입력값 테스트(){

    1. 목표가 0일 경우 추상화한 11로 치환

    2. 손가락판별()

    3. 결과배열 더하기
}
3. 결과배열 반환



손가락판별(){

1.3으로 나누었을때 나머지가 1이면 L

2. 3으로 나누었을때 나머지가 0이고 목표가 0이 아니면 R

3. 왼손과 오른손의 목표와의 거리값 비교

4. 결과값 반환

}



거리값 비교(){

1. 목표와 현재위치 절대값 계산

2. 차이값을 3으로 나눈 몫 = y거리

3. 차이값을 3으로 나눈 몫의 나머지 = x거리

4. y+x 반환

}

 

개선

테스트케이스 통과 후, 다른사람들이 작성한 코드를 보니 발상은 비슷한데 세부적으로 최적화한 부분이 있었다.

예를들어 주어지는 값 "left","right"를 "L","R"로 새로 할당하여 비교한다던지

나는 각각의 거리를 매 로직마다 계산하게 하였는데, 패드가 작은 것을 이용하여 미리 구해놓은 값을 바로 쓰는 경우도 있었다.

다음부터는 사용하기 편리한 값들을 설정하는 것도 고려하자.

'IT > Algorithm' 카테고리의 다른 글

[Programmers] 2016년  (0) 2022.07.03
[Programmers] 모의고사  (0) 2022.07.02
[LeetCode] 773. Sliding Puzzle  (0) 2022.06.25
Day 22: Binary Search Trees  (0) 2018.06.25
Day 21: Generics  (0) 2018.06.25

+ Recent posts