문제

문제

 

programmers.co.kr/learn/courses/30/lessons/17683

 

코딩테스트 연습 - [3차] 방금그곡

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,

programmers.co.kr

 

처음 작성한 코드

def solution(m, musicinfos):
    answer = ''
    maxTime = 0
    m = m.replace('C#','c').replace('D#','d').replace('F#','f').replace('G#','g').replace('A#','a')
    for i in musicinfos:
        tmp = i.split(',')
        runningTime = (int(tmp[1].split(':')[0]) - int(tmp[0].split(':')[0]))*60 + (int(tmp[1].split(':')[1]) - int(tmp[0].split(':')[1]))
        tmp[3] = tmp[3].replace('C#','c').replace('D#','d').replace('F#','f').replace('G#','g').replace('A#','a')
        mok, namaji = divmod(runningTime, len(tmp[3]))
        music = tmp[3]*mok+tmp[3][:namaji]
        if m in music:
            if maxTime < runningTime:
                maxTime = runningTime
                answer = tmp[2]
    return answer if answer else "(None)"

 

깨달은 점

  • 카카오 코테는 문제 조건만 맞추면 거의 대부분 통과한다. (효율성 테스트 없을때...^^)
  • 반환할 때, return answer if 조건 else 반환값 이런 식으로도 사용할 수 있다.
  • 사람들 생각하는 거 다 비슷하다..

문제

문제

programmers.co.kr/learn/courses/30/lessons/17686

 

코딩테스트 연습 - [3차] 파일명 정렬

파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램

programmers.co.kr

 

처음 작성한 코드

def solution(files):
    import re
    answer = [[i,re.findall('([a-zA-Z-.]+)(\d+)',files[i].lower())] for i in range(len(files))]
    answer.sort(key= lambda x:(x[1][0][0],int(x[1][0][1])))
    result = []
    for i in answer:
        result.append(files[i[0]])
    return result
  1. 문자와 숫자 부분을 정규식을 통해 나눈다.
  2. 문자부분과 숫자부분을 key로 하여 정렬한다.
  3. 정렬된 배열에 인덱스를 참조하여 반환할 배열에 넣어준다.

answer 초기 값들

 -> 처음에 index를 함께 넣어서 정렬이 됐을 때, 만약 5,2,3,4,1 이렇게 되면 5번째 인덱스 먼저 append하게 짜려고 index도 함께 저장했다.

 

깨달은 점

  • 정규식에 대해 한번 더 짚고 넘어간다. '?' 이걸 쓰면 있어도 되고 없어도 된다는 뜻이다.
  • 코드에서 [a-zA-Z-. ]라고만 안하고 ( ) 이걸로 묶은 이유는 그렇게 되면 [문자, 숫자] 배열로 뽑아주기 때문이다. ( )이걸로 안 묶으면 그냥 문자열로 뽑아준다.
  • sort 할 때, key를 두개 줄 수 있다. 여기서는 첫째로 문자를 하고 첫째가 같으면 숫자로 판별하는 ? 그렇게 하기 때문에 key를 저렇게 줬다. x[1][0][0]가 문자고 x[1][0][1]가 문자열형식의 숫자 즉 '123' 이거라 int로 형변환 했다.

'Programmers' 카테고리의 다른 글

[프로그래머스] 방금그곡  (0) 2021.02.08
[프로그래머스] n진수 게임  (0) 2021.02.05
[프로그래머스] 짝지어 제거하기  (0) 2021.01.30
[프로그래머스] 폰켓몬  (0) 2021.01.30
[프로그래머스] 소수 만들기  (0) 2021.01.28

문제

문제

programmers.co.kr/learn/courses/30/lessons/17687

 

처음 작성한 코드

def tenToWhat(num,what):
    result = []
    remain = ['A','B','C','D','E','F']
    while num:
        num, namaji = divmod(num,what)
        if namaji>=10:
            namaji-=10
            result.append(remain[namaji])
        else: result.append(str(namaji))
    return ''.join(result[::-1])

def solution(n, t, m, p):
    num = 1
    tmp = '0'
    while True:
        if len(tmp)>t*m:
        	tmp = tmp[:t*m]
            break
        tmp+= tenToWhat(num, n)
        num+=1
    answer = [tmp[i] for i in range(len(tmp)) if i%m==p-1]
    return ''.join(answer)

 

코드 리뷰 후

def tenToWhat(num,what):
    result = []
    remain = ['A','B','C','D','E','F']
    while num:
        num, namaji = divmod(num,what)
        if namaji>=10:
            namaji-=10
            result.append(remain[namaji])
        else: result.append(str(namaji))
    return ''.join(result[::-1])

def solution(n, t, m, p):
    num = 1
    tmp = '0'
    while True:
        if len(tmp)>t*m:
            break
        tmp+= tenToWhat(num, n)
        num+=1
    answer = tmp[p-1::m][:t]
    return ''.join(answer)

 

깨달은 점

  • array[a:b:c]의 사용법을 알게되었다. a부터 b까지 c의 간격만큼의 의미를 갖고있다. 사람수(m)만큼 간격을 가지면서 p-1부터 시작하면 그게 맞는 값이 answer에 저장되고 문자열로 반환하게 작성하였다.

문제

문제

programmers.co.kr/learn/courses/30/lessons/12973

 

코딩테스트 연습 - 짝지어 제거하기

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙

programmers.co.kr

 

처음 작성한 코드

def solution(s):
    stack = []
    for i in s:
        if not stack:
            stack.append(i)
            continue
        if stack[-1] == i:
            stack.pop()
        else: stack.append(i)
    if stack: return 0
    else: return 1

 

