본문 바로가기
Algorithm/etc

[파이썬] 프로그래머스 레벨1

by 베짱이28호 2023. 3. 30.

프로그래머스 Lv1

1회독 목표 : 빨리풀기, 정답맞추기

(2회독 목표 : 코드 길이/복잡도 줄이기)

가나다순 정렬 ctrl + F로 찾기~


가운데 글자 가져오기

def solution(s):
    answer = ''
    if len(s)%2 == 1 :
        answer += s[int(len(s)/2)]
    else : 
        answer += s[int(len(s)/2)-1:int(len(s)/2)+1]
    return answer

가장 가까운 같은 글자

def solution(s):
    a = 'abcdefghijklmnopqrstuvwxyz'
    b = [-1 for i in range(len(a))]
    table =  dict(zip(a,b))
    temp = []
    for i in range(len(s)):
        if table[s[i]] == -1 :
            temp.append(-1)
            table[s[i]] = i
        else :
            temp.append(i-table[s[i]])
            table[s[i]] = i
    return temp

같은 숫자는 싫어

def solution(arr):
    answer = [arr[0]]
    for i in range(1,len(arr)):
        if answer[-1] != arr[i]:
            answer.append(arr[i])
    return answer

기사단원의 무기

def solution(number, limit, power):
    fe = 0
    for i in range(1, number + 1):  # 기사단원 루프
        count = 0  # 약수개수 아직 안셌음
        for j in range(1, int(i ** 0.5) + 1):  # 제곱근까지만 돌면서 약수 개수 세기
            if i % j == 0:  # 나머지0이면 약수
                if j * j == i:  # 중복 약수인 경우는 빼줌
                    count += 1
                else:
                    count += 2  # 두 개의 약수 추가
        if count > limit:
            count = power
        fe += count
    return fe

제곱근 이상으로 탐색하면 시간복잡도때문에 오류발생


개인정보 수집 유효기간 (2023 KAKAO BLIND RECRUITMENT)

def solution(today, terms, privacies):
    
    today_y,today_m,today_d = map(int,today.split('.'))
    today_int = today_y*12*28+today_m*28+today_d

    temp_policy,temp_terms = [],[]

    for i in range(len(terms)): # terms 약관에 따른 기간 dict
        x,y = terms[i].split()
        temp_policy.append(x)
        temp_terms.append(y)
    table = dict(zip(temp_policy,temp_terms))

    result = []
    for i in range(len(privacies)):
        ymd = privacies[i][:10]
        policy = privacies[i][-1]
        y,m,d = map(int,ymd.split('.'))
        temp_int = y*12*28+(m+int(table[policy]))*28+d
        if today_int >= temp_int  :
            result.append(i+1)

    return result

28일 조건 이용해서 일수 따져서 풀기

월 더해서 년도 바꾸는거보다 조건도 적고 쉽다. 반례 고려도 생각할 필요 x


과일장수

def solution(k, m, score):
    
    price = 0
    out = len(score)%m # 버릴거
    box = len(score)//m # 박스수
    score.sort(reverse=True)

    if out != 0:
        del score[-out:] # 남은거버리고
    
    for i in range(box):
        box_price = score[m*i-1]*m
        price += box_price   
    
    return price

 


나누어 떨어지는 숫자배열

def solution(arr, divisor):
    answer = []
    for i in arr :
        if i%divisor == 0:
            answer.append(i)
    answer.sort()
    if answer == [] :
        return [-1]
    return answer

나머지가 1이 되는 수 찾기

def solution(n):
    i=2
    while True:
        if n%i == 1:
            break
        else:
            i += 1
    return i

탐색 최소화하기


내적

def solution(a, b):
    answer = 0
    for i in range(len(a)):
        answer += (a[i]*b[i])
    
    return answer

다트 게임 (2018 KAKAO BLINE RECRUITMENT)

