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

 

프로그래머스

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

programmers.co.kr

 

absolutes와 signs의 ordering이 같기 때문에 쉬운 문제다. 

 

def solution(absolutes, signs):
    answer = 0
    for i, sign in enumerate(signs):
        if sign:
            answer+=absolutes[i]
        else:
            answer-=absolutes[i]
    return answer

 

베스트 풀이는 한줄로 했다. 

def solution(absolutes, signs):
    return sum(absolutes if sign else -absolutes for absolutes, sign in zip(absolutes, signs))

개인적으론 저런 스타일을 싫어한다. 

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

 

프로그래머스

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

programmers.co.kr

 

def solution(participant, completion):
    answer = {}
    for p in participant :
        answer[p] = answer.get(p,0) +1
    for c in completion :
        answer[c] -= 1
    for a in answer:
        if answer[a]>0:
            return a

 

딕셔너리 get 함수의 유연성을 배웠다. 

keys() 매서드를 이용해 키를 조회하는 것은 O(1)이지만

불필요한 if/else 문의 사용을 줄일 수 있다. 

default 값은 키값을 조회해 없으면 default value로 초기화도 해준다.

 

그런데 베스트 풀이는 혁명적이었다. 

import collections

def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]

카운터 객체에서 - 연산자가 재정의 되어 있었다. 

이것이 가능하다니!! 

참으로 유용한 기능이 아닐수 없다. 

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

 

코딩테스트 연습 - 크레인 인형뽑기 게임

[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] [1,5,3,5,1,2,1,4] 4

programmers.co.kr

2019 카카오 겨울 인턴십 기출

 

내 풀이

def solution(board, moves):
    answer = 0
    grid_num = len(board) 
    stack =[]
    for move in moves:
        for i in range(grid_num):
            if board[i][move-1]!=0:
                stack.append( board[i][move-1])
                if len(stack)>=2 and stack[-1] == stack[-2]:
                    stack = stack[:-2]
                    answer+=2
                board[i][move-1]=0
                break
    return answer

 

베스트 풀이

def solution(board, moves):
    stacklist = []
    answer = 0

    for i in moves:
        for j in range(len(board)):
            if board[j][i-1] != 0:
                stacklist.append(board[j][i-1])
                board[j][i-1] = 0

                if len(stacklist) > 1:
                    if stacklist[-1] == stacklist[-2]:
                        stacklist.pop(-1)
                        stacklist.pop(-1)
                        answer += 2     
                break

    return answer

구지 팝을 할 필요가 있을까? 

그냥 슬라이싱 하면 되잖아.. 

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

 

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

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

programmers.co.kr

출처 : 2021 카카오 채용연계형 인턴쉽

 

내 풀이

def solution(s):
    answer = ""
    current =""
    pair_tuple={'zero':0,'one':1,'two':2,'three':3,'four':4,'five':5,'six':6,'seven':7,'eight':8,'nine':9}
    keys = list(pair_tuple.keys())
    for elem in s:
        try:
            t=int(elem)
            answer+=elem
            current=""
        except:
            current+=elem
            if current in keys:
                t = pair_tuple[current]
                answer+=str(t)
                current=""
    return int(answer)

 

베스트 풀이를 보니, 내답변과 비교했을 때 

튜플이나 딕셔너리로 바로 값을 얻을수 있다라는것 까지는 유사했는데.. 

 

베스트풀이

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

def solution(s):
    answer = s
    for key, value in num_dic.items():
        answer = answer.replace(key, value)
    return int(answer)

작동하는 기능도 거의 똑같이 구현되었는데, 

그게 파이썬 내장기능에 있었다. 

str 데이터 타입에 .replace()라는 함수로 이것이 해결 가능했다! 

이런 하나하나를 알고 잘 쓸줄 알게 되면 어이없는 코드 실수를 줄이고 빠른 구현 속도와 가독성을 높일 수 있다라는것을 다시한번 반성했다.  

+ Recent posts