HelloMinchan
처음처럼
HelloMinchan
LinkedIn
전체 방문자
오늘
어제
  • 분류 전체보기 (306)
    • Backend (4)
      • NestJS (1)
      • Express (1)
      • Spring (2)
    • Infrastructure (1)
      • AWS (1)
    • Frontend (1)
      • Next.js (1)
    • Language & Runtime (4)
      • Java (2)
      • Node.js (2)
    • Computer Science (8)
      • Computer Networks (3)
      • Operating Systems (4)
      • OOP (1)
    • 독서 (4)
      • 데이터 중심 애플리케이션 설계 (3)
      • 객체지향의 사실과 오해 (1)
    • 회고 (4)
      • Project (2)
      • Career (2)
    • Deprecated (280)

채널

  • GitHub
  • LinkedIn

최근 글

태그

  • 개발자
  • 알고스팟Python
  • 백준Go
  • programmers
  • 백준C++
  • Algospot
  • 알고스팟
  • 코딩
  • 백엔드
  • front-end
  • 프로그래머스C++
  • 백준Python
  • 프로그래밍
  • Baekjoon Online Judge
  • 프로그래머스Python
  • 프로그래머스
  • 백준
  • back-end
  • 데이터베이스
  • Database

최근 댓글

인기 글

hELLO
HelloMinchan

처음처럼

[programmers] 프로그래머스 조이스틱(Python)
Deprecated

[programmers] 프로그래머스 조이스틱(Python)

2020. 6. 19. 20:46

(주)그렙

[programmers] 프로그래머스 조이스틱

(Python)

(글쓴날 : 2020.06.19)

 


* programmers, 프로그래머스 문제 Python 언어 풀이입니다.

* 소스 코드의 저작권은 글쓴이에게 있습니다.


 

 

프로그래머스 조이스틱


1) 문제

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42860

 

코딩테스트 연습 - 조이스틱

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다

programmers.co.kr


2) 풀이 과정

* 시간 복잡도 : O(n)

 

영어 대문자로 이루어진 문자열이 주어질 때, 특정 규칙에 맞춰 모두 'A'로 변환하는 최소 횟수를 구하는 문제입니다.

 

저의 경우, 그리디를 적용하였고, Python을 사용했습니다.

먼저, 주어지는 문자열을 리스트로 변환한 후, 'A'가 아닌 문자의 개수를 세어 모두 'A'로 이루어진 문자열을 예외 처리함과 동시에 반복문을 탈출할 조건을 만들었습니다.

그 후, 'A'가 아닌 문자를 만날 때마다 위아래 방향으로 최소 횟수만큼 움직여 'A'로 바꾼 뒤, 다음 'A'가 아닌 문자를 찾는데, 현재 위치에서 오른쪽, 왼쪽으로 탐색해가며 두 방향 중 최소 횟수인 곳을 먼저 찾았습니다. 만약, 두 방향의 횟수가 서로 같다면 오른쪽에 우선순위가 있으므로 오른쪽을 체크하는 조건문을 왼쪽을 체크하는 조건문보다 위에 두었고, 그렇게 총 움직인 횟수를 구해 문제를 해결했습니다.


3) 코드

 

* Python 코드

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
def solution(name):
    answer = 0
    name = list(name)
    
    shouldChange = 0
    for n in name:
        if n != 'A':
            shouldChange += 1
    
    if not shouldChange:
        return 0
    
    goLeft = 0
    goRight = 0
    index = 0
    
    while 1:
        if name[index] != 'A':
            answer += min(ord('Z') - ord(name[index]) + 1, ord(name[index]) - ord('A'))
            
            name[index] = 'A'
            shouldChange -= 1
        
        if not shouldChange:
            break
            
        goLeft = goRight = index
        move = 0
 
        while 1:
            goRight += 1
            goLeft -= 1
            move += 1
 
            if goLeft < 0:
                goLeft = len(name) - 1
            if goRight > len(name) - 1:
                goRight = 0
 
            if name[goRight] != 'A':
                answer += move
                index = goRight
                break
            elif name[goLeft] != 'A':
                answer += move
                index = goLeft
                break
            
    return answer

 

저작자표시 비영리 변경금지 (새창열림)

'Deprecated' 카테고리의 다른 글

[programmers] 프로그래머스 괄호 변환(Python)  (0) 2020.06.19
[programmers] 프로그래머스 소수 찾기 Level 2(Python)  (0) 2020.06.19
[programmers] 프로그래머스 가장 큰 수(Python)  (0) 2020.06.19
[programmers] 프로그래머스 더 맵게(Python)  (0) 2020.06.19
[Baekjoon Online Judge] 백준 3665번 최종 순위(Python)  (0) 2020.06.17
    'Deprecated' 카테고리의 다른 글
    • [programmers] 프로그래머스 괄호 변환(Python)
    • [programmers] 프로그래머스 소수 찾기 Level 2(Python)
    • [programmers] 프로그래머스 가장 큰 수(Python)
    • [programmers] 프로그래머스 더 맵게(Python)
    HelloMinchan
    HelloMinchan
    Though you should not fear failure, You should do your very best to avoid it.

    티스토리툴바