def solution(a):
    temp,idx,score = [],[],[]
    
    count,i = 0,2
    while True : # 문자열나누기
        if a[i] in '1234567890' :
            idx.append(i)
            count += 1
            i += 1
            if count == 2:
                break
        i += 1
    temp.append(a[:idx[0]])
    temp.append(a[idx[0]:idx[1]])
    temp.append(a[idx[1]:])
    table = dict(zip(['S','D','T','#','*'],[1,2,3,-1,2]))
    for i in range(3): # 점수계산
        if temp[i][:2] == '10':
            score.append(10**table[temp[i][2]])
            if temp[i]==4:
                if temp[i][3]=='*':
                        if i==0 :
                            score[0] = score[0]*2
                        else :
                            score[-1] = score[-1]*2
                            score[-2] = score[-2]*2
                if temp[i][3]=='#':
                    score[i] = score[i]*(-1)
        else :
            score.append(int(temp[i][0])**table[temp[i][1]])
            if len(temp[i])==3:
                if temp[i][2]=='*':
                    if i==0 :
                        score[0] = score[0]*2
                    else :
                        score[-1] = score[-1]*2
                        score[-2] = score[-2]*2
                if temp[i][2]=='#':
                    score[i] = score[i]*(-1)
    return sum(score)

10이라는 예외 케이스를 잘 다뤄야 코드를 줄이는데 바로바로 생각하기 어렵네용


달리기 시합

def solution(p,c):
    rank = list(range(1,len(p)+1))
    table_rank = dict(zip(rank,p)) # 등수표
    table_name = dict(zip(p,rank)) # 업데이트에 필요한 temp공간
    
    for i in range(len(c)) :
        rank_now = table_name[c[i]] # 이름불린애 등수찾고

        temp = table_rank[rank_now-1] # 앞 등수애 이름 저장
        table_rank[rank_now-1] = c[i] # 앞 등수에 호명한애
        table_rank[rank_now] = temp # 있던 자리에 추월당한 temp
        table_name[table_rank[rank_now-1]] = rank_now-1 #
        table_name[table_rank[rank_now]] = rank_now
        
    result = []
    for i in range(1,len(p)+1):
        result.append(table_rank[i])
    return result 

def solution(p,c): # 시간복잡도 때문에 테스트 8~13 시간초과
    temp = p.copy()
    for i in range(len(c)):
        cut = temp.index(c[i])
        a,b = temp[:cut],temp[cut:]
        a[-1],b[0] = b[0],a[-1]
        temp = a+b
    return temp

 


덧칠하기

def solution(n, m, section):
    
    answer = 0
    done = 0 # 칠한 곳 까지 인덱스

    for i in section:
    
        if  i >= done: # 색칠할 구역이 색칠한 구역보다 크면 
            done = i + m # 다 칠하고 다음구역
            answer +=1 # 세고     
        
    return answer

두 개 뽑아서 더하기

def solution(number):
    
    temp = set({})
    for i in range(len(number)):
        for j in range(i+1,len(number)):
            temp.add(number[i]+number[j])  
    answer = list(temp)
    answer.sort()
    return answer

두 정수 사이의 합

def solution(a, b):
    answer =0
    if a==b:
        answer = a
    elif a<b:
        answer = sum(list(range(a,b+1)))    
    else :
        answer = sum(list(range(b,a+1))) 
    return answer

둘만의 암호

def solution(s, skip, index):
    
    temp = ['a','b','c','d','e','f','g','h','i','j','k','l',
            'm','n','o','p','q','r','s','t','u','v','w','x','y','z']

    skip_temp = list(skip)
    print(skip_temp)

    for i in range(len(skip_temp)):
        temp.remove(skip_temp[i])

    len(temp)
    s_list = list(s)
    result_index = []
    for i in range(len(s_list)):
        result_index.append((temp.index(s_list[i])+index)%len(temp))

    result = []
    for i in range(len(result_index)):
        result.append(temp[result_index[i]])

    answer ="".join(result)
    
    return answer

대충 만든 자판

def solution(keymap, target):
    
    zero = [i-i for i in range(0,26) ]
    alphabet = ['A','B','C','D','E','F','G','H','I','J','K','L',
         'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']

    table = dict(zip(alphabet,zero))

    for i in range(len(keymap)): # 키맵 하나씩 접근
        temp = list(keymap[i])

        for j in range(len(temp)): # 요소확인
            if table[temp[j]]==0: 
                table[temp[j]] = j+1 # 인덱스 업데이트

            else: # 최소인덱스
                if table[temp[j]] > j+1 : # 기존거보다 빨리나오면
                    table[temp[j]] = j+1 # 그 인덱스로 변경
    result = []
    stop = False
    for i in range(len(target)):
        count = 0
        temp = list(target[i])
        for j in range(len(temp)):
            if table[temp[j]]==0: # 사용 안되는 문자열 존재
                count =-1
                stop = True
                break
            else:
                count += table[temp[j]]

        result.append(count)

    return result

로또의 최고 순위와 최저 순위

def solution(lottos, win_nums):
    zero,o = 0,0
    for i in range(len(lottos)) :
        if lottos[i] == 0:
            zero += 1
        if lottos[i] in win_nums :
            o += 1

    if zero == 0 :
        answer =  [7-o,7-o]
    else :
        answer = [7-o-zero,7-o]
        
    if answer[1] >= 7 :
        answer[1] = 6
    if answer[0] >= 7 :
        answer[0] = 6
    return answer

진짜 멍청하게 푼듯. 6등 넘는거 잡아줘서 풀기


모의고사

def solution(q):
    a = []
    count = [0,0,0]
    st1 = [1, 2, 3, 4, 5]
    st2 = [2, 1, 2, 3, 2, 4, 2, 5]
    st3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    for i in range(len(q)):
        if q[i]==st1[i%len(st1)] :
            count[0] += 1
        if q[i]==st2[i%len(st2)] :
            count[1] += 1
        if q[i]==st3[i%len(st3)] :
            count[2] += 1
    
    for i in range(len(count)):
        if len(set(count)) == 3:
            a.append(count.index(max(count))+1)
            break
        elif len(set(count)) == 1:
            a = [1,2,3]
            break
        else:
            if count[i] == max(count):
                    a.append(i+1)
            a.sort()
    
    return a

문자열 나누기

def solution(s):

    count1,count2,answer = 0,0,0
    counting = False
    temp = ''

    for i in range(len(s)):
        if counting == False : # 세는중 아니면
            temp += s[i] # 문자정하고
            count1 += 1 # 세는 문자 카운트 올리고
            counting = True # 세는중으로
        else:
            if temp == s[i]:
                count1 += 1
            else :
                count2 += 1
        if count1 == count2 :
            answer += 1
            count1, count2 = 0,0
            temp = ''
            counting = False

        if counting == True and i==(len(s)-1) :
            answer += 1

    return answer

케이스 2번같이 남는 경우 고려해야할듯


문자열 내림차순으로 배치하기

def solution(s):
    answer = ''.join(sorted(s))
    answer = answer[::-1]
    return answer

문자열 내 마음대로 정렬하기

def solution(strings, n):
    answer,result = [],[]
    if n == 0:
        strings.sort()
        return strings
    else :
        temp = []
        for i in range(len(strings)):
            temp = strings[i][n] + strings[i]
            answer.append(temp)
            answer.sort()
        for i in range(len(strings)):
            result.append(answer[i][1:])
        return result

문자열 다루기 기본

def solution(s):
    if len(s) == 4 :
        a = list(s)
        a.sort()
        b = list('1234567890')
        if a[-1] not in b:
            return False
        else :
            return True
    elif len(s) == 6 :
        a = list(s)
        a.sort()
        b = list('1234567890')
        if a[-1] not in b:
            return False
        else :
            return True
    else :
        return False

다시 똑똑하게 풀기


문자열을 정수로 바꾸기

def solution(s):
    if s[0] == '-' :
        return int(s[1:])*(-1)
    elif s[0] == '+' :
        return int(s[1:])
    else : 
        return int(s)

문자열 내 p와 y의 개수

def solution(s):
    if (s.count('p')+s.count('P')) == (s.count('y')+s.count('Y') ):
        return True
    else : 
        return False

명예의 전당 (1)

def solution(k, score):
    hall,answer = [],[]
    for i in range(len(score)):
        if i == 0 :
            hall.append(score[i])
            answer.append(score[i])
        elif i < k :
            hall.append(score[i])
            answer.append(min(hall))
        else :
            if score[i] <= min(hall) :
                answer.append(min(hall))
            else :
                hall.remove(min(hall))
                hall.append(score[i])
                answer.append(min(hall))
                
    return answer

바탕화면 정리

def solution(wallpaper):
    
    h,w = len(wallpaper),len(list(wallpaper[0]))

    point_x,point_y = [],[]
    for i in range(h):
        temp = wallpaper[i]
        for j in range(w):
            if temp[j] == '#':
                point_x.append(i)
                point_y.append(j)

    result = []
    result.append(min(point_x))
    result.append(min(point_y))
    result.append(max(point_x)+1)
    result.append(max(point_y)+1)
    return result

부족한 금액 계산하기

def solution(price, money, count):
    need = 0
    for i in range(1,count+1):
        need += price*i
    if money >= need :
        return 0
    else :
        return (need-money)

비밀지도

def solution(n, arr1, arr2):

    map1,map2,key = [],[],[]
    for i in arr1 :
        temp = ''
        if i==0:
            map1.append(['0','0','0','0','0'])
        else : 
            while i>0 :
                temp += str(i%2)
                i = i//2
                temp1 = temp[::-1]
            if len(temp1) != n:
                temp1 = '0'*(n-len(temp1))+ temp1
        map1.append(list(temp1))

    for i in arr2 :
        temp = ''
        if i==0:
            map2.append(['0','0','0','0','0'])
        else: 
            while i>0 :
                temp += str(i%2)
                i = i//2
                temp1 = temp[::-1]
            if len(temp1) != n:
                temp1 = '0'*(n-len(temp1))+ temp1
        map2.append(list(temp1))

    for i in range(n):
        temp = ''
        for j in range(n):
            if map1[i][j]=='0' and map2[i][j]=='0' :
                temp += ' '
            else :
                temp += '#'
        key.append(temp) 
    return key

삼총사

def solution(number):
    count = 0
    temp = []
    for i in range(len(number)-2):
        temp = []
        for j in range(i+1,len(number)-1):
            for k in range(j+1,len(number)):
                temp.append(number[i])    
                temp.append(number[j])
                temp.append(number[k])
                if sum(temp) == 0 :
                    count += 1   
                temp = []
    return count

서울에서 김서방 찾기

def solution(seoul):
    x = seoul.index('Kim')
    answer = f'김서방은 {x}에 있다'
    return answer

소수 만들기

def solution(nums):
    answer = 0    
    max_num = max(nums)*3
    prime = [True]*(max_num+1)
    
    for i in range(2,int(max_num**(1/2)+1)+1):
        if prime[i]==True :
            for j in range(i+i,max_num+1,i):
                prime[j] = False
                
    n = len(nums)
    for i in range(n):
        for j in range(i+1,n):
            for k in range(j+1,n):
                if prime[nums[i]+nums[j]+nums[k]]:
                    answer += 1
    return answer

배열 수 적은거 보자마자 3중 for문 사용


소수 찾기

def solution(n):
    num = [True]*(n+1)
    for i in range(2,int(n**(1/2)+1)+1):
        if num[i] == True:        
            for j in range(i+i,n+1,i):
                num[j] = False
    return len([i for i in range(2,n+1) if num[i] == True])

수박수박수박수박수박수?

def solution(n):
    temp = ''
    for i in range(1,n+1):
        if i%2 == 1 :
            temp += '수'
        else :
            temp += '박'
    return temp

숫자짝꿍

