티스토리 뷰
프로그래머스 문제 정복기
카카오 인턴쉽
난이도 : Lv1
🔗 Link
https://programmers.co.kr/learn/courses/30/lessons/67256
📑 Summary
키패드 숫자 입력이 여러 개 들어왔을 때, 어느 손으로 해당 번호를 누르는지 순서대로 결과를 출력하는 문제이다.
🔑 How to solve?
문제의 조건에 따라 왼손과 오른손을 누르는 고정적인 경우와 가변적인 경우로 나누어 생각해보자.
1) 고정적인 경우
- 왼손으로만 누르는 번호 : 1, 4, 7
- 오른손으로만 누르는 번호 : 3, 6, 9
2) 가변적인 경우 (2,5,8,0)
- case A. 입력 키패드에서 왼쪽과 오른쪽의 현재 위치까지의 거리가 다를 경우 -> 가까운 쪽의 손으로
- case B. 입력 키패드에서 왼쪽과 오른쪽의 현재 위치까지의 거리가 같을 경우 -> 본인의 평소 쓰는 손으로
1)번의 경우, 해당 번호라면 눌러주면 된다. 고민을 해야 할 경우는 2) 번이다.
왜 가변적인 경우가 더 고려해야 할 상황이 많은가?
일단, 입력 키패드에서 양 손의 현재 위치와의 거리차를 구해야 한다. 양손의 위치가 여러 가지 구간일 수 있으므로, 생각해야 할 부분이 많다. 그렇다면 어떻게 현재 위치까지의 거리를 쉽게 구할 수 있을까?
예를 들어 나타내 보자. 임의의 위치에 있는 왼손이 갈 수 있는 범위는 아래와 같다.
현재 왼손이 왼쪽 키패드 열 쪽에 있다면(case1), 중앙으로 한 칸을 옮겨준 뒤, 세로 차만큼 이동해주면 거리를 계산할 수 있다. case 2번의 경우 세로 이동만 하면 되므로, 바로 세로 차만큼 이동해준다면 거리를 계산할 수 있다. 오른쪽도 이와 마찬가지로 계산을 해주면 된다.
해당 문제에서는 누가 더 가까운지 보면 되기 때문에 오른쪽과 왼쪽을 같은 방식으로 계산만 해준다면, 비교에는 문제가 없으나, 위로 움직이든, 옆으로 움직이든 같은 값으로 이동하고 싶다면 아래와 같이 표현할 수 있다.
#왼쪽이든 오른쪽이든 거리를 구하는 함수
def getCount(loc,num):
cnt =0
#첫번째 라인에 있을 경우( 중앙으로 밀어주기 위해 cnt+1)
if loc %3 ==1 :
cnt+=1
loc+=1
#세번째 라인 ( 중앙으로 밀어주기 위해 cnt+1)
elif loc % 3 ==0:
cnt+=1
loc-=1
#공통 로직 (세로는 3칸씩 증감하므로 3으로 나눈다면 동일한 칸수로 이동가능)
cnt += int(abs(num-loc)/3)
return cnt
위와 같은 형식으로 거리차를 구한 뒤, 같다면 평소에 쓰는 손으로 추가해주면 되고, 다르다면 가까운 손을 기입해주면 된다.
💡 Code
# Link
# https://programmers.co.kr/learn/courses/30/lessons/67256
def solution(numbers, hand):
answer = ''
#현재 위치값
curL=10
curR=12
for num in numbers:
if num in [1,4,7] :
answer +='L'
curL =num
elif num in [3,6,9] :
answer +='R'
curR =num
else :
#중앙인경우들의 계산
# 계산의 편의를 위해 0을 실제위치인 11로 바꿈
num = num if num != 0 else 11
# 입력키패드와의 거리 계산
Ldist = getCount(curL,num)
Rdist = getCount(curR,num)
#거리가 같을 경우
if Ldist == Rdist :
if hand == "left":
answer+= "L"
curL=num
else:
answer+= "R"
curR=num
else :
#거리가 다를 경우
if Ldist < Rdist:
answer+= "L"
curL=num
else :
answer+="R"
curR=num
return answer
def getCount(loc,num):
cnt =0
#첫번째 라인
if loc %3 ==1 :
cnt+=1
loc+=1
#세번째 라인
elif loc % 3 ==0:
cnt+=1
loc-=1
cnt += int(abs(num-loc)/3)
return cnt
☕ After
현재 위치를 표현하기 위해 코드의 중복이 좀 심해 진부분이 불편했다. -_-;
포스팅에 문제가 있거나, 설명이 잘못된 부분 지적 환영합니다.
더 나은 퀄리티의 콘텐츠를 제공할 수 있도록 노력하겠습니다.
읽어주셔서 감사합니다.
'공부 > 코딩 테스트 준비' 카테고리의 다른 글
[프로그래머스] 매칭 점수 - JAVA (실패 CASE 포함) (0) | 2021.12.25 |
---|---|
[프로그래머스] 숫자 문자열과 영단어 - Python (0) | 2021.12.22 |
[프로그래머스] 추석트래픽 - JAVA (0) | 2021.12.17 |
[프로그래머스] 모의고사 - Python (0) | 2021.12.14 |
[백준] 2250 - 트리의 높이와 너비 JAVA (0) | 2021.10.24 |
- Total
- Today
- Yesterday
- looker core
- looker instance 접속
- 그래프 탐색
- 9019
- 아기상어나쁜상어
- 브루트포스
- java
- Spring
- BFS
- DFS
- dml
- 아기상어미워
- 카카오
- 재귀
- 프로그래머스 문제정복
- DP
- 백준
- 실패일기
- value annotation
- 하루 회고
- 프로그래머스
- JNDI연동
- 코딩테스트
- Database
- 자바
- 플루이드 와샬
- 파이썬
- Python
- db
- 유클리드-호제법
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |