https://school.programmers.co.kr/learn/courses/30/lessons/17686

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


내 풀이

import re
def solution(files):
    target = '([0-9]+)'
    
#     test= [(1,i) for i in range(0,100)]
    
#     test = sorted(test,key = lambda x:x[0])
#     print(test)
    
    temp = [re.split(target,s) for s in files]
    sort = sorted(temp, key = lambda x: (x[0].lower(), int(x[1])))
    
    return [''.join(s) for s in sort]

문제를 풀면서 조금 신경쓰였던 부분이 안정 정렬 부분이였다. 안정 정렬에 관한 내용을 분명 배웠고 무슨 내용인지는 아는데

파이썬에서 기본적으로 제공하는 sorted 와 sort가 안정정렬인지에 관하여 확신을 할 수 없었다.

그래서 그냥 실험으로 확인해보았다(주석부분). 그 후에 이 부분에 관하여 궁금하여 공식문서를 찾아았다 

https://docs.python.org/3/howto/sorting.html

 

Sorting HOW TO — Python 3.10.7 documentation

Sorting HOW TO Author Andrew Dalke and Raymond Hettinger Release 0.1 Python lists have a built-in list.sort() method that modifies the list in-place. There is also a sorted() built-in function that builds a new sorted list from an iterable. In this documen

docs.python.org

찾아보면 알겠지만 stable하다고 나온다.

 

문제에서 요구하는 조건은 총 3가지인데

일전에 텐서플로우를 공부할 때 배웠던 정규식으로 풀어보았다.

 

target을 기준으로 나누는데

타겟의 조건은 0부터 9까지 즉 숫자가 존재하는지 여부이다. 뒤에 +는 반복인데 1번이상 나올때만 체크된다.

긍까 숫자가 한자리 숫자만 나오는게 아니라 여러자리 숫자가 나올 수 있기 때문에 +는 넣어줘야한다.

이후에 정렬 해주는데 기준을 두가지로 정렬해준다. 첫번째는 head를 lower()로 바꿔서, 두번째는 숫자를 기준으로

어렵지 않은 문제였는데 정규식이 아니였다면 엄청나게 돌아갔을거 같기도 한 문제이다.

 


다른사람의 풀이

 



 

'취준 > 프로그래머스' 카테고리의 다른 글

롤케이크 자르기 - 파이썬  (0) 2022.11.02
2개 이하로 다른 비트 - 파이썬  (0) 2022.10.17
n^2 배열 자르기 - 파이썬  (0) 2022.10.11
방문 길이 - 파이썬  (1) 2022.10.05
야근 지수 - 파이썬  (0) 2022.09.13

 

https://programmers.co.kr/learn/courses/30/lessons/42860

 

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

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

programmers.co.kr


내 풀이

 

def solution(name):
    original_l = 'a' * len(name)
    original_U = 'A' * len(name)
    answer= 0
    count = len(name) - 1
    
    for i in range(len(name)):
        answer +=min( abs( ord(name[i]) - ord(original_U[i]) ), abs( ord( original_l[i])-6-ord(name[i])))
        
        next_idx = i + 1
        while next_idx < len(name) and name[next_idx] == 'A':
            next_idx += 1
        
        count = min([count,2 *i + len(name) - next_idx, i + 2 * (len(name) -next_idx)])
            
    answer += count
    
    return answer

첫째로 구해야 할것은

알파벳을 몇개나 바꿔야 하는가.

이는 아스키코드로 알 수 있는데

A=65이다. 근데 우리가 하나 유념해야할것은, 비록 대문자만 받아들인다고 하더라도 거꾸로 갈 경우도 있다는것이다.

예를들어 A=65, Z=90 이므로 90 - 65 = 25로 총 25번을 움직여야하는데 실제로는 한번만 움직이면 된다.

그래서 내가 생각한 방법이 소문자 a에서 빼는것인데 소문자 a=97 이다.

근데 97 - 90 = 7이다. 그 이유는 대문자와 소문자 사이에 특수문자 6개가 있어서이다.

그래서 소문자 - 대문자 - 6을 해줘야한다. 

유니코드

(대문자 - 대문자),(소문자 - 대문자 - 6 ) 중에 더 작은 수를 택하면 된다.

 

두번째로 생각해볼 내용은

좌로 가는게 유리한지 우로 가는게 유리한지를 생각해봐야 한다.

가장 단순한 방법은 바꿔줘야 할 문자가 존재하든 존재하지 않든, 우로 쭉 가는것이다.

이 경우 문자열의 길이 - 1 만큼 바꿔주면 된다.

두번째로는 'A'를 만나기전까지 우측으로 가다가 'A'를 만나면 좌측으로 가고, 최초에 만난 'A'를 만나기전까지 좌측으로 가는 방법이다.

세번째는 두번째 방법과 동일한데 좌측을 먼저 탐색하는것이다.

 


다른사람의 풀이

 



 

'취준 > 프로그래머스' 카테고리의 다른 글

괄호 회전하기 - 파이썬  (0) 2022.07.25
게임 맵 최단거리 - 파이썬  (0) 2022.07.05
소수 찾기 - 파이썬  (0) 2022.07.02
가장 큰 수 - 파이썬  (0) 2022.07.01
프린터 - 파이썬  (0) 2022.06.27

+ Recent posts