def solution(x,y):

    a,b = list(str(x)),list(str(y))

    friend = set(a)&set(b)
    friend_list = list(friend)
    friend_list.sort(reverse=True)
    
    if len(friend_list) == 0:
        return str(-1)
    elif friend_list == ['0']:
        return str(0)
    
    else : 
        temp = []
        for i in friend_list:
            p,q = a.count(i),b.count(i)
            temp.append(min(p,q))

        answer = []
        for i in range(len(friend_list)):
            answer.append(friend_list[i]*temp[i])
        result = "".join(answer)

    return result

숫자 문자열과 영단어

def solution(s):
    
    number,answer = '0123456789',''
    i=0
    while i < len(s) : 
        if s[i] in number :
            answer += s[i]
            i += 1
        else :
            if s[i:i+2] == 'ze':
                answer += '0'
                i += 4
            elif s[i:i+2] == 'on':
                answer += '1'
                i += 3
            elif s[i:i+2] == 'tw':
                answer += '2'
                i += 3
            elif s[i:i+2] == 'th':
                answer += '3'
                i += 5
            elif s[i:i+2] == 'fo':
                answer += '4'
                i += 4
            elif s[i:i+2] == 'fi':
                answer += '5'
                i += 4
            elif s[i:i+2] == 'si':
                answer += '6'
                i += 3
            elif s[i:i+2] == 'se':
                answer += '7'
                i += 5
            elif s[i:i+2] == 'ei':
                answer += '8'
                i += 5
            elif s[i:i+2] == 'ni':
                answer += '9'
                i += 4 
    answer = int(answer)
    return answer

enumerate도 생각해봤는데 순회 제일 덜하는거 같아서 좀 단순무식하게 짰음

enumerate나 dict 사용이 좋겠네요

문제 대충읽어서 s 길이가 2000000000이하인줄 ㅠ


시저암호

def solution(s, n):
    a = 'abcdefghijklmnopqrstuvwxyz'
    A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    a_after = a[n:]+a[:n]
    A_after = A[n:]+A[:n]
    answer = ''
    for i in s:
        if i == ' ' :
            answer += ' '
        else :
            if i in a:
                answer += a_after[a.index(i)]
            else :
                answer += A_after[A.index(i)]
    return answer

다른사람들꺼 보니까 깔끔하게 잘푼듯 ㅎ


실패율 (2019 KAKAO BLIND RECRUITMENT)

def solution(N, stages):
    stages.sort()
    stage = list(range(1,N+2)) # 1층부터 N+1층까지 클리어 인원
    clear = [0 for i in range(N+1)]
    table = dict(zip(stage,clear))  # 층수:클리어인원
    p = len(stages) #도전인원
    
    for i in stages : # 스테이지 실패인원, N+1층은 전부 클리어
        table[i] += 1
    fail = []
    for i in range(1,N+2): # ㅅ
        if p==0 : # 모두 탈락했으면 뒤 스테이지 실패율 0
            for i in range(N+1-len(fail)):
                fail.append(0)
                break
        else : # 실패율 구하기
            fail.append(table[i]/p)
            p -= table[i]
            
    fail_table = dict(zip(stage,fail))
    temp = sorted(fail_table.items(), key=lambda x:x[1], reverse=True) # 높은거부터 정렬해주고
    answer = [] 
    for i in range(len(temp)):
        answer.append(temp[i][0])
    if N+1 in answer : # 전부 클리어 한 인원은 실패율 리스트에서 제거
        answer.remove(N+1)
    return answer

람다 표현식 연습중인데 좋네용

실패율 0 나오는 케이스 고려해야하는 문제


약수의 개수와 덧셈

def solution(left, right):

    arr = list(range(left,right+1))
    answer = sum(arr)

    for i in range(int(arr[0]**(1/2)),int(arr[-1]**(1/2))+1): # 제곱수찾기
        if i**2 in arr:
            answer -= 2*(i**2)

    return answer

약수의 합

def solution(n):
    temp = [i for i in range(n,0,-1) if n%i==0]
    answer = sum(temp)  
    return answer

옹알이

