항상 백준 사이트를 이용해왔는데
오늘은 새롭게 프로그래머스의 문제를 가져왔다.
오늘의 문제는
2020 카카오 인턴십에 나왔던 문제로
문제의 난이도가 그렇게 높지는 않았지만
생각하는 방법이나 풀이가 굉장히 재밌게 느껴졌다.
문제 링크는 아래 링크를 통해 확인할 수 있으며,
바로 오늘의 문제에 대해 이야기해 보겠다.
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. 오른 손가락과 목표 지점의 거리
1과 2를 각각 계산해 구해줬다.
현재 위치에서 목표 지점의 거리를 구할 때
처음에는 bfs도 생각했지만,
거쳐온 길을 구하거나 장애물이 있는 것이 아닌
단순히 거리를 구하는 것이므로
절댓값을 사용해 가로/세로의 차를 구해
거리를 구할 수 있다는 것을 깨닫고
그와 같이 구현했다.
더 자세한 설명은 코드 구현을 통해 설명하겠다.
2. 코드 구현
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
def findwhere(num):
keypad = [[1, 2, 3], [4, 5, 6], [7, 8, 9], ['*', 0, '#']]
N = 4; M = 3;
for i in range(N):
for j in range(M):
if keypad[i][j] == num:
return [i, j]
def solution(numbers, hand):
ans = []
# 왼손과 오른손의 시작점
left = [3, 0]
right = [3, 2]
# 왼편과 오른편에 있는 숫자들
left_side = [1, 4, 7]
right_side = [3, 6, 9]
# 숫자를 하나씩 돈다
for num in numbers:
# findwhere은 목표지점의 숫자의 위치를 구하는 함수
# where = [목표지점의 행, 목표지점의 열]
where = findwhere(num)
# 왼쪽에 있는 경우는 'L' 추가 및 왼손 이동
if num in left_side:
ans.append('L')
left = where
# 오른쪽에있는 경우는 'R' 추가 및 오른손 이동
elif num in right_side:
ans.append('R')
right = where
# 길이가 같은 경우
else:
# 왼손과 목표지점의 거리
left_dis = abs(where[0] - left[0]) + abs(where[1] - left[1])
# 오른손과 목표지점의 거리
right_dis = abs(where[0] - right[0]) + abs(where[1] - right[1])
if left_dis < right_dis:
ans.append('L')
left = where
elif right_dis < left_dis:
ans.append('R')
right = where
# 두 거리가 같을 경우는 왼손잡이인지 오른손 잡이인지를 통해
else:
if hand == 'left':
ans.append('L')
left = where
else:
ans.append('R')
right = where
answer = "".join(ans)
return answer
|
cs |
마무리
프로그래머스의 문제를 풀면서
vscode의 유용성을 다시 한 번 느꼈다.
자동완성이나 힌트 등
vscode를 사용하면 빠르고 쉽게
문제를 풀 수 있지만
이렇게 가끔씩은 직접 작성해보는 것도 나쁘지 않은 것 같다.
*잘못된 부분이 있다면 댓글 부탁드리겠습니다!
'study > 알고리즘' 카테고리의 다른 글
[python] programmers - 문자열 압축(2020 KAKAO BLIND RECRUITMENT) (0) | 2021.09.09 |
---|---|
[python] programmers - 신규 아이디 추천(2021 KAKAO BLIND RECRUITMENT) (0) | 2021.08.30 |
[python] 백준 - 22352 항체 인식 (0) | 2021.08.04 |
[python] 백준 - 1120 문자열 (0) | 2021.08.02 |
[python] 백준 - 14889 스타트와 링크 (0) | 2021.08.01 |