알고리즘(Python)/프로그래머스

레벨1 문제풀이 - 26문제(카카오 제외)

제이드Jade 2022. 2. 3. 13:30

1. 최대공약수와 최소공배수

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

 

더보기
코드보기
def solution(n, m): #최대공약수
    a,b=n,m
    while m: #작은수가 0이 될때까지
        if n>m:
            n,m=m,n 
        n,m=n,m%n #작은수, 큰수%작은수
        
    return [n,a*b//n] #최소공배수=두수의 곱/최대공약수
 

 

 

2. 자연수 뒤집어 배열만들기

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

 

더보기
더보기
더보기
def solution(n):
    return list(map(int,str(n)[::-1])) 
    # 마지막을 list로 해야 함, a,b=map(int,input().split())랑 헷갈렸었당ㅎ

 

 

3. 정수 내림차순으로 배치하기

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

더보기
더보기
더보기
def solution(n):
    n=list(str(n))  #밑에 sorted 배열로 str 해도 됨, 굳이 list로 감쌀필요 xx
    return int(''.join(sorted(n,reverse=True)))

 

 

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

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

더보기
더보기
더보기
#내풀이
def solution(lottos, win_nums):
    rank={6:1,5:2,4:3,3:4,2:5,1:6,0:6} #굳이 사전할 필요없이 리스트 인덱스 이용하기

    correct=len(set(lottos)&set(win_nums))

    max=rank[lottos.count(0)+correct]
    min=rank[correct]
    answer=[max,min]

    return answer.

 

 

5. 부족한 금액 더하기

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

더보기
더보기
더보기
더보기
def solution(price, money, count):
    result=price*sum(range(count+1))
    return result-money if result>money else 0  #돈이 남으면 0으로 표시하라는 조건 주의
    # == max(result-money,0)

 

 

6. 없는 숫자 더하기

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

더보기
더보기
더보기
더보기
#내풀이
def solution(numbers):
    return sum(set(range(10))-set(numbers))
#여기서는 없는 번호의 합을 구하는 것이므로.... 애초부터 합끼리 빼면 됨

 

 

7. 자릿수 더하기

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

더보기
더보기
더보기
더보기
def solution(n):
    answer=0
    
    while n:
        answer+=n%10
        n//=10

    return answer
#sum([int(i) for i in str(number)]) 한줄 로 자릿수를 돌 수 있다!

 

 

8. 제일 작은 수 제거하기

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

더보기
더보기
더보기
더보기
def solution(arr):
    
    # return set(arr)-set([min(arr)]) if len(arr)>1 else -1
    arr.remove(min(arr))        #원소를 하나 빼는 것... 차집합을 굳이 쓸필요 없이 remove사용!
    return arr if arr else [-1]

 

 

9. 최소 직사각형

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

 

더보기
더보기
더보기
더보기
#내풀이(시간제한)
def solution(sizes):
    max=min=0

    for s in sizes:
        if s[0]<s[1]:
            s[0],s[1]=s[1],s[0]
        if max<s[0]:
            max=s[0]
        if min<s[1]:
            min=s[1]                        #결국 큰놈들 중에 제일 큰것 * 작은놈들 중에 제일 큰것이 결과이다.
                                            #max(리스트)이므로 == max([max(x) for x in sizes])*max([min(x) for x in sizes])
    return max*min                          #[]는 있어도 되고 없어도 된다.

 

 

10. 3진법 뒤집기

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

더보기
더보기
더보기
더보기
def solution(n):

    three=[]
    answer=0
    while n:
        three.append(n%3)
        n//=3
        
    for i in range(1,len(three)+1):
        answer+=three[-i]*(3**(i-1))    #실은 n진법 -> 10진법은 int(문자열,n) 하면 됨@@@2
    
    return answer

#주석반영 다시 풀기
def solution(n):
    tzin=''
    while n:
        tzin+=str(n%3)
        n//=3
    return int(tzin,3)

 

 

11. 나누어 떨어지는 숫자 배열

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

더보기
더보기
더보기
더보기
def solution(arr, divisor):
    # answer = sorted(x for x in arr if x%divisor==0)
    # return answer if answer else [-1]

    return sorted(x for x in arr if x%divisor==0) or [-1] # @@ 빈 배열이면 후자를 리턴하는 아주 좋은 방법 ^.^

 

 

12. 내적

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

더보기
더보기
더보기
더보기
def solution(a, b):
    return sum([x*y for x, y in zip(a,b)]) #zip : 여러 배열의 같은 자리 원소끼리 튜플로 묶은 것들을 원소로 가짐.
    # return sum([a[i]*b[i] for i in range(len(a))]) #내풀이

 

 

13. 모의고사

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

더보기
더보기
더보기
더보기
def solution(answers):
    stu=[[1,2,3,4,5],[2,1,2,3,2,4,2,5],[3,3,1,1,2,2,4,4,5,5]]
    score=[0,0,0]
    l=[len(stu[0]),len(stu[1]),len(stu[2])]
    
    for i,answer in enumerate(answers):
        for j in range(3):
            if answer==stu[j][i%l[j]]:  #수가 많은 것 % 수가 적은 것
                score[j]+=1
            
    return [i+1 for i,x in enumerate(score) if max(score)==x]   #최대값이 여러개일때 그 값을 가진 인덱스를 다 뽑아오는 법!

 

 

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

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

더보기
더보기
더보기
더보기
def solution(s):
    return ''.join(sorted(s),reversed=True)
    # return ''.join(sorted(s,key=lambda x: -ord(x))) #아스키코드 기준으로 한다고 명시적으로 표시하지 않아도 그냥 sorted(s)하면 알아서 아스키코드 기준으로 정렬 됨(소문자~대문자)

 

 

15. 문자열 다루기 기본

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

더보기
더보기
더보기
더보기
def solution(s):
    return s.isdigit() and len(s) in (4,6)#원래 내 풀이 : ... and (len(s)==4 or len(s)==6)

 

 

16. 서울에서 김서방 찾기

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

더보기
더보기
더보기
더보기
def solution(seoul:list):
    return "김서방은 "+str(seoul.index("Kim"))+"에 있다" #문자열에서 정수를 나타내고 싶을 땐 꼭 str로 묶어야 함!

 

 

17. 소수만들기

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

더보기
더보기
더보기
더보기
def solution(nums):
    answer=0
    nums.sort()
    sosus=sosu(sum(nums[-3:]))
    
    for i in range(len(nums)-2):
        for j in range(i+1,len(nums)-1):
            for k in range(j+1,len(nums)):
                if i+j+k in sosus:
                    answer+=1
    
    return answer

    
def sosu(val):
    arr=set(range(2,val+1))

    for i in range(2,val+1):
        if i in arr:
            arr-=set(range(i*2,val+1,i))

    return arr

 

 

18. 소수찾기

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

더보기
더보기
더보기
더보기
def solution(n):
    answer=[0,0]+[1]*n-1    #숫자가 아닌 1로 표현
    
    for i in range(2,n+1):
        if answer[i]:   
            for j in range(i*2,n+1,i):
                answer[j]=0
                
    return n+1-answer.count(0)

#set으로 해서 차집합을 하는 방법도 있음
def sosu(val):
    arr=set(range(2,val+1))
    
    for i in range(2,val+1):
        if i in arr:
            arr-set(range(i*2,n+1,i))
    
    return arr

 

 

19. 수박수박수박수?

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

더보기
더보기
더보기
더보기
def solution(n):
    return ("수박"*(n//2))[:n]    #다른사람 풀이 ) [:n]을 생각해내기, 문자열에 괄호를 쳐줘야 함.
    # return "수박"*(n//2) if n%2==0 else "수박"*(n//2)+"수"

 

 

20. 시저암호

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

더보기
더보기
더보기
더보기
def solution(s, n):
    up='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    low='abcdefghijklmnopqrstuvwxyz'
    
    answer=''   #1) answer를 리스트로 받아 밑에서 append로 2)s = list(s)로해서 s[i]를 조작가능하게 하기
    for ch in s:
        if ch==" ":
            answer+=' '
        elif ch in up:
            answer+=up[(up.index(ch)+n)%26]
        else:
            answer+=low[(low.index(ch)+n)%26]
        
    return answer

 

 

21. 완주하지 못한 선수

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

더보기
더보기
더보기
더보기
#내풀이
def solution(participant, completion):
    participant.sort()
    completion.sort()
    i=0
    while i<len(completion) and participant[i]==completion[i]:
        i+=1
    return participant[i]

#다른풀이
#리스트+리스트는 할 수 있지만 리스트-리스트는 하지 못한다.
#             => counter(리스트)-counter(리스트)를 사용하면 됨, 원소가 0인 key들은 사라짐.
#             => 새로운 변수로 결과를 받아야함
from collections import Counter
def solution2(participant, completion):
    result =Counter(participant)-Counter(completion)
    return result

 

 

22. 음양 더하기

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

더보기
더보기
더보기
더보기
#내풀이
def solution(absolutes, signs):
    result=0
    for i in range(len(signs)):
        result+=absolutes[i]*-1 if not signs[i] else absolutes[i]
    return result

    #다른 사람 풀이
    #return sum(x if sign else -x for x,sign in zip(absolutes,signs))
        # zip 사용하기~ && -x == x*-1

 

 

23. 이상한 문자 만들기

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

더보기
더보기
더보기
더보기
#내풀이
def solution(s):
    slist=list(s)
    idx=0
    
    while idx<len(s):
        i=0
        while idx<len(s) and slist[idx]!=' ':
            slist[idx]=slist[idx].lower() if i%2 else slist[idx].upper()
            idx+=1
            i+=1
        idx+=1
                
    return ''.join(slist)

#다른사람풀이(map과 lambda 같이 사용하기)
def solution2(s):
    return " ".join(map(lambda x : "".join([w.lower() if i%2 else w.upper() for i,w in enumerate(x)]),s.split(" ")) )
    #map의 첫번째 인자에 함수 이름, 두번째 인자에는 입력들(입력 리스트) : 입력 개수 만큼 함수를 여러번 호출(입력이 lambda의 x가 됨)
    #s.split(" ")로써 사이 공백개수-1 만큼 공백을 단어 취급하여 쪼갠다. 즉, 여러개의 공백을 살릴 수 있음

 

 

24. 하샤드 수

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

더보기
더보기
더보기
더보기
def solution(x):
    # xlist=list(str(x))
    # return not x%sum(int(i) for i in xlist)
    return not x%sum(int(i) for i in str(x))

 

 

25. 행렬의 덧셈

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

더보기
더보기
더보기
더보기
#내풀이 ... 
def solution(arr1, arr2):
    for i in range(len(arr1)):
        for j in range(len(arr1[i])):
            arr1[i][j]+=arr2[i][j]
        
    return arr1

#다른 풀이 => zip을 이용!
def solution(arr1, arr2):
    return [[c+d for c,d in zip(a,b)]for a,b in zip(arr1,arr2)]

 

 

26. k번째 수

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

더보기
더보기
더보기
더보기
#내풀이
def solution(array, commands):
    return [ sorted(array[x[0]-1:x[1]])[x[2]-1] for x in commands]

#다른 사람 풀이
def solution(array, commands):
    return list(map(lambda x:sorted(array[x[0]-1:x[1]])[x[2]-1], commands))
    #map(lambda x.. , 리스트 ) : 리스트의 원소가 x가 되어 결과들이 리스트를 만든다.

 

 

26. 약수의 합

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

더보기
더보기
더보기
더보기
def solution(n):
    answer=0
    for i in range(1,int(n**0.5)+1):    #앞의 약수들만 구하면 그들의 짝(뒤의 약수들)은 자동으로 구해짐
        if n%i==0:
            answer+=i
            if n//i!=i:     #루트 n이 아니면
                answer+=n//i
    
    return answer