def solution(babbling):
    
    replace = ['A','W','M','Y']
    word = ['aya','woo','ma','ye']

    temp = []
    for i in babbling:
        i = i.replace(word[0],replace[0])
        i = i.replace(word[1],replace[1])
        i = i.replace(word[2],replace[2])
        i = i.replace(word[3],replace[3])
        temp.append(list(i))

    count = 0
    for i in range(len(temp)) :
        exam = True
        for j in range(len(temp[i])) :
            if temp[i][j] not in replace : # 4단어 아니면
                exam = False

            elif temp[i][j] in replace : 
                if j!=0 and temp[i][j] == temp[i][j-1] :
                    exam = False

        if exam == True :
            count += 1
    
    return count

babbling 길이가 짧아서 모든 단어 치호나해서 풀기.

이전 단어랑 똑같거나 4단어 리스트에 없으면 카운트 x


이상한 문자 만들기

def solution(s):
    answer = ''
    temp = s.split(' ')
    for i in range(len(temp)):
        for j in range(len(temp[i])):
            if j%2 == 0:
                answer += temp[i][j].upper()
            else :
                answer += temp[i][j].lower()
        if i != len(temp)-1 :
            answer += ' '
    return answer

완주하지 못한 선수

def solution(p,c):
    if set(c)!=set(p): 
        answer = list(set(p)-set(c))[0]
        
    else:
        p.sort()
        c.sort()
        for i in range(len(c)):
            if  p[i] != c[i]:
                answer = p[i]
                break
    return answer

예산

def solution(d, budget):
    d.sort()
    if sum(d) <= budget :
        return len(d)
    else : 
        for i in range(1,len(d)+1):
            if sum(d[:i]) > budget :
                return i-1

자릿수 더하기

def solution(n):
    x = [int(i) for i in str(n)]
    answer = sum(x)

    return answer

자연수 뒤집어 배열로 만들기

def solution(n):
    answer = []
    a = str(n)
    for i in range(1,len(a)+1):
        answer.append(int(a[-i]))
    return answer

정수 내림차순으로 정렬하기

def solution(n):
    a = str(n)
    temp = list(a)
    temp.sort(reverse=True)
    answer = ''
    for i in temp:
        answer += i
    return int(answer)

join쓰기


정수 제곱근 판별

def solution(n):
    if n**(1/2)-int(n**(1/2)) != 0 :
        return -1
    else :
        return (n**(1/2)+1)**2

직사각형 별찍기

a, b = map(int, input().strip().split(' '))
for i in range(b):
    print('*'*a)

제일 작은 수 제거하기

def solution(arr):
    if len(arr) == 1 :
        return [-1]
    else : 
        arr.remove(min(arr))
        return arr

짝수와 홀수

def solution(num):
    if num%2==0:
        answer = 'Even'
    else :
        answer = 'Odd'
    return answer

추억점수

def solution(name, yearning, photo):
    
    score = []
    for i in range(len(photo)):
        score_sum = 0 
        photo_set = set(name)&set(photo[i]) # 사진 마다 겹치는사람
        photo_list = list(photo_set)

        for j in range(len(photo_list)):

            score_sum += yearning[name.index(photo_list[j])]
        score.append(score_sum)

    return score

체육복

def solution(n,lost,reserve):

    set_reserve = set(reserve)-set(lost)
    set_lost = set(lost)-set(reserve)
    
    for i in set_reserve:
        if i-1 in set_lost:
            set_lost.remove(i-1)
        elif i+1 in set_lost:
            set_lost.remove(i+1)
    
    return n-len(set_lost)

리스트를 사용해도 상관 없는데 구현이 조금 더 복잡해지고

학생 수가 충분히 많을때도 해시를 사용한 set 기반이 훨씬 동작하기 좋다


최대공약수와 최소공배수

def solution(n, m):

    for i in range(min(n,m),0,-1): # 최대공약수
        if (n%i==0) and (m%i==0): # 공통인수는 n,m 작은거부터 시작
            temp_max = i
            break       
    for i in range(max(n,m),(n*m)+1): #최소공배수 : 최대 nm까지
        if i%n == 0 and i%m == 0: 
            temp_min = i
            break
        
    return [temp_max,temp_min]

