티스토리 뷰
Programmers 의 코딩테스트 연습 탐욕법 중 Level.2 조이스틱
위아래로 움직여서 알파벳을 조정해주는 al_cnt과, 좌우로 움직여서 위치를 이동하는 move_cnt 두 가지를 따로 계산해서 answer에 합쳐주었다.
1. 조이스틱 상하 조종 - 알파벳
상하로 움직였을 때 알파벳을 계산할 때는, 각 알파벳이 가리키는 아스키코드를 활용했다.
아스키코드로 A가 65, Z가 90. 그리고 가운데에 속하는 M,N이 각각 77, 78 이다.
ord('A')=65 이런식으로 구할 수 있다.
A부터 M까지는 조이스틱 위로 하나씩 늘어나고, Z부터 N까지는 조이스틱 아래로 조종하여 al_cnt가 늘어나도록 한다.
1
2
3
4
5
6
7
8
|
al_cnt,move_cnt=0,0
name_len=len(name)
name_list=list(name)
for i in name_list:
if 65<=ord(i)<=77:
al_cnt+=ord(i)-65
elif 77<ord(i)<=90:
al_cnt+=91-ord(i)
|
2. 조이스틱 좌우 조종 - 위치
위치를 조종해주는 것은 약간 복잡했다.
자꾸 몇몇 케이스가 안된다고 떠서 if 문으로 상황을 나누어 처리해주었다.
일단 A가 아닌 알파벳들의 인덱스를 notA_list에 저장해주었다.
j는 현재위치, max1, min1은 notA_list에서 가장 작고, 큰 인덱스를 가리키는데 이 둘과 j와의 거리를 max_j, min_j 로 구해서 이 둘을 비교할 것이다.
만약 min_j가 작다면 min_j 쪽으로 가면되고, max_j가 작으면 max_j 쪽으로 이동하면 되는 것이다.
min_j와 max_j를 구하는 과정에서, j와 min1의 위치에 따라 음수가 나올 수 있으므로 abs()로 절대값으로 처리하였다.
max_j를 구할 때는 j가 max1보다 앞에 있을 때와 뒤에 있을 때의 값이 다르게 나와야 해서 if 문으로 두 가지를 따로 처리하였다.
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
|
if 'A' not in name_list:
move_cnt+=name_len-1
if 'A' in name_list:
notA_list=[] #name_list에서 A아닌 것들의 인덱스
for i in range(name_len):
if name_list[i]!='A':
type(notA_list)
j,min1,max1=0,0,0
while(len(notA_list)!=0):
min1=min(notA_list)
max1=max(notA_list)
min_j=abs(min1-j)
if j>=max1:
max_j=j-max1
elif j<max1:
max_j=name_len-max1+j
if min_j<=max_j:
print("min_j,max_j:",min_j,max_j)
move_cnt+=min_j
if j==min1 and j==0:
j=min1
else:
j=min1
elif min_j>max_j:
print("min_j,max_j:",min_j,max_j)
move_cnt+=max_j
j=max1
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
<전체 코드>
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
|
def solution(name):
answer = 0
al_cnt,move_cnt=0,0
name_len=len(name)
name_list=list(name)
#상하이동 al_cnt
for i in name_list:
if 65<=ord(i)<=77:
al_cnt+=ord(i)-65
elif 77<ord(i)<=90:
al_cnt+=91-ord(i)
#좌우이동 move_cnt
if 'A' not in name_list:
move_cnt+=name_len-1
if 'A' in name_list:
notA_list=[] #name_list에서 A아닌 것들의 인덱스
for i in range(name_len):
if name_list[i]!='A':
type(notA_list)
j,min1,max1=0,0,0
while(len(notA_list)!=0):
min1=min(notA_list)
max1=max(notA_list)
min_j=abs(min1-j)
if j>=max1:
max_j=j-max1
elif j<max1:
max_j=name_len-max1+j
if min_j<=max_j:
move_cnt+=min_j
if j==min1 and j==0:
j=min1
else:
j=min1
elif min_j>max_j:
move_cnt+=max_j
j=max1
answer=al_cnt+move_cnt
return answer
|
'알고리즘, 코딩테스트 > 프로그래머스 문제풀이' 카테고리의 다른 글
[파이썬] 프로그래머스 Level.3 | 이분탐색 | 입국심사 (0) | 2020.01.29 |
---|---|
[파이썬] 프로그래머스 Level.3 | 이분탐색 | 예산 (0) | 2020.01.29 |
[파이썬] 프로그래머스 Level.2 | 탐욕법(greedy) | 큰 수 만들기 (0) | 2020.01.29 |
[파이썬] 프로그래머스 Level.3 | 탐욕법(greedy) | 저울 (0) | 2020.01.29 |
[파이썬] 프로그래머스 Level.3 | 탐욕법(greedy) | 섬 연결하기 (0) | 2020.01.29 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- partyrock
- partyrock생성
- AWSBedrock
- BOJ
- 알고리즘
- 술자리병돌리기게임
- PYTHON
- awsgenai
- partyrock무료
- 파이썬
- easycode
- 정적 웹페이지 배포
- 코딩테스트
- partyrock앱
- 정적 웹사이트 배포
- genaiapp
- React native 작동 원리
- partyrock사용볍
- aws생성형ai
- 병돌리기구현
- easycode chatGPT
- vscode easycode
- S3 403 forbidden
- 백준
- S3배포
- SpacewBetween
- 생성형AI
- 오블완
- 티스토리챌린지
- ChatGPT
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함