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://school.programmers.co.kr/learn/courses/30/lessons/17680?language=python3 

 

프로그래머스

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

programmers.co.kr


내 풀이

from collections import deque

def solution(cacheSize, cities):
    time=0
    cache = deque()
    
    cities=[i.lower() for i in cities]
    
    
    for i in cities:
        if len(cache) <cacheSize:
            if i in cache:
                time +=1
                cache.append(i)
                cache.remove(i)
            else:
                cache.append(i)
                time+=5
        else:
            if i in cache:
                time+=1
                cache.append(i)
                cache.remove(i)
                
            else:
                cache.append(i)
                cache.popleft()
                time+=5
        
        
        
                
            
    return time


다른사람의 풀이

def solution(cacheSize, cities):
    import collections
    cache = collections.deque(maxlen=cacheSize)
    time = 0
    for i in cities:
        s = i.lower()
        if s in cache:
            cache.remove(s)
            cache.append(s)
            time += 1
        else:
            cache.append(s)
            time += 5
    return time

maxlen으로 길이를 정해줄수있다는것을 배웠다.


 

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

최고의 집합 - 파이썬  (0) 2022.09.11
주차 요금 계산 - 파이썬  (0) 2022.09.09
두 큐 합 같게 만들기 - 파이썬  (0) 2022.08.31
성격 유형 검사하기 - 파이썬  (0) 2022.08.31
배달 - 파이썬  (0) 2022.07.27

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


def solution(numbers,hand):
    answer=''
    Left_current = 10
    Right_current = 12
    for x in numbers:
        if x==1 or x==4 or x==7:
            answer +='L'
            Left_current = x
        elif x==3 or x==6 or x==9:
            answer +='R'
            Right_current = x
        else:
            if x==0:
                x=11
                
            Ldis = abs(Left_current-x) //3 + abs(Left_current-x) %3
            Rdis = abs(Right_current-x) //3 + abs(Right_current-x) %3
            if Ldis > Rdis:
                answer +='R'
                Right_current = x
            elif Ldis < Rdis:
                answer +='L'
                Left_current =x
            else:
                if hand=='right':
                    answer +='R'
                    Right_current=x
                else:
                    answer+='L'
                    Left_current=x
    return answer


문제를 처음봤을 때 느낀점은 귀찮겠다.. 였다

이 풀이의 중점은 특수문자를 숫자로 치환한다는거다.

또 그걸이용해서 키패드 간의 거리를 나타낼 수 있다

 

 

1 2 3

4 5 6

7 8 9

10 11 12

 

이런식으로 치환하는것이다.

그렇다면 여기서 거리는 어떻게 구할 수 있을까?

각 키패드간의 거리는 무조건 1이라고 했으니까

각 키패드를 x,y값으로 생각하고 x값의 차 + y값의 차 = 키패드간의 거리가 된다.

그럼 키패드간의 거리는 어떻게 구할 수 있을까?

특성을 생각하면 간단하게 구할 수 있는데

예를들어서 1열을 예로들어보면

1 4 7 10 이다.

이는 3으로 나눴을때 몫이 +1씩 증가하는 규칙을 가지고 있다.

1//3=0 4//3=1 7//3=2 10//3=3

또 1행을 예로 들어서보면

1 2 3 인데 얘들은 3으로 나눴을때 나머지가 1 2 0 을 반복하는 형태로 나온다.

1%3=1 2%3=2 3%3=0

 

고로 이를 정리해보면 키패드간의 거리는

 

두 넘버패드의 거리차이 //3 + 두 넘버패드의 거리차이 %3 으로 정리할수 있겠다

 

가령

 

현재 왼손이 7,오른손이 6 목표가 2라고하면

abs((7-2)) // 3 + abs((7-2)) %3  = 1 + 2 = 3

왼손과 다음목표까지의 거리=3

abs((6-2))//3 + abs((6-2))%3 = 1 + 1 = 2