깨달은 점

  • 처음에 이중포문 가지고 코드를 작성했는데 시간초과가 너무 많이나서 스트레스 받다가 스택 사용하라는 힌트를 보고 스택으로 바꿔서 풀었더니 바로 통과했다... 저걸 보고 어떻게 스택 생각을 해? ㅋㅋ 재밌네~

문제

문제

programmers.co.kr/learn/courses/30/lessons/1845

 

코딩테스트 연습 - 폰켓몬

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.

programmers.co.kr

 

처음 작성한 코드

def solution(nums):
    leng = len(nums)//2
    nums = set(nums)
    if len(nums)<leng:
        return len(nums)
    return leng

 

코드 리뷰 후

def solution(nums):
    return min(len(set(nums)),len(nums)//2)

 

깨달은 점

  • 처음에는 combinations를 사용하여 모든 조합을 만들어놓고 set(len())을 이용하여 길이가 제일 긴 조합의 길이를 반환하려고 했는데 시간 초과가 났다. 그래서 다시 생각해보니까 먼저 set()을 걸어놓으면 될 것 같았다. set을 해놓고 leng만큼 combinations을 했는데 컴파일 에러가 났다. 이유를 생각해보니 만약 nums = [1,1,1,1] 이면 set(nums) -> {1} 이게 되고 leng == 2이기 때문에 에러가 나는 것이었다. 그러면 처음에 set(nums)와 leng을 비교하여 위와 같은 경우라면(set()이 더 작으면) set(nums)의 길이를 반환하고, 아니면 combinations을 또 해서 그 중 길이가 제일 긴 조합의 길이를 반환하려고 했는데 생각해보니 저 위의 조건에서 안 걸리면 어찌됐든 len(nums)//2 만큼 뽑히는 거기 때문에 그냥 len(nums)//2를 반환하게 작성했다.

문제

문제

programmers.co.kr/learn/courses/30/lessons/12977

 

코딩테스트 연습 - 소수 만들기

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때

programmers.co.kr

 

처음 작성한 코드

def solution(nums):
    from itertools import combinations
    answer = 0
    hubo = combinations(nums,3)
    for i in [sum(i) for i in hubo]:
        for j in range(2,i):
            if i%j == 0:break
        else: answer+=1
    return answer

 

문제

문제

 

programmers.co.kr/learn/courses/30/lessons/12981

 

코딩테스트 연습 - 영어 끝말잇기

3 [tank, kick, know, wheel, land, dream, mother, robot, tank] [3,3] 5 [hello, observe, effect, take, either, recognize, encourage, ensure, establish, hang, gather, refer, reference, estimate, executive] [0,0]

programmers.co.kr

 

처음 작성한 코드

def solution(n, words):
    for i in range(1, len(words)):
        if words[i] in words[:i] or words[i-1][-1] != words[i][0]:
            th, who = divmod(i,n)
            return [who+1, th+1]
    else:
        return [0,0]

 

깨달은 점

  • for-else문 좋다.

문제

* [조건]을 만족하는 사람 중 코딩테스트 점수를 X점 이상 받은 사람은 모두 몇 명인가?

문제

programmers.co.kr/learn/courses/30/lessons/72412

 

코딩테스트 연습 - 순위 검색

["java backend junior pizza 150","python frontend senior chicken 210","python frontend senior chicken 150","cpp backend senior pizza 260","java backend junior chicken 80","python backend senior chicken 50"] ["java and backend and junior and pizza 100","pyt

programmers.co.kr

 

처음 작성한 코드 (효율성 미통과)

def solution(info, query):
    answer = [0]*len(query)
    info = [i.split() for i in info]
    query = [i.replace(" and",'').split() for i in query]
    for i in range(len(query)):
        for j in info:
            for k in zip(query[i][:-1],j[:-1]):
                if '-' not in k:
                    if k[0] != k[1]:
                        break
            else: 
                if int(query[i][-1]) <= int(j[-1]):
                    answer[i]+=1
        
    return answer

 

깨달은 점

  • 효율성 통과 못했다..
  • 정확성은 다 했는데..

문제

1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
     만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.

문제

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

 

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

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

programmers.co.kr

 

처음 작성한 코드

def solution(new_id):
    import re
    new_id = ''.join(re.findall('[a-z0-9-_.]',new_id.lower()))
    while True:
        new_id = new_id.replace('..','.')
        if new_id.find("..") == -1: break
    new_id = list(new_id)
    if new_id[0] == '.': (new_id).pop(0)
    if new_id:
        if new_id[-1] == '.': (new_id).pop()
    if not new_id: new_id.append('a')
    if len(new_id)>=16:
        new_id = new_id[:15]
        if new_id[-1]=='.': new_id.pop()
    if len(new_id)<=2:
        last = new_id[-1]
        while len(new_id)<3:
            new_id.append(last)    
    return ''.join(new_id)

 

코드 리뷰 후

def solution(new_id):
    import re
    new_id = re.sub('[^a-z0-9\-_.]','',new_id.lower())
    new_id = re.sub('\.+','.',new_id)
    new_id = re.sub('^[.]|[.]$','',new_id)
    if not new_id: new_id = 'a'
    if len(new_id)>=16: new_id = new_id[:15]
    new_id = re.sub('[.]$','',new_id)
    if len(new_id)<=2:
        last = new_id[-1]
        while len(new_id)<3:
            new_id += last
    return new_id

 

깨달은 점

  • re.sub(정규식, 대체할 문자열, 대체될 문자열) 로 쓸 수 있다.
  • ^[문자열] -> 문자열로 시작
  • [문자열]$ -> 문자열로 끝
  • '\d+' -> 0-9까지의 수가 여러번 나옴
  • '\.+' -> .이 여러번 나옴