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 |