오른손과 다음목표까지의 거리 =2

 

따라서 오른손이 더 가까움을 알 수 있다.

 

 

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

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr


내 풀이

 

from string import punctuation


def solution(new_id):
    new_id=new_id.lower()
    
    symbols=punctuation.replace('-','').replace('_','').replace('.','') 
    
    for symbol in symbols:
              new_id = new_id.replace(symbol,'')
    while '..' in new_id:
         new_id = new_id.replace('..','.')
    if new_id.startswith('.') or new_id.endswith('.'):
        new_id=new_id.strip('.')
    if not new_id:
        new_id='a'
    if len(new_id) >=16:
        new_id=new_id[:15]
        if new_id[-1]=='.':
            new_id=new_id[:-1]
    
    while len(new_id)<3:
          new_id += new_id[(len(new_id)-1)]   
    return new_id


다른사람의 풀이

import re

def solution(new_id):
    st = new_id
    st = st.lower()
    st = re.sub('[^a-z0-9\-_.]', '', st)
    st = re.sub('\.+', '.', st)
    st = re.sub('^[.]|[.]$', '', st)
    st = 'a' if len(st) == 0 else st[:15]
    st = re.sub('^[.]|[.]$', '', st)
    st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])
    return st

정규식 연습하기 제일 좋은 문제라고 생각했는데 자꾸 테스트케이스 하나가 오류가 나서 포기하고 저렇게 풀었다.

두번째는 정규식으로 푼 모범답안

정규식을 알면 굉장히 쉽고 이쁘게 풀린다는걸 알 수 있다.

punctuation 라는 모듈은 특수모음 모음집이다.

punctuation안에 -,_ 를 공백으로 대체해서 걔내 들은 빼고 검사한 거다. 나름 이쁘게 풀었다고 생각했는데 역시 정규식이 짱이였다.

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

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr


 



def solution(id_list,report,k):
     answer=[0] * len(id_list)
     Reports = {id: [] for id in id_list}
     report = set(report)
     reported_howmany={}
     suspend=[]
     for i in report:
          report = i.split(' '//여기서 report[0] = 신고한 사람 report[1] = 신고당한 사람이 된다.
         
          Reports[report[0]].append(report[1])
         
          if report[1] not in reported_howmany:
               reported_howmany[report[1]]=0
          reported_howmany[report[1]] +=1
          if reported_howmany[report[1]] >=k:
               suspend.append(report[1])

     for s in suspend:
          for i in range(len(id_list)):
               if s in Reports[id_list[i]]:
                    answer[i] +=1
     
         
     return answer


가장 좋아요를 많이 받은 모범답안

def solution(id_list, report, k):
    answer = [0] * len(id_list)    
    reports = {x : 0 for x in id_list}

    for r in set(report):
        reports[r.split()[1]] += 1

    for r in set(report):
        if reports[r.split()[1]] >= k:
            answer[id_list.index(r.split()[0])] += 1

    return answer



난이도에 비해 꽤 오래 고민했고 실제로 많이 틀렸던 문제다.

구조는 유사한데 코드 자체가 훨씬 깔끔하다.

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

 

코딩테스트 연습 - 숫자 문자열과 영단어

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자

programmers.co.kr


 

def solution(s):
     answer = s
     

     num_in_eng={'zero':0, 'one':1, 'two':2, 'three':3, 'four':4, 'five':5, 'six':6, 'seven':7, 'eight':8, 'nine':9}

     for i in num_in_eng.items():
          answer = answer.replace(i[0],str(i[1]))
     
     
     return int(answer)


내용 자체는 단순하다. 보자마자 사전으로 풀면되겠다고 생각했고 쉽게 풀렸다. 딱히 설명이 필요한거같지 않아 정답만 올린다. 
하나 주의 할 것은 int() 정수문자열(interger string) 실수만 인수로 받을 수 있음을 생각해야한다.

+ Recent posts