최소직사각형

def solution(a):
    temp = [0,0]

    for i in range(len(a)):

        a[i].sort(reverse=True)

        if i == 0 :
            temp[0],temp[1] = a[i][0],a[i][1]

        else: # 정렬된 배열이랑 비교

            if temp[0] < a[i][0]: # 새로운 배열이 더 크면 할당
                temp[0] = a[i][0] 
                print(temp)
            if temp[1] < a[i][1]:
                temp[1] = a[i][1]  
    
    answer = temp[0]*temp[1]
    return answer

카드뭉치

def solution(card1,card2,goal):
    
    for i in range(len(goal)):
        if len(card1) and goal[i] == card1[0] : # card 안비어있고 goal에 있으면
            card1.pop(0)
        elif len(card2) and goal[i] == card2[0] :
            card2.pop(0)
        else:
            return 'No'
    return 'Yes'

콜라츠 추측

def solution(num):
    count = 0
    if num == 1 :
        return 0
    while True :
        if num%2 == 0 :
            num = num/2
            count += 1
        else :
            num = 3*num + 1
            count += 1
        if num == 1 :
            return count
            break
        if count == 500 :
            return -1

 


콜라 문제

def solution(a, b, n):
    count = 0
    while a <= n :
        p,q = n//a,n%a # 낼거,나머지
        count += p*b
        n = p*b + q
        
    return count

크기가 작은 부분 문자열

def solution(t, p):
    window = len(p)
    count = 0
    th = int(p)
    for i in range(len(t)-window+1):
        if int(t[i:i+window]) <= th :
            count += 1
    return count

크레용 인형뽑기 (2019 카카오 개발자 겨울 인턴십)

def solution(a,move):
    arr = []
    for i in range(len(a)):
        temp = []
        for j in range(len(a[0])):
            if a[j][i] != 0:
                temp.append(a[j][i])
        arr.append(temp)
    choose = []
    count = 0
    for i in move:
        if arr[i-1] == [] : # 집을거 없으면 다음
            continue
        else : # 집을거 있으면
            if choose == [] : # 보관함 비었으면
                choose.append(arr[i-1][0])
                arr[i-1].pop(0)
            else : # 보관함 안비었으면
                if choose[-1] == arr[i-1][0] : # 보관함 맨 위랑 뽑은거 같으면
                    choose.pop(-1)
                    arr[i-1].pop(0)
                    count += 2
                else : # 다르면 보관함에 추가
                    choose.append(arr[i-1][0])
                    arr[i-1].pop(0)
    return count

키패드 누르기 (카카오 인턴)

def solution(number, hand):

    left_use,right_use,center_use = [7,4,1],[9,6,3],[0,8,5,2]
    left_xy = dict(zip(left_use,[[1,2],[1,3],[1,4]]))
    right_xy = dict(zip(right_use,[[3,2],[3,3],[3,4]]))
    center_xy = dict(zip(center_use,[[2,1],[2,2],[2,3],[2,4]]))

    finger = [[1,1],[3,1]] # 처음 손가락 위치 [finger_left,finger_right]
    temp = [] # 출력문자열


    for i in number : # 문자입력받고
        if i in left_use:
            temp.append('L')
            finger[0] = left_xy.get(i)
        elif i in right_use:
            temp.append('R')
            finger[1] = right_xy.get(i)
        else:  # 가운데 있으면 거리비교하기
            dl = abs(finger[0][0]-center_xy.get(i)[0])+abs(finger[0][1]-center_xy.get(i)[1])
            dr = abs(finger[1][0]-center_xy.get(i)[0])+abs(finger[1][1]-center_xy.get(i)[1])

            if dl < dr : # 거리비교하고 L 가까우면
                temp.append('L')
                finger[0] = center_xy.get(i)
            elif dl > dr : # R가까우면
                temp.append('R')
                finger[1] = center_xy.get(i)
            else : # 같으면 손 따라서
                if hand == 'left':
                    temp.append('L')
                    finger[0] = center_xy.get(i)
                else:
                    temp.append('R')
                    finger[1] = center_xy.get(i)

    answer = "".join(temp)
    return answer

