[ํ๋ก๊ทธ๋๋จธ์ค | Python] ํคํจ๋ ๋๋ฅด๊ธฐ
๐ ๋ฌธ์ ์ ๋ณด
- ์ถ์ฒ : 2020 ์นด์นด์ค ์ธํด์ญ
- ๋์ด๋ : Level 1
- ๋ฌธ์ ๋งํฌ : 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
๐ ๋ฌธ์ ์ค๋ช
๋ฌธ์ ์ค๋ช
์ค๋งํธํฐ ์ ํ ํคํจ๋์ ๊ฐ ์นธ์ ๋ค์๊ณผ ๊ฐ์ด ์ซ์๋ค์ด ์ ํ ์์ต๋๋ค.

์ด ์ ํ ํคํจ๋์์ ์ผ์๊ณผ ์ค๋ฅธ์์ ์์ง์๊ฐ๋ฝ๋ง์ ์ด์ฉํด์ ์ซ์๋ง์ ์
๋ ฅํ๋ ค๊ณ ํฉ๋๋ค.
๋งจ ์ฒ์ ์ผ์ ์์ง์๊ฐ๋ฝ์ * ํคํจ๋์ ์ค๋ฅธ์ ์์ง์๊ฐ๋ฝ์ # ํคํจ๋ ์์น์์ ์์ํ๋ฉฐ, ์์ง์๊ฐ๋ฝ์ ์ฌ์ฉํ๋ ๊ท์น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์์ง์๊ฐ๋ฝ์ ์ํ์ข์ฐ 4๊ฐ์ง ๋ฐฉํฅ์ผ๋ก๋ง ์ด๋ํ ์ ์์ผ๋ฉฐ ํคํจ๋ ์ด๋ ํ ์นธ์ ๊ฑฐ๋ฆฌ๋ก 1์ ํด๋นํฉ๋๋ค.
- ์ผ์ชฝ ์ด์ 3๊ฐ์ ์ซ์ 1, 4, 7์ ์ ๋ ฅํ ๋๋ ์ผ์ ์์ง์๊ฐ๋ฝ์ ์ฌ์ฉํฉ๋๋ค.
- ์ค๋ฅธ์ชฝ ์ด์ 3๊ฐ์ ์ซ์ 3, 6, 9๋ฅผ ์ ๋ ฅํ ๋๋ ์ค๋ฅธ์ ์์ง์๊ฐ๋ฝ์ ์ฌ์ฉํฉ๋๋ค.
- ๊ฐ์ด๋ฐ ์ด์ 4๊ฐ์ ์ซ์ 2, 5, 8, 0์ ์
๋ ฅํ ๋๋ ๋ ์์ง์๊ฐ๋ฝ์ ํ์ฌ ํคํจ๋์ ์์น์์ ๋ ๊ฐ๊น์ด ์์ง์๊ฐ๋ฝ์ ์ฌ์ฉํฉ๋๋ค.
4-1. ๋ง์ฝ ๋ ์์ง์๊ฐ๋ฝ์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๋ค๋ฉด, ์ค๋ฅธ์์ก์ด๋ ์ค๋ฅธ์ ์์ง์๊ฐ๋ฝ, ์ผ์์ก์ด๋ ์ผ์ ์์ง์๊ฐ๋ฝ์ ์ฌ์ฉํฉ๋๋ค.
์์๋๋ก ๋๋ฅผ ๋ฒํธ๊ฐ ๋ด๊ธด ๋ฐฐ์ด numbers, ์ผ์์ก์ด์ธ์ง ์ค๋ฅธ์์ก์ด์ธ ์ง๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด hand๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๊ฐ ๋ฒํธ๋ฅผ ๋๋ฅธ ์์ง์๊ฐ๋ฝ์ด ์ผ์์ธ ์ง ์ค๋ฅธ์์ธ ์ง๋ฅผ ๋ํ๋ด๋ ์ฐ์๋ ๋ฌธ์์ด ํํ๋ก return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ ์ฌํญ
- numbers ๋ฐฐ์ด์ ํฌ๊ธฐ๋ 1 ์ด์ 1,000 ์ดํ์ ๋๋ค.
- numbers ๋ฐฐ์ด ์์์ ๊ฐ์ 0 ์ด์ 9 ์ดํ์ธ ์ ์์ ๋๋ค.
- hand๋ "left" ๋๋ "right" ์
๋๋ค.
- "left"๋ ์ผ์์ก์ด, "right"๋ ์ค๋ฅธ์์ก์ด๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์ผ์ ์์ง์๊ฐ๋ฝ์ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ L, ์ค๋ฅธ์ ์์ง์๊ฐ๋ฝ์ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ R์ ์์๋๋ก ์ด์ด๋ถ์ฌ ๋ฌธ์์ด ํํ๋ก return ํด์ฃผ์ธ์.
์ ์ถ๋ ฅ ์
numbers | hand | result |
[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" |
์ ์ถ๋ ฅ ์ ์ค๋ช
์ ์ถ๋ ฅ ์ #1
์์๋๋ก ๋๋ฌ์ผ ํ ๋ฒํธ๊ฐ [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]์ด๊ณ , ์ค๋ฅธ์์ก์ด์ ๋๋ค.
์ผ์ ์์น | ์ค๋ฅธ์ ์์น | ๋๋ฌ์ผ ํ ์ซ์ | ์ฌ์ฉํ ์ | ์ค๋ช |
* | # | 1 | L | 1์ ์ผ์์ผ๋ก ๋๋ฆ ๋๋ค. |
1 | # | 3 | R | 3์ ์ค๋ฅธ์์ผ๋ก ๋๋ฆ ๋๋ค. |
1 | 3 | 4 | L | 4๋ ์ผ์์ผ๋ก ๋๋ฆ ๋๋ค. |
4 | 3 | 5 | L | ์ผ์ ๊ฑฐ๋ฆฌ๋ 1, ์ค๋ฅธ์ ๊ฑฐ๋ฆฌ๋ 2์ด๋ฏ๋ก ์ผ์์ผ๋ก 5๋ฅผ ๋๋ฆ ๋๋ค. |
5 | 3 | 8 | L | ์ผ์ ๊ฑฐ๋ฆฌ๋ 1, ์ค๋ฅธ์ ๊ฑฐ๋ฆฌ๋ 3์ด๋ฏ๋ก ์ผ์์ผ๋ก 8์ ๋๋ฆ ๋๋ค. |
8 | 3 | 2 | R | ์ผ์ ๊ฑฐ๋ฆฌ๋ 2, ์ค๋ฅธ์ ๊ฑฐ๋ฆฌ๋ 1์ด๋ฏ๋ก ์ค๋ฅธ์์ผ๋ก 2๋ฅผ ๋๋ฆ ๋๋ค. |
8 | 2 | 1 | L | 1์ ์ผ์์ผ๋ก ๋๋ฆ ๋๋ค. |
1 | 2 | 4 | L | 4๋ ์ผ์์ผ๋ก ๋๋ฆ ๋๋ค. |
4 | 2 | 5 | R | ์ผ์ ๊ฑฐ๋ฆฌ์ ์ค๋ฅธ์ ๊ฑฐ๋ฆฌ๊ฐ 1๋ก ๊ฐ์ผ๋ฏ๋ก, ์ค๋ฅธ์์ผ๋ก 5๋ฅผ ๋๋ฆ ๋๋ค. |
4 | 5 | 9 | R | 9๋ ์ค๋ฅธ์์ผ๋ก ๋๋ฆ ๋๋ค. |
4 | 9 | 5 | L | ์ผ์ ๊ฑฐ๋ฆฌ๋ 1, ์ค๋ฅธ์ ๊ฑฐ๋ฆฌ๋ 2์ด๋ฏ๋ก ์ผ์์ผ๋ก 5๋ฅผ ๋๋ฆ ๋๋ค. |
5 | 9 | - | - |
๋ฐ๋ผ์ "LRLLLRLLRRL"๋ฅผ return ํฉ๋๋ค.
์ ์ถ๋ ฅ ์ #2
์ผ์์ก์ด๊ฐ [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]๋ฅผ ์์๋๋ก ๋๋ฅด๋ฉด ์ฌ์ฉํ ์์ "LRLLRRLLLRR"์ด ๋ฉ๋๋ค.
์ ์ถ๋ ฅ ์ #3
์ค๋ฅธ์์ก์ด๊ฐ [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]๋ฅผ ์์๋๋ก ๋๋ฅด๋ฉด ์ฌ์ฉํ ์์ "LLRLLRLLRL"์ด ๋ฉ๋๋ค.
๐ ๋ฌธ์ ํ์ด
๋ฐฉ๋ฒ 1. dictionary ํ์ฉ
2์ฐจ์ ํ๋ ฌ๋ก ์๊ฐํ๊ณ ์ธ๋ฑ์ค๊ฐ์ ์ฐจ์ด๋ฅผ ๊ตฌํ๋ฉด ์ฌ์ด ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๋๋ฐ, 2์ฐจ์ ํ๋ ฌ๋ก ๋ง๋ ํ ๊ฐ ์ธ๋ฑ์ค๋ฅผ ๋ ๊ฐ๊ฐ ๋ณ์์ ์ง์ ํ๊ณ ๊ทธ ์ฐจ๋ค์ ๊ตฌํ์๋ ๋๋ฌด ๋ณต์กํด์ ธ์ ํฌ๊ธฐํ๋ค. ๊ทผ๋ฐ ์ด๋ฅผ dictionary๋ฅผ ํ์ฉํ์ฌ ๊ตฌํํ๋ ํจ์ฌ ๊ฐ๋จํด์ก๋ค.
def solution(numbers, hand):
answer = ''
keypad = {
1:[0, 0], 2:[0, 1], 3:[0, 2],
4:[1, 0], 5:[1, 1], 6:[1, 2],
7:[2, 0], 8:[2, 1], 9:[2, 2],
'*':[3, 0], 0:[3, 1], '#':[3, 2]
}
last_l = keypad['*']
last_r = keypad['#']
for num in numbers:
if num in [1, 4, 7]:
answer += 'L'
last_l = keypad[num]
elif num in [3, 6, 9]:
answer += 'R'
last_r = keypad[num]
else:
if abs(last_l[0]-keypad[num][0])+abs(last_l[1]-keypad[num][1]) < abs(last_r[0]-keypad[num][0])+abs(last_r[1]-keypad[num][1]):
answer += 'L'
last_l = keypad[num]
elif abs(last_l[0]-keypad[num][0])+abs(last_l[1]-keypad[num][1]) > abs(last_r[0]-keypad[num][0])+abs(last_r[1]-keypad[num][1]):
answer += 'R'
last_r = keypad[num]
else:
if hand == 'left':
answer += 'L'
last_l = keypad[num]
else:
answer += 'R'
last_r = keypad[num]
return answer
์์ ํ์ด์์ ๋ณ์ ์ ๋ฆฌ๋ฅผ ํตํด ๋ณด๋ค ๊ฐ๋ ์ฑ์๊ฒ ์์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ๊ฒ ๋ค.
def solution(numbers, hand):
answer = ''
# ํคํจ๋ ์์ฑ
keypad = {
1:[0, 0], 2:[0, 1], 3:[0, 2],
4:[1, 0], 5:[1, 1], 6:[1, 2],
7:[2, 0], 8:[2, 1], 9:[2, 2],
'*':[3, 0], 0:[3, 1], '#':[3, 2]
}
last_l = keypad['*']
last_r = keypad['#']
# ์ข/์ฐ ํ๋ณ + ์์ง ์์น ์ค์
now = keypad[num]
from_left = abs(last_l[0] - now[0]) + abs(last_l[1] - now[1])
from_right = abs(last_r[0] - now[0]) + abs(last_r[1] - now[1])
for num in numbers:
if num in [1, 4, 7]:
answer += 'L'
last_l = now
elif num in [3, 6, 9]:
answer += 'R'
last_r = now
else:
if from_left < from_right:
answer += 'L'
last_l = now
elif from_left > from_right:
answer += 'R'
last_r = now
else:
if hand == 'left':
answer += 'L'
last_l = now
else:
answer += 'R'
last_r = now
return answer
๐ก What I learned
1. ์ ๊ทผ ๋ฐฉํฅ
- 'ํคํจ๋๋ฅผ 2์ฐจ์ ํ๋ ฌ๋ก ์๊ฐํ์ฌ ์ธ๋ฑ์ค๊ฐ์ ์ฐจ๋ฅผ ๊ฑฐ๋ฆฌ๋ก ์๊ฐํ๋ค'๋ ๋์ ์ ๊ทผ๋ฒ์ ๋ง์๋ค๊ณ ์๊ฐํ๋ค.
- ๋ค๋ง, ๋์ ๋๋ฆฌ๋ก ๊ตฌํํ ์๊ฐ์ ๋ชป ํด๋์ ๋ฟ. ์์ง ๋์ ๋๋ฆฌ ํ์ฉ ๊ฒฝํ์ด ๋ณ๋ก ์์ผ๋ ์์ฃผ ์ฌ์ฉํด๋ณด๋๋ก ํ์.
2. Python ํจ์
abs() : ์ ๋๊ฐ ๊ตฌํ๋ ํจ์
3. 2์ฐจ์ ๋ฐฐ์ด ์์ฑ ๋ฐฉ๋ฒ
ํคํจ๋๊ฐ 0~9, *, # ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ key:value๊ฐ์ ์ ๋ ฅํ์ฌ dictionary๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ ๋ฆฌํ ๋ฌธ์ ์๋ค. ๊ทธ๋ฌ๋ ๊ทธ์๋ ๋ณ๊ฐ๋ก, 2์ฐจ์ ๋ฐฐ์ด์ ๋ฐ๋ณต๋ฌธ์ ํตํด ํ์ฑํ๋ ๊ฐ์ฅ ๊ทผ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ์ด๋ฒ ๊ธฐํ์ ์ ๋๋ก ์ตํ ์ ์์๋ค.
# ํคํจ๋ 2์ฐจ์ ํ๋ ฌ ์์ฑํ๊ธฐ
keypad = [[0 for column in range(3)] for row in range(4)]
# ํคํจ๋์ ์ ๋ณด ๋ฃ๊ธฐ
key = 1
for r in range(3):
for c in range(3):
keypad[r][c] = key
key += 1
keypad[3][0], keypad[3][1], keypad[3][1] = *, 0, #
4. n์ด 1, 4, 7 ์ค ํ๋์ผ ๋
์ฌ์ํ ํฌ์ธํธ์ด๋ค. ์ง๊ธ๊น์ง๋ or ๊ตฌ๋ฌธ์ผ๋ก ํ๋ ํ๋ ๋ค ํด์์๋ค๋ฉด, ์ด์ ๋ถํฐ๋ in ๋ฉค๋ฒ ์ฐ์ฐ์์ ๋ฆฌ์คํธ๋ฅผ ํตํด ๋ณด๋ค ๊ฐ๋จํ ํํํ ์ ์๊ฒ ๋ค.
# before
if num == 1 or num == 4 or num == 7:
# after
if num in [1, 4, 7]:
'Problem Solving > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค | Python] ๊ฒ์ ๋งต ์ต๋จ๊ฑฐ๋ฆฌ (0) | 2022.06.21 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค | Python] 3์ง๋ฒ ๋ค์ง๊ธฐ (0) | 2022.06.20 |
[ํ๋ก๊ทธ๋๋จธ์ค | Python] ํฐ์ผ๋ชฌ (0) | 2022.06.20 |
[ํ๋ก๊ทธ๋๋จธ์ค | Python] ํ๊ฒ ๋๋ฒ (0) | 2022.06.17 |
[ํ๋ก๊ทธ๋๋จธ์ค | Python] ํ๋ ฌ ํ ๋๋ฆฌ ํ์ ํ๊ธฐ (0) | 2022.06.15 |