๋ชฉ์ฐจ
๐ซก Overview
์ฒด๊ฐ ๋์ด๋: โ โโโโ
์์์๊ฐ: 30๋ถ
๋ฌธ์ ๋ ๋ฒจ: Lv1. / ๋ฌธ์ ์ ํ: ๋จ์ ๊ตฌํ
ํ์ด ์ํ: ์ค์ค๋ก ํด๊ฒฐ
์ถํ: ๊ฐ๋จ๋ณต์ต
๋ฌธ์ ๋งํฌ
https://school.programmers.co.kr/learn/courses/30/lessons/67256
์๊ตฌ์ฌํญ ๋ถ์
<๋ฌธ์ ์ดํด>
์ผ์ชฝ๊ณผ ๊ฐ์ด 3*4 ๋ฒํธํ์ด ์ฃผ์ด์ง๋ค.
๋ฌธ์ : ๋๋ฅผ ์ซ์ ๋ฐฐ์ด์ด ์ฃผ์ด์ง ๋
์ด๋ค ์๊ฐ๋ฝ์ด ๋๋ ๋์ง ๋ฐฐ์ด์ ๋ฆฌํด(์ค๋ฅธ์ R, ์ผ์ L)
์๊ฐ๋ฝ ๋๋ฅด๋ ๋ฐฉ๋ฒ
- ์์์ : ์ผ์(*), ์ค๋ฅธ์(#)
- ์ผ์(1,4,7), ์ค๋ฅธ์(3,6,9)
- ๊ฐ์ด๋ฐ 2,5,8,0์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊น์ด ์๊ฐ๋ฝ์ด ๋๋ฅธ๋ค.
- ๋ง์ฝ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ, ์ผ์์ก์ด/์ค๋ฅธ์์ก์ด์ ๋ฐ๋ผ์ ๋ฌ๋ผ์ง
์์๋ฅผ ๋ณด๋ฉด, ์ด๋ ๊ฑฐ๋ฆฌ๋ ๋งจํดํผ ๊ฑฐ๋ฆฌ์ด๋ค!
์๊ฐ ๋ณต์ก๋ ๋ถ์
์ ๋ ฅ numbers 1<=len(numbers)<=1000
์ต์ ์ ๊ฒฝ์ฐ ๋งค๋ฒ 2,5,8,0์ ๋๋ฌ์ผํด์ ๋งค๋ฒ ๋๋ฌ์ผํ๋ ๋ฒํธ์ ์์น์ ์ผ์/์ค๋ฅธ์์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ผ ํ๋ค.
-> ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ O(2)*1000๋ฒ ์ด๋ฏ๋ก ์๊ฐ ๋ด์ ์ฐ์ฐํ ์ ์์ ๊ฒ ๊ฐ์๋ค.
๋์ ์ฝ๋
- ์๋ฃํ: dict
- key: ๋ฒํธํ ๋ด ์ซ์, value๋ ์์น๋ก ์ค์ ํ์ฌ, ๋ฒํธํ ์ซ์๋ฅผ ๋ฃ์ผ๋ฉด ์ขํ ์์น๊ฐ ๋์ค๋๋ก ํจ.
- ๊ทธ๋ฆฌ๊ณ ๋ฌด์ง์ฑ ๋จ์ ๊ตฌํ์ ํ๋ค.
# key: ๋ฒํธํ ๋ด ์ซ์, value๋ ์์น
coordinate = {'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],
}
def distance(current_str, num): # current: str, num : int
cx, cy = coordinate[current_str]
nx, ny = coordinate[str(num)]
return abs(cx-nx) + abs(cy-ny)
def solution(numbers, hand):
ans = ''
left, right = '*', "#"
for num in numbers:
if num in (1,4,7): # left
left = str(num)
ans += 'L'
elif num in (3,6,9): # right
right = str(num)
ans += 'R'
else: # 2,5,8,0 ์ผ ๋
l_dist = distance(left, num)
r_dist = distance(right, num)
if l_dist < r_dist:
left = str(num)
ans += 'L'
elif l_dist > r_dist:
right = str(num)
ans += 'R'
else: # ๋์ด ๋๊ฐ์ ๋
if hand == 'left':
left = str(num)
ans += 'L'
else:
right = str(num)
ans += 'R'
return ans
์ฐธ๊ณ ์ฝ๋
- ๊ฐ ์ซ์ ์ขํ ๊ตฌํ ๋ dict์ ์ฐ์ง ์๊ณ ๊ตฌํํ์
3x4์ ํ๋ ฌ์ด๊ณ , ํ๋ ฌ์ ๋ค์๊ณผ ๊ฐ์ด ์๊ฒผ๋ค.
<ํ>
1,2,3 => 0ํ
4,5,6 => 1ํ
7,8,9 => 2ํ
10,11,12 => 3ํ
=> ํ ์ธ๋ฑ์ค: (N-1)//3
<์ด>
1,4,7,10 => 0์ด
2,5,8,11 => 1์ด
3,6,9,12 => 2์ด
=> ์ด ์ธ๋ฑ์ค (N-1)%3
def distance(current, num): # current: str, num : int
cx, cy = (current - 1) // 3, (current - 1) % 3
nx, ny = (num - 1) // 3, (num - 1) % 3
return abs(cx - nx) + abs(cy - ny)
def solution(numbers, hand):
ans = ''
left, right = 10, 12
for num in numbers:
if num in (1, 4, 7): # left
left = num
ans += 'L'
elif num in (3, 6, 9): # right
right = num
ans += 'R'
else: # 2,5,8,0 ์ผ ๋
if num == 0:
num = 11
l_dist = distance(left, num)
r_dist = distance(right, num)
if l_dist < r_dist:
left = num
ans += 'L'
elif l_dist > r_dist:
right = num
ans += 'R'
else: # ๋์ด ๋๊ฐ์ ๋
if hand == 'left':
left = num
ans += 'L'
else:
right = num
ans += 'R'
return ans
๋ฐฐ์ด ์ /๋๋ ์
๊ธฐ์ด ๊ตฌํ๋ ฅ์ ํํํ ํ๋ ๊ฒ ์ค์ํ๋ค!!!
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BoJ][Python] ์๊ธฐ์ (0) | 2024.09.02 |
---|---|
[Goorm][Python] ํ๋๋ชจ๋น์ค ์ ์ฌ ํ๋ก์ ํธ (0) | 2024.09.02 |
[BoJ][Python] 2468 ์์ ์์ญ (0) | 2024.07.31 |
[์ด๋ก ] DFS- (2) ์ฌ๊ท๋ก ๊ตฌํํ๊ธฐ (0) | 2024.07.31 |
[์ด๋ก ] DFS- (1) ์คํ์ผ๋ก ๊ตฌํํ๊ธฐ (0) | 2024.07.31 |