키패드 1~4층 만들고 현재 손가락 좌표, 다음 입력 번호의 위치 이용해서 풀이


평균 구하기

def solution(arr):
    answer = sum(arr)/len(arr)
    return answer

폰켓몬

def solution(nums):
    
    take = len(nums)/2
    num_set = set(nums)
    num_list = list(num_set)
    if len(num_list) < take :
        return len(num_list)
    else :
        return take

푸드 파이트 대회

def solution(food):
    
    p = [] # p에 한 사람이 먹을 개수 체크
    for i in range(1,len(food)):
        p.append(food[i]//2)
    
    temp1=[]
    for j in range(0,len(p)):
        for i in range(0,p[j]):
            temp1.append(j+1)

    temp2 = temp1.copy()
    temp2.sort(reverse=True)
    temp3=[0]
    result = temp1 + temp3 + temp2
    answer = "".join(str(x) for x in result)
    return answer

핸드폰 번호 가리기

def solution(a):

    b = list(a)
    answer =  list("*"*(len(a)-4)) + b[-4:]
    answer = ''.join(answer)

    return answer

햄버거 만들기

def solution(ingredient):
    
    burger = [1,2,3,1]
    answer = 0
    temp = []
    
    for i in ingredient:
        temp.append(i)
        if temp[-4:] == burger :
            answer += 1
            del temp[-4:]
            
    return answer

행렬의 덧셈

def solution(arr1, arr2):
    answer = []
    for i in range(len(arr1)):
        temp = []
        for j in range(len(arr1[0])):
            temp.append(arr1[i][j]+arr2[i][j])
        answer.append(temp)
    return answer

zip 생각이 바로 나는데 아직은 덜 익숙해서 바로푸는게 좀 더 빠르다


K번째 수

def solution(array, commands):
    answer = []
    for i in range(len(commands)):
        temp = array[commands[i][0]-1:commands[i][1]]
        temp.sort()
        a = commands[i][2]-1
        answer.append(temp[a])
    return answer

x만큼 간격이 있는 n개 숫자의 합

def solution(x, n): 
    answer = []
    for i in range(1,n+1):
        answer.append(x*i)
    return answer

2016년

def solution(a, b):
    month = [i for i in range(13)]
    day =  [0,31,29,31,30,31,30,31,31,30,31,30,31]
    week = ['THU','FRI','SAT','SUN','MON','TUE','WED']
    return week[(sum(day[0:a])+b)%7]

3진법 뒤집기

def solution(n):
    temp = ''
    while n>0 :
        temp += str(n%3)
        n = n//3
        
    answer = 0
    for i in range(len(temp)):
        answer += ((3**i)*int(temp[-(i+1)]))
    return answer

후기

한 달 동안 프로그래머스 레벨1 클리어, 백준 브~실 합쳐서 70문제, 총 150문제 정도 풀었다.

처음 짰을 때는 잘 안써서 몰랐던 명령어들 숙지하느라 시간도 오래걸리고 검색도 많이 했는데, 한 달 동안 계속 푸니까 쉬운 코드들은 보고나서 어떻게 짜야할 지 대충 보이는 듯 하다. 코드도 현재 코드랑 비교하면 조금 더 깔끔해지긴 했다. 어렵지 않은 문제는 구현하는데도 시간이 단축된게 느껴져서 보람찼다.

문제는 한 눈에 안들어오는 문제들이나 케이스에 조건이 몇 개 걸려있어서 구현할 때 조건에 끼워맞추기 식으로 진행해서 코드가 더러워지는 문제가 발생 하는데 이를 초기에 잘 생각하고 구현해야 할 듯 하다. 그리고 자주 쓰이는 테크닉같은 경우도 숙지해야 할 듯 하다.

다음 목표는 프로그래머스 1단계 시간재서 다시 작성하고 이전 코드랑 비교, 프로그래머스 레벨 2 풀기, 백준 골드 달성

댓글