https://school.programmers.co.kr/learn/challenges?tab=algorithm_practice_kit 

 

프로그래머스

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

programmers.co.kr


 

https://school.programmers.co.kr/learn/challenges?tab=algorithm_practice_kit 

 

프로그래머스

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

programmers.co.kr


<스택/큐>
Q.같은 숫자는 싫어 

def solution(arr):
    answer = []
    for a in arr : 
        if a not in answer or a!= answer[-1] : 
            answer.append(a)
    return answer



Q.기능개발 #***

'''
#틀림 --> x > dq[0] 에서 부등호 빠짐 ㅠ x>=q[0] 이여야함 
#반례 : [90, 90, 90, 90],[30, 1, 1, 1],[1, 3] 
from collections import deque 
def solution(progresses, speeds):
    answer = []
    dq=[]
    for p,s in zip(progresses,speeds) : 
        n=(100-p)//s 
        if n*s+p < 100 : 
            n+=1 
        dq.append(n)
        
    dq=deque(dq)
    cnt=0
    
    while True : 
        if len(dq)==0 : 
            break 
            
        x=dq.popleft()
        cnt=1
        while dq and x > dq[0] : 
            dq.popleft()
            cnt+=1
        answer.append(cnt)
    
    return answer

'''
from collections import deque 
def solution(progresses, speeds):
    answer = []
    dq=[]
    dq=deque(dq)
    
    for p,s in zip(progresses,speeds) : 
        n=(100-p)//s 
        while True : 
            if n*s+p < 100 : 
                n+=1
            else : 
                break
        
        dq.append(n)
    
    while True : 
        if len(dq)==0 : 
            break 
        if len(dq)==1 : 
            answer.append(1)
            break 
            
        x=dq.popleft()
        cnt=1
        while dq and x >= dq[0] : 
            dq.popleft()
            cnt+=1
            
        answer.append(cnt)
    
    return answer


Q.올바른 괄호 

def solution(s):
    answer = True
    stack=[] 
    
    if s[0] == ')' : 
        return False 
    
    for x in s : 
        if x=='(' : 
            stack.append(x) 
        else : #')'
            if len(stack)==0 : 
                return False 
            stack.pop()
            
    if len(stack) > 0 : 
        return False

    return True


Q.프로세스 #***

from collections import deque 
def solution(priorities, location):
    answer = 0
    dq = deque() 
    for i,p in enumerate(priorities) :  
        dq.append((i,p))
        
    while True : 
        x=dq.popleft()
        if any(x[1]<d[1] for d in dq) : 
            dq.append(x)
        else : 
            answer+=1
            if x[0] == location :
                break
    return answer
#queue =  [(i,p) for i,p in enumerate(priorities)]


Q.다리를 지나는 트럭 #***

'''
#틀림
from collections import deque 
def solution(bridge_length, weight, truck_weights):
    answer = 0
    dq=deque([0]*bridge_length)
    dq=deque(dq)
    truck_weights = deque(truck_weights)
    while True : 
        if len(truck_weights) == 0 and len(dq) == 0 : 
            break 
            
        if len(truck_weights) > 0 and (sum(dq)+truck_weights[0]) <= weight : 
            dq.append(truck_weights.popleft())
        else : 
            dq.popleft()
        answer+=1
        
    return answer

'''
from collections import deque 
def solution(bridge_length, weight, truck_weights):
    answer = 0
    
    #시간 초과 / 5번 테스트 케이스만 .. >> sum() 함수 : O(n) 이라 김  um보다는 변수를 가감하는 방식으로 변경해야 
    dq=deque([0]*bridge_length)
    truck_weights = deque(truck_weights)
    sum_truck= 0 
    
    while dq:
        answer+=1
        sum_truck-=dq.popleft()
        if truck_weights:
            #if sum(dq)+truck_weights[0]<=weight:
            if sum_truck+truck_weights[0]<=weight:
                x=truck_weights.popleft()
                sum_truck+=x
                dq.append(x)
            else:
                dq.append(0)
    
    return answer


Q.주식가격 #***

def solution(prices):
    answer = []
    
    '''
    #테스트 케이스 1번 제외 하고 틀림 
    #반례 [4,5,1,2,6,1,1], [2,1,4,2,1,1,0] 
    for i, p in enumerate (prices) : 
        cnt=0
        print(p, prices[i+1:])
        for j in prices[i+1:] : 
            if p <= j : 
                cnt+=1
        answer.append(cnt)
    
    '''

    '''
    #효율성 테스트 모두 실패 
    for i,p in enumerate (prices) : 
        cnt=0
        stack=[]
        for t in prices[i+1:] : 
            stack.append(t)
            if stack[-1] < p :
                cnt=len(stack)
                break
            else : 
                cnt+=1
        answer.append(cnt)
    '''

    return answer

from collections import deque 
def solution(prices):
    answer = []
    dq=deque(prices)
    
    while dq : 
        x=dq.popleft()
        cnt=0
        for i in dq : 
            cnt+=1 
            if i < x :
                break 
        answer.append(cnt)
    return answer

https://school.programmers.co.kr/learn/challenges?tab=algorithm_practice_kit 

 

프로그래머스

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

programmers.co.kr


<해시> 
Q.완주하지 못한 선수 #***

def solution(participant, completion):
    answer = ''
    '''
    #틀림. 효율성 테스트 모두 실패 
    for c in completion : 
        participant.remove(c)
    answer=participant[0]
    '''
    tmp=dict() 
    for p in participant : 
        tmp[p]=tmp.get(p,0) +1
    for c in completion :
        tmp[c]=tmp[c]-1
    
    for t in tmp.keys() :
        if tmp[t] > 0 :
            answer=t
            break
    
    return answer

'''
import collections
def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]
'''
'''
    participant.sort()
    completion.sort()
    for i in range(len(completion)):
        if participant[i] != completion[i]:
            return participant[i]
    return participant[len(participant)-1]
'''


Q.폰켓몬

def solution(nums):
    answer = 0
    cnt=len(nums)
    nums=set(nums)
    if len(nums) > cnt/2 :
        answer = cnt/2 
    else : 
        answer=len(nums)
    return answer
    #return min(len(ls)/2, len(set(ls)))


Q.전화번호 목록 #***

def solution(phone_book):
    '''
    #틀림 ㅠ 
    answer = True
    x = min(phone_book) 
    for p in phone_book : 
        if x in p and p!=x: 
            answer=False
            break
    '''
    answer=True
    phone_book = sorted(phone_book)
    for p1, p2 in zip(phone_book, phone_book[1:]):
        if p2.startswith(p1): 
            answer=False
            break
    return answer


Q.의상 #*** 

'''
A 종류 N개,B 종류 M개 일 때 가능한 모든 경우의 수는 (N+1)(M+1)
(N+1)(M+1) = NM + N + M + 1
NM: N과 M을 모두 사용하는 경우
N: N만 사용하는 경우
M: M만 사용하는 경우
1: 모두 사용하지 않는 경우 
따라서, 결괏값 리턴시 -1을 통해 아무것도 입지 않는 경우를 제외하여 
최소 1개 이상의 의상을 입는 경우의 수만 리턴할 수 있도록 함 
(출처 구글링)
'''
def solution(clothes):
    answer = 0
    tmp=dict() 
    for c in clothes : 
        type=c[1]
        tmp[type] = tmp.get(type,0) + 1 
        
    answer=1
    for type,cnt in tmp.items() : 
        answer*=(cnt+1)
    answer-=1
    
    return answer


Q.베스트 앨범 #*** 

def solution(genres, plays):
    answer = []
    dic1={}
    dic2={}
    for i , (g,p) in enumerate(zip(genres, plays)) : #dic1 : 장르 인덱스 , 값 정리 (리스트로 저장)
        #print(i,g,p)
        if g not in dic1 : 
            dic1[g] = [(i,p)]
        else :
            dic1[g].append((i,p))
        #print(dic1) #{'classic': [(0, 500), (2, 150), (3, 800)], 'pop': [(1, 600), (4, 2500)]}
        
        if g not in dic2 : #dic2 : 장르별 합계
            dic2[g] = p 
        else : 
            dic2[g] += p 
        #print(dic2) #{'classic': 1450, 'pop': 3100} 
        
    for (k,v) in sorted(dic2.items(), key=lambda x:x[1], reverse=True) : #같은 장르 내에서는 최대 2곡까지 
        for (i,p) in sorted(dic1[k], key=lambda x:x[1], reverse=True)[:2]: 
            answer.append(i)
    return answer

프로그래머스-코딩테스트 입문

https://school.programmers.co.kr/learn/challenges/beginner?order=acceptance_desc

 

코딩테스트 입문 | 프로그래머스 스쿨

코딩테스트에 처음 도전하는 사람들을 위한 입문 문제 모음. 쉬운 문제부터 하나씩 도전해 보면서 코딩테스트에 자신감도 붙이고 문제 해결 능력을 키워보세요!

school.programmers.co.kr


코딩테스트 입문 캘린더


DAY 1.사칙연산

Q.두 수의 합

def solution(num1, num2):
    return (num1+num2)


Q.두 수의 차

def solution(num1, num2):
    return (num1-num2)


Q.두 수의 곱

def solution(num1, num2):
    return (num1*num2)


Q.몫 구하기

def solution(num1, num2):
    return (num1//num2)

 

DAY 2.사칙연산, 조건문, 배열
Q.두 수의 나눗셈

def solution(num1, num2):
    return (num1/num2)*1000//1
    #return int(num1 / num2 * 1000)


Q.숫자 비교하기

def solution(num1, num2):
    return 1 if num1==num2 else -1


Q.분수의 덧셈***

def solution(numer1, denom1, numer2, denom2): #**
    answer = []
    x=numer1*denom2+denom1*numer2
    y=denom1*denom2
    
    #약분>최대공약수 : 공통되는 약수 중에서 최대 값 
    '''
    #틀림 ㅠ 왜 ? 
    for i in range(2,min(x,y)) :         
        if x%i==0 and y%i==0 :
            x=x//i 
            y=y//i
    '''   
    
    '''
    import math
    gcd(): 최대공약수
    lcm(): 최소공배수
    '''
    
    '''
    #for문으로 최대 공약수 찾기
    for i in range(min(x,y),0,-1) : #뒤에서 부터
        if x%i==0 and y%i==0 :
            x=x//i 
            y=y//i
            break 
    '''
    '''
    #유클리드 호제법으로 최대 공약수(GCD, Greatest Common Divisor)를 찾기
    def euclidean_algorithm(a, b):
    # 큰 수와 작은 수를 구분하여 대입
    if a < b:
        a, b = b, a
    
    # b가 0이 될 때까지 반복
    while b != 0:
        # a를 b로 나눈 나머지를 a에 대입하고, b에는 이전의 a를 대입
        a, b = b, a % b
    
    # 최대 공약수인 a를 반환
    return a
    '''
    '''
    #유클리드 호제법2
    def gcd(a, b):
    while b > 0:
        a, b = b, a % b
    return a
    '''

    a=x
    b=y
    
    if a<b :
        a,b = b,a
    while b>0 : 
        a,b = b, a%b 
    z=a #최대 공약수
    
    x=x//z
    y=y//z

            
    answer.append(x)
    answer.append(y)
    return answer


Q.배열 두 배 만들기 

def solution(numbers):
    return [i*2 for i in numbers]

 


DAY 3.사칙연산, 배열, 수학
Q.나머지 구하기

def solution(num1, num2):
    return num1%num2


Q.중앙값 구하기

def solution(array):
    answer = 0
    x=sorted(array,reverse=True)
    answer = x[len(x)//2]
    return answer
    #sorted(array)[len(array) // 2]


Q.최빈값 구하기***

def solution(array):
    answer = 0 
    
    '''
    #런타임 에러 ㅠ 
    cont=[0]*(len(array)+1) 
    for i in array :
        cont[i]+=1
        
    maxCont=-1
    tmp=[]
    for i in range(len(cont)) :
        if maxCont<cont[i] :
            maxCont=cont[i]
    for i in range(len(cont)) : 
        if cont[i] == maxCont :
            tmp.append(i)
    if len(tuple(tmp))>1 :
           answer = -1
    else : 
           answer = tmp[0]
    '''
    
    '''
    #런타임 에러 ㅠ 
    cont=[0]*(len(array)+1)  #카운트 배열 생성
    for i in array :
        cont[i]+=1
        
    maxVal=0 #최빈값 출연 횟수
    for i in cont :
        if i == max(cont) :
            maxVal+=1;
    
    if maxVal > 1 :
        answer = -1
    else : 
        answer = cont.index(max(cont))
    '''
    
    while len(array)!=0 : 
        for i,x in enumerate(set(array)) :
            array.remove(x)
        if i==0 :
            return x 
    return -1

    return answer


Q.짝수는 싫어요

def solution(n):
    answer = [i for i in range(1,n+1) if i%2!=0]
    return answer
    #return [i for i in range(1, n+1, 2)]


DAY 4.수학, 배열
Q.피자 나워 먹기 (1)

def solution(n):
    answer = 0
    i=1
    while 7*i<n :
        i+=1
    answer = i
    return answer
    '''
    if n%7 != 0:
        answer = (n//7) + 1
    else:
        answer = n//7
    '''


Q.피자 나워 먹기 (2)

def solution(n):
    answer = 0
    i=1
    while True : #while(1):
        if (6*i)%n==0 :
            answer=i
            break
        i+=1
    return answer


Q.피자 나워 먹기 (3)

def solution(slice, n):
    answer = 0
    i=1
    while (1):
        if (slice*i)>=n :
            answer=i
            break
        i+=1
    return answer


Q.배열의 평균값

def solution(numbers):
    return sum(numbers)/len(numbers)


DAY 5.수학, 배열
Q.옷가게 할인 받기

def solution(price):
    if price>=500000:
        price*=0.8
    elif price>=300000:
        price*=0.9
    elif price>=100000:
        price*=0.95
    return int(price) #return price는 오답


Q.아이스 아메리카노

def solution(money):
    answer = []
    answer.append(money//5500)
    answer.append(money%5500)
    return answer
    #answer = [money // 5500, money % 5500]


Q.나이 출력

def solution(age):
    return 2022-age+1


Q.배열 뒤집기

def solution(num_list):
    for i in range (len(num_list)//2) :
        num_list[i],num_list[len(num_list)-1-i] = num_list[len(num_list)-1-i], num_list[i]
    return num_list
    #return num_list[::-1]
    #num_list.reverse()
    #while(num_list):
    #    result.append(num_list.pop())



DAY 6.문자열, 반복문, 출력, 배열, 조건문
Q.문자열 뒤집기

def solution(my_string):
    answer = ''
    for x in my_string : 
        answer=x+answer
    return answer
    #return my_string[::-1]
    #return ''.join(list(reversed(my_string)))
    #for i in range(len(my_string)-1, -1, -1) :
    #    answer += my_string[i]


Q.직각삼각형 출력하기

n = int(input())
for i in range(1,n+1) :
    for j in range(i) :
        print("*",sep='',end='')
    print()
#for i in range(n):
#    print('*'*(i+1))


Q.짝수 홀수 개수

def solution(num_list):
    sum1=0
    sum2=0
    for x in (num_list):
        if x%2==0 :
            sum1+=1
        else :
            sum2+=1
    answer=[sum1,sum2]
    return answer
    '''
    answer = [0,0]
    for n in num_list:
        answer[n%2]+=1
    '''


Q.문자 반복 출력하기

def solution(my_string, n):
    answer = ''
    for x in my_string : 
        answer+=((x)*n)
    return answer
    #return ''.join(i*n for i in my_string)


DAY 7.문자열, 조건문, 수학, 반복문
Q.특정 문자 제거하기

def solution(my_string, letter):
    answer = ''
    for x in my_string :
        if x!=letter : 
            answer+=x
    return answer
    #return my_string.replace(letter, '')
    #return ''.join([c for c in my_string if c != letter])


Q.각도기

def solution(angle):
    answer = 0
    if angle==90:
        answer=2
    elif angle==180 :
        answer=4
    elif angle<90:
        answer=1
    elif angle>90:
        answer=3
    return answer


Q.양꼬치

def solution(n, k):
    answer = 0
    if n>=10 and k>0:
        k-=n//10
    answer+=n*12000 + k*2000
    return answer
    #return 12000 * n + 2000 * (k - n // 10)


Q.짝수의 합

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


DAY 8.배열, 구현, 수학
Q.배열 자르기

def solution(numbers, num1, num2):
    return numbers[num1:num2+1]


Q.외계행성의 나이

def solution(age):
    answer = ''
    for x in str(age) :
        tmp=''
        if x=='0' : tmp='a'
        elif x=='1' : tmp='b'
        elif x=='2' : tmp='c'
        elif x=='3' : tmp='d'
        elif x=='4' : tmp='e'
        elif x=='5' : tmp='f'
        elif x=='6' : tmp='g'
        elif x=='7' : tmp='h'
        elif x=='8' : tmp='i'
        elif x=='9' : tmp='j'
        answer+=tmp
    return answer
    '''
    age = str(age)
    age = age.replace("0", "a")
    '''



Q.진료순서 정하기

def solution(emergency):
    answer = []
    tmp=sorted(emergency,reverse=True)
    for i in emergency : 
        answer.append(tmp.index(i)+1)
    return answer
    #return [sorted(emergency, reverse=True).index(e) + 1 for e in emergency]



Q.순서쌍의 개수

def solution(n):
    answer = 0
    for i in range(1,n+1) :
        if n%i==0 : 
            answer+=1
    return answer



DAY 9.수학, 문자열, 해시, 완전탐색, 조건문
Q.개미 군단

def solution(hp):
    answer = 0
    while hp>0 :
        if hp>=5:
            answer+=hp//5
            hp=hp%5
        elif hp>=3:
            answer+=hp//3
            hp=hp%3
        elif hp>=1:
            answer+=hp//1
            hp=hp%1
    return answer
    #return hp // 5 + (hp % 5 // 3) + ((hp % 5) % 3)


Q.모스부호 (1)

def solution(letter):
    answer = ''
    morse = { 
    '.-':'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'
    }
    for x in list(letter.split()) :
        answer+=morse.get(x)
        #answer+=morse[x]
    return answer


Q.가위 바위 보

def solution(rsp):
    answer = ''
    for x in rsp : 
        if x=='0':
            answer+='5'
        elif x=='2':
            answer+='0'
        elif x=='5':
            answer+='2'
    return answer
    '''
    d = {'0':'5','2':'0','5':'2'}
    return ''.join(d[i] for i in rsp)
    '''


Q.구슬을 나누는 경우의 수

def solution(balls, share):
    answer = 0
    def fac(n):
        ret=1
        for i in range(1,n+1) :
            ret*=i
        return ret
    answer = fac(balls)//((fac(balls-share))*fac(share))
    return answer
    '''
    서로 다른 n개 중 m개를 뽑는 경우의 수 공식
    조합 nCm = (n-m)!*m! 분의 n! 
    n! 
    ---------
    (n-m)!*m!
    '''
    '''
    import math
    def solution(balls,share):
        return math.comb(balls,share)
    '''

 

DAY 10.조건문, 배열, 수학, 시뮬레이션
Q.점의 위치 구하기

def solution(dot):
    answer = 0
    x=dot[0]
    y=dot[1]
    if x>0 :
        if y>0:
            answer=1
        elif y<0:
            answer=4
    if x<0:
        if y>0:
            answer=2
        elif y<0:
            answer=3
    return answer


Q.2차원으로 만들기

def solution(num_list, n):
    answer=[]
    for i in range(0,len(num_list),n) :
        answer+=[num_list[i:i+n]]
        #answer.append(num_list[i:i+n])
    return answer


Q.공 던지기***

def solution(numbers, k):
    answer = 0
    i=0
    cont=0
    while (1) :
        cont+=1 #횟수
        if cont==k:
            answer=numbers[i]
            break 
        if i==(len(numbers)-1) :
            i=1
        elif i==(len(numbers)-2) :
            i=0
        else :
            i+=2
    return answer
    #return numbers[2 * (k - 1) % len(numbers)]


Q.배열 회전시키기

def solution(numbers, direction):
    if direction=='right':
        numbers.insert(0,numbers.pop())
    elif direction=='left':
        numbers.append(numbers.pop(0))
    return numbers


DAY 11.수학, 반복문
Q.주사위의 개수***

def solution(box, n):
    answer = 0
    a,b,c=box
    answer = (a//n)*(b//n)*(c//n)
    return answer


Q.합성수 찾기

def solution(n):
    answer = 0
    for i in range(1,n+1):
        cont=0
        for j in range(1,i+1):
            if i%j==0:
                cont+=1
        if cont>=3:
            answer+=1 
    return answer


Q.최댓값 만들기(1)

def solution(numbers):
    maxValue=-2147000000
    for i in range(len(numbers)) :
        for j in range(i+1,len(numbers)) :
            if numbers[i]*numbers[j]>maxValue:
                maxValue=numbers[i]*numbers[j]
    return maxValue
    '''
    numbers.sort()
    return numbers[-2] * numbers[-1]

    numbers = sorted(numbers, reverse=True)
    return numbers[0]*numbers[1]
    '''


Q.팩토리얼

def solution(n):
    answer = 0
    i=1
    while (1):
        answer=i
        tmp=1
        for j in range(1,i+1) :
            tmp*=j
        if tmp==n :
            break
        elif tmp>n:
            answer=i-1
            break
        else :
            i+=1
    return answer
    '''
    factorial = 1
    while factorial <= n:
        answer += 1
        factorial = factorial * answer
    answer -= 1
    '''


DAY 12.문자열, 정렬, 사칙연산, 수학
Q.모음 제거

def solution(my_string):
    answer = ''
    for x in my_string:
        if x=='a' or x=='e' or x=='i' or x=='o' or x=='u':
            continue
        answer+=x
    return answer
    '''
    vowels = ['a','e','i','o','u']
    for vowel in vowels:
        my_string = my_string.replace(vowel, '')
    '''


Q.문자열 정렬하기 (1)

def solution(my_string):
    answer = []
    for x in my_string :
        if x.isalpha() : #if i.isdigit():
            continue 
        answer.append(int(x))
    answer.sort()
    return answer


Q.숨어있는 숫자의 덧셈 (1)

def solution(my_string):
    answer = 0
    for x in my_string :
        if x.isdigit():
            answer+=int(x)
    return answer


Q.소인수분해***

def solution(n):
    answer = []
    x=2
    while x<=n :
        if n%x==0 :
            if x not in answer :
                answer.append(x)
            n=n//x
        else :
            x+=1
    return answer


DAY 13.문자열, 배열, 사칙연산, 수학, 조건문
Q.컨트롤 제트

def solution(s):
    answer = 0
    tmp=s.split()
    for i in range(len(tmp)) :
        if tmp[i]=="Z":
            answer-=int(tmp[i-1])
        else :
            answer+=int(tmp[i])
    return answer


Q.배열 원소의 길이

def solution(strlist):
    answer = []
    for x in strlist :
        answer.append(len(x))
    return answer
    #return [len(str) for str in strlist]


Q.중복된 문자 제거

def solution(my_string):
    answer = ''
    tmp=[]
    x=list(my_string)
    for i in my_string :
        if i not in tmp :
            tmp.append(i)
            answer+=i
    return answer
    '''
    answer = ''
    for i in my_string:
        if i not in answer:
            answer+=i
    return answer
    '''



Q.삼각형의 완성조건(1)

def solution(sides):
    answer = 0
    a,b,c=sorted(sides,reverse=True)
    if a<b+c:
        answer=1
    else :
        answer=2
    return answer



DAY 14.조건문, 반복문, 시뮬레이션, 문자열
Q.가까운 수

def solution(array, n):
    answer = 0
    minValue=2147000000
    for x in array :
        if abs(n-x) < minValue :
            minValue=abs(n-x)
            answer=x
        if minValue == abs(n-x) and answer>x:
                answer=x
    return answer


Q.369게임

def solution(order):
    answer = 0
    for x in str(order) :
        if x=='3' or x=='6' or x=='9':
            answer+=1
    return answer


Q.암호 해독

def solution(cipher, code):
    answer = ''
    for i in range(code-1,len(cipher),code) :
        answer+=cipher[i]
    return answer
    # return cipher[code-1::code]


Q.대문자와 소문자

def solution(my_string):
    answer = ''
    for x in my_string :
        if x.isupper():
            answer+=x.lower()
        elif x.islower():
            answer+=x.upper()
    return answer
    #return my_string.swapcase()


DAY 15.문자열, 해시, 배열, 수학
Q.영어가 싫어요

def solution(numbers):
    '''
    #왜 안돼 ㅠ ? 실행조차 안됨.. 
    answer = 0
    number={"zero":0, "one":1, "two":2, "three":3, "four":4, "five":5, "six":6, "seven":7, "eight":8, "nine":9}
    i=1
    while len(numbers)>0:
       # print(numbers[:i])
        #print(number.get(numbers[:i]))
        if number.get(numbers[:i]) != None :
            nembers=numbers[:i]
            i=1
        else :
            i+=1
    '''
    
    nums=["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
    for i,n in enumerate(nums):
        numbers=numbers.replace(n,str(i))
    return int(numbers)


Q.인덱스 바꾸기

def solution(my_string, num1, num2):
    my_string=list(my_string)
    my_string[num1],my_string[num2] = my_string[num2],my_string[num1]
    return ''.join(my_string)


Q.한 번만 등장한 문자

def solution(s):
    answer = ''
    tmp=[]
    for x in s :
        if s.count(x)==1 :
            tmp.append(x)
    tmp=sorted(tmp)
    answer=answer.join(tmp)
    return answer


Q.약수 구하기

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


DAY 16.문자열, 수학, 배열, 조건문
Q.편지

def solution(message):
    return len(message)*2


Q.가장 큰 수 찾기

def solution(array):
    #answer.append(max(array))
    #answer.append(array.index(max(array)))
    maxValue=-2147000000
    idx=0
    for i in range(len(array)) : 
        if array[i]>maxValue :
            maxValue=array[i]
            idx=i
    answer=[maxValue,idx]
    return answer


Q.문자열 계산하기

def solution(my_string):
    answer = 0
    '''
    #런타임 에러ㅠ 
    a,b,c=(my_string).split()
    if str(b)=="+" :
        answer=int(a)+int(c)
    elif str(b)=="-":
        answer=int(a)-int(c)
    '''
    my_string=my_string.split()
    answer=int(my_string[0])
    for i in range(2,len(my_string)) :
        if my_string[i-1]=="+" :
            answer+=int(my_string[i])
        elif my_string[i-1]=="-" :
            answer-=int(my_string[i])
    return answer
    #solution=eval


Q.배열의 유사도

def solution(s1, s2):
    answer = 0
    for i in range (len(s1)) :
        for j in range(len(s2)) :
            if s1[i]==s2[j] :
                answer+=1
                break
    return answer
    #return len(set(s1)&set(s2));
    #set()의 & 연산자는 두 집합(sets) 간의 교집합을 반환
    '''
    for word in s1:
        if word in s2:
            answer += 1
        else:
            continue
    '''


DAY 17.문자열, 수학, 조건문, 배열, 사칙연산
Q.숫자 찾기

def solution(num, k):
    answer = 0
    num=str(num)
    for i in range(len(num)) :
        if int(num[i])==k:
            answer=i+1
            break
    else :
        answer=-1
    return answer


Q.n의 배수 고르기

def solution(n, numlist):
    answer = []
    for x in numlist :
        if x%n==0 : 
            answer.append(x)
    return answer
    #answer = [i for i in numlist if i%n==0]


Q.자릿수 더하기

def solution(n):
    answer = 0
    n=str(n)
    for x in n :
        answer+=int(x)
    return answer
    #return sum(int(i) for i in str(n))


Q.OX퀴즈

def solution(quiz):
    answer = []
    for x in quiz : 
        x,a,y,b,z = x.split()
        if str(a)=="+" :
            if int(x)+int(y)==int(z) :
                answer.append('O')
            else : 
                answer.append('X')
        elif str(a)=="-" :
            if int(x)-int(y)==int(z) :
                answer.append('O')
            else : 
                answer.append('X')
    return answer


DAY 18.문자열, 수학, 조건문, 정렬
Q.문자열안에 문자열

def solution(str1, str2):
    answer = 1 if str1.find(str2)>=0 else 2
    return answer
    #return 1 if str2 in str1 else 2


Q.제곱수 판별하기

def solution(n):
    answer = 0
    x=n**(1/2) #제곱근 2분의 1승
    if x%1==0: #정수일 경우
        answer=1
    else : 
        answer = 2 
    return answer


Q.세균 증식

def solution(n, t):
    answer=n
    for i in range(0,t) :
        answer*=2
    return answer


Q.문자열 정렬하기 (2)

def solution(my_string):
    return "".join(sorted(my_string.lower()))


DAY 19.문자열, 배열, 조건문
Q.7의 개수

def solution(array):
    answer = 0
    for x in array :
        for i in range(len(str(x))) :
            if str(x)[i]=='7':
                answer+=1
    return answer
    #return str(array).count('7')


Q.잘라서 배열로 저장하기

def solution(my_str, n):
    answer = []
    for i in range(0,len(my_str),n):
        answer.append(my_str[i:i+n])
    return answer


Q.중복된 숫자 개수

def solution(array, n):
    return array.count(n)


Q.머쓱이보다 키 큰 사람

def solution(array, height):
    answer = 0
    array.sort()
    for x in array : 
        if x>height : 
            answer+=1
    return answer
    '''
    array.append(height)
    array.sort(reverse=True)
    return array.index(height)
    '''


DAY 20.수학, 시뮬레이션, 문자열, 사칙연산
Q.직사각형 넓이 구하기

def solution(dots):
    answer = 0
    a=set()
    b=set()
    for x in dots :
        a.add(x[0])
        b.add(x[1])
    x=abs(list(a)[0]-list(a)[1])
    y=abs(list(b)[0]-list(b)[1])
    answer=x*y
    return answer
    #return (max(dots)[0] - min(dots)[0])*(max(dots)[1] - min(dots)[1]) 
    '''
    x, y = [], []
    for dot in dots:
        x.append(dot[0])
        y.append(dot[1])
    return (max(x) - min(x)) * (max(y) - min(y))
    '''


Q.캐릭터의 좌표

def solution(keyinput, board):
    answer = []
    
    dx=[1,0,-1,0]
    dy=[0,-1,0,1]
    x=0
    y=0
    print((board[0]//2),(board[1]//2))
    for k in keyinput : 
        if k=="right" :
            i=0
        elif k=="down" :
            i=1
        elif k=="left" :
            i=2
        elif k=="up" :
            i=3
        if abs(x+dx[i])>(board[0]//2) or abs(y+dy[i])>(board[1]//2) :
            continue
        x=x+dx[i]
        y=y+dy[i]
            
    answer=[x,y]
    return answer


Q.최댓값 만들기 (2)

def solution(numbers):
    answer = 0
    numbers.sort()
    answer=numbers[0]*numbers[1]
    if answer<(numbers[len(numbers)-1]*numbers[len(numbers)-2]) :
        answer=(numbers[len(numbers)-1]*numbers[len(numbers)-2])
    return answer
    '''
    numbers = sorted(numbers)
    return max(numbers[0] * numbers[1], numbers[-1]*numbers[-2]) 
    '''


Q.다항식 더하기***

def solution(polynomial):
    # if tmpx==1 경우 주의  
    answer = ''
    tmpx=0
    tmpc=0
    polynomial=polynomial.split(' + ')
    for p in polynomial :
        '''
        if 'x' in p:
            tmp=p.replace('x','')
            if tmp=='' :
                tmpx+=1
            else :
                tmpx+=int(tmp)
        else : 
            tmpc+=int(p)
        '''
        
        
        if 'x' in p: 
            if p.isalpha():
                tmpx+=1
            else :
                tmp=p.replace('x','')
                tmpx+=int(tmp)
        elif p.isdigit() :
            tmpc+=int(p)
        
    if tmpx>0 :
        if tmpx==1 : #주의
            answer+='x'
        else : 
            answer+=str(tmpx)+'x'
        
        if tmpc>0 :
            answer+=' + '+str(tmpc)
    else :
        if tmpc>0 :
            answer+=str(tmpc)
    return answer

    def solution(polynomial):
    tmpx = 0
    tmpc = 0
    for c in polynomial.split(' + '):
        if c.isdigit():#상수항
            tmpc+=int(c)
        else:
            tmpx = tmpx+1 if c=='x' else tmpx+int(c[:-1])
    if tmpx == 0:
        return str(tmpc)
    elif tmpx==1:
        return 'x + '+str(tmpc) if tmpc!=0 else 'x'
    else:
        return f'{tmpx}x + {tmpc}' if tmpc!=0 else f'{tmpx}x'
    
    return answer


DAY 21.문자열, 사칙연산, 시뮬레이션, 2차원배열, 수학, 배열
Q.숨어있는 숫자의 덧셈 (2)

def solution(my_string):
    answer = 0
    for i in range(len(my_string)) : 
        if my_string[i].isalpha() :
            my_string=my_string.replace(my_string[i],' ')
    my_string = list(map(int,my_string.split()))
    answer = sum(my_string)
    return answer


Q.안전지대***

def solution(board):
    answer = 0
    dx=[-1,0,1,1,0,0,-1,-1]
    dy=[0,1,0,0,-1,-1,0,0]
    n=len(board)
    tmp=[]
    '''
    for i in board :
        print(i)
    '''
    #지뢰 위치 파악
    for i in range(n):
        for j in range(n) :
            if board[i][j]==1 :
                tmp.append([i,j])
                
    for t in tmp :
        x,y=t #지뢰 위치
        for i in range(8) :
            '''
            #틀림 ㅠ 
            if(x+dx[i]>=n or y+dy[i]>=n or x+dx[i]<0 or y+dy[i]<0) :
                continue
            x=x+dx[i]
            y=y+dy[i]
            if board[x][y]==1 :
                continue
            board[x][y]=1
            '''
            x=x+dx[i]
            y=y+dy[i]
            if 0 <= x < n and 0 <= y < n:
                board[x][y] = 1
            
    #안전지대 카운팅
    for i in range(n):
        for j in range(n):
            if board[i][j]==0:
                answer+=1
    
    return answer


Q.삼각형의 완성조건 (2)

def solution(sides):
    answer = 0
    #가장 큰 변의 길이 값이 sides 안에 있는 경우
    for i in range(max(sides)-min(sides)+1,max(sides)+1):
        answer+=1
    #아닌 경우 
    for i in range(max(sides)+1,max(sides)+min(sides)):
        answer+=1
    return answer


Q.외계어 사전

def solution(spell, dic):
    answer = 2
    for d in dic :
        if len(set(spell)-set(d))==0 : #차집합
        #if not (set(spell)-set(d)) : #차집합
            answer=1
            break 
    return answer


DAY 22.dp, 수학, 조건문, 배열
Q.저주의 숫자 3

def solution(n):
    answer = 0
    i=1 #3x 마을에서 쓰는 숫자
    cont=1 #10진법
    while cont<=n :
        #print('10진법 : ', cont , ' 3x 마을: ',i)
        if(cont==n) : 
            answer = i
        if (str(i).find('3')>=0) or (i%3==0) :
        #if i % 3 and '3' not in str(i):
            i+=1
        else : 
            cont+=1
            i+=1
    return answer


Q.평행***

def solution(dots):
    answer = 0
    
    #기울기가 같다면 평행 
    #기울기 = y좌표의차이/x좌표의차이 
    
    cont=1
    while cont<=3 :
        if cont==1 :
            d1,d2,d3,d4 = dots[0],dots[1],dots[2],dots[3]
        if cont==2 :
            d1,d2,d3,d4 = dots[0],dots[2],dots[1],dots[3]
        if cont==3 :
            d1,d2,d3,d4 = dots[0],dots[3],dots[1],dots[2]
        
        l1=(d1[1]-d2[1])/(d1[0]-d2[0])
        l2=(d3[1]-d4[1])/(d3[0]-d4[0])
        '''
        if d1[1]-d2[1]==0 or d1[0]-d2[0]==0 :
            l1=0
        else :
            l1=(d1[1]-d2[1])/(d1[0]-d2[0])
            
        if d3[1]-d4[1]==0 or d3[0]-d4[0]==0 :
            l2=0
        else :
            l2=(d3[1]-d4[1])/(d3[0]-d4[0])
        '''
        if l1==l2:
            return 1
        cont+=1 
        
    return answer


Q.겹치는 선분의 길이***

def solution(lines):
    answer = 0
    
    '''
    tmps=[]
    for l in lines :
        tmp=[]
        for i in range(min(l),max(l)) :
            tmp.append(i)
        tmps.append(set(tmp))
    print('tmps:',tmps) # [{0}, {2, 3, 4}, {3, 4, 5, 6, 7, 8}]
    '''
    
    '''
    집합(set) 자료형
    교집합 s1 & s2 
    합집합 s1 | s2 
    차집합 s1 - s2
    값 1개 추가하기 - add(): add(1) 
    값 여러 개 추가하기 - update() : s1.update([4, 5, 6]) 
    특정 값 제거하기 - remove() : s1.remove(2)
    '''
    sets=[ set(range(min(l),max(l))) for l in lines] #range(min(l), max(l)): 최소값과 최대값 사이의 숫자들로 이루어진 범위를 생성 
    #range(start, end+1)로 하면 오류남 .. 시작점이 같은 것만 계산
    answer = (len(sets[0]&sets[1] | sets[0]&sets[2] | sets[1]&sets[2])) #각 선분끼리의 교집합을 구하고 각각의 교집합의 합집합의 길이를 반환
    
    return answer


Q.유한소수 판별하기

def solution(a, b):
    ''' 일부 테스트케이스 틀림.. 왜 ? ㅠ 
    answer = 0
    
    if a%b==0 : #정수가 되는 경우
        return 1
        
    #최대공약수 찾기
    x=max(a,b)
    y=min(a,b)
    while y!=0:
        x,y=y,x%y
    z=x #최대공약수
    
    #분자와 분모의 최대공약수로 약분
    a=a//z
    b=b//z
    
    #분모 약수 찾기
    tmp=[]
    for i in range(2,b+1):
        if b%i==0 :
            tmp.append(i)
    print(tmp)    
    
    if (2 in tmp) or (5 in tmp) : 
        if (2 in tmp):
            tmp.remove(2)
        if (5 in tmp) :
            tmp.remove(5)
        if len(tmp)>0 :
            return 2
        else : 
            return 1
    #elif (2 in tmp) and (5 in tmp) : 
    #    while
    else : 
        return 2
    '''

    answer = 0
    #기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.
    
    #정수도 유한소수로 분류 
    if a==b % a%b==0:
        return 1
    
    x=max(a,b)
    y=min(a,b)
    while y!=0 : 
        x,y=y,x%y
    a=a//x #x = 최대공약수
    b=b//x
    
    for i in range(b//2) :
        if b%2==0 :
            b=b//2
            if b==1 :
                break
        elif b%5==0:
            b=b//5
            if b==1 : 
                break
    answer = 1 if b==1 else 2 
    
    return answer

'''
from math import gcd 
def solution(a, b):
    b //= gcd(a,b) #gcd (num1, num2....) : num1,num2... 들의 최대 공약수를 출력함 
    while b%2==0:
        b//=2
    while b%5==0:
        b//=5
    return 1 if b==1 else 2
'''

'''
from math import gcd

def solution(a, b):
    b = b / gcd(a, b)
    for i in [2, 5]:
        while not b % i:
            b //= i

    return 1 if b == 1 else 2
'''



DAY 23.배열, 정렬, 문자열
Q.특이한 정렬***

def solution(numlist, n):
    answer=[]
    answer=sorted(numlist,reverse=True)
    answer=sorted(answer,key=lambda x: abs(n-x))
    #key=lambda x: abs(n - x) 의 값에서 나온 결과값이 작은 순서대로 정렬되는 것임. 
    
    '''#?
    answer = sorted(numlist,key = lambda x : (abs(x-n), n-x)) 
     
    '''
    '''
    sorted: 리스트를 정렬하는 파이썬 내장 함수입니다.
    numlist: 정렬할 리스트입니다.
    key: 정렬 기준을 지정하는 옵션입니다. key에는 함수를 전달할 수 있으며, 이 함수의 반환값을 기준으로 리스트를 정렬합니다.
    lambda x: (abs(x - n), n - x): 람다 함수를 사용하여 각 원소 x에 대한 정렬 키를 정의합니다. 이 람다 함수는 튜플을 반환합니다.
    첫 번째 요소는 x와 n 사이의 차이의 절댓값인 abs(x - n)입니다.
    두 번째 요소는 x와 n 사이의 차이인 n - x입니다.
    따라서 리스트 numlist는 주어진 키에 따라 정렬되어 answer에 할당됩니다.
    이 코드의 결과는 numlist의 원소들이 주어진 n 값과의 차이에 따라 정렬된 리스트가 됩니다.

    '''
    return answer


Q.등수 매기기#***

def solution(score):
    answer = []
    tmp=[]
    for i in score : 
        tmp.append(sum(i)/len(i))
    #print('tmp',tmp)
    sort_tmp = sorted(tmp,reverse=True)
    #print('sort_tmp',sort_tmp)
    
    #tmmp=[]
    for t in tmp :
        #print('for: t ',t, ' sort_tmp.index(t)',sort_tmp.index(t))
        answer.append(sort_tmp.index(t)+1)
    
    ''' #틀림 ㅠ 
    for i,j in score :
        tmp.append((i+j)//2)
    tmp.sort(reverse=True)
    print('tmp',tmp)
    
    for i,j in score :
        #print(tmp.index((i+j)//2)+1,end=' ')
        answer.append(tmp.index((i+j)//2)+1)
    #index()는 리스트에서 특정 원소의 인덱스를 반환해주는 함수, 중복된 원소가 있으면 가장 작은 인덱스를 리턴 
    '''
    return answer


Q.옹알이 (1)#***

def solution(babbling):
    words=["aya", "ye", "woo", "ma"]
    answer = 0
    tmp=[]
    
    for b in babbling : 
        for w in words :
            b=b.replace(w," ") #지우고 남은 문자끼리 합쳐지지 않도록 일부러 공백을 둔다.
            #print('b',b,'strip()',b.strip())
            tmp.append(b)
            
            if not b.strip(): 
            #만약 b가 공백 문자열이라면 if b.strip():는 if ''가 되어 거짓(False)이 되고, b가 공백 문자열이 아니라면 if b.strip():는 if b가 되어 참(True)이 됩니다.
                answer+=1 #i가 공백 문자열 또는 문자열 내에 공백만 있는 경우에 참이 되고, 그 외의 경우에는 거짓이 됩니다.
                break
            
        '''
        'abcdefg'.strip('a') : 인자로 전달된 문자를 String의 왼쪽과 오른쪽에서 제거합니다.
        'abcdefg'.lstrip('a') : 인자로 전달된 문자를 String의 왼쪽에서 제거합니다.
        'abcdefg'.rstrip('a') : 인자로 전달된 문자를 String의 오른쪽에서 제거합니다.
        인자가 없을 경우 공백 제거
        
        '''
                
    return answer


Q.로그인 성공?

def solution(id_pw, db):
    answer = ''
    for d in db :
        if d==id_pw : 
            answer='login'
            break
        elif str(d[0])==str(id_pw[0]):
            answer='wrong pw'
            break #*
            '''
            본 조건에도 break가 필요하다. 
            
            login과 wrong pw, fail에 우선 순위가 있기 때문임. 아래 반례 예시 
            입력값 〉 ["abc04", "345"], [["abc04", "335"], ["abc03", "345"]]
            기댓값 〉 "wrong pw"
            '''
        else :
            answer='fail'
    return answer


DAY 24.수학, 시뮬레이션, 문자열, 조건문, 반복문
Q.치킨 쿠폰#***

def solution(chicken):
    answer = 0
    
    coupon = chicken 
    while coupon >=10: 
        ch=coupon//10
        answer+=ch
        coupon=coupon%10
        coupon+=ch
        #print(answer,ch,coupon)
    return answer


Q.이진수 더하기#***

def solution(bin1, bin2):
    answer = ''
    x=int(bin1,2) #int(bin1,2) : bin1 값을 2진수로 변환. 단, bin1 문자열을 받아 정수로 변환 
    y=int(bin2,2)
    #print(bin(x + y))
    answer = bin(x + y)[2:] #ex :  0b11000 처럼 0b가 붙어 나오므로 자름
    #bin(x + y).replace("0b","")
    
    '''
    -int('x',8) 함수 : 8/16/2진수 만자열을 정수형(int) 숫자로 형변환 할 수 있다. 
    
    -oct() : 10진수>8진수 문자열 
    -hex() : 10진수>16진수 문자열 
    -bin() : 10진수 > 2진수 문자열 
    '''
    
    return answer


Q.A로 B 만들기

def solution(before, after):
    answer = 0
    tmp=''
    size=len(before)
    for i in range(size) :
        x=after[i]
        if x in before : 
            idx=before.index(x)
            tmp+=before[idx]
            before = before[:idx]+before[idx+1:]
        else :
            break
    if tmp==after :
        answer = 1
    return answer

    '''
    before=sorted(before)
    after=sorted(after)
    if before==after:
        return 1
    else:
        return 0

    '''


Q.k의 개수

def solution(i, j, k):
    answer = 0
    arrs=list(range(i,j+1))
    for a in arrs :
        if str(k) in str(a) :
            answer+=(str(a).count(str(k)))
    return answer
    #answer = sum([ str(i).count(str(k)) for i in range(i,j+1)])


DAY 25.시뮬레이션, 조건문, 수학
Q.문자열 밀기#***

def solution(A, B):
    answer = 0
    cnt=0
    for i in range(len(A)) : 
        if A == B : 
            break
        else :
            A=list(A)
            A.insert(0,A.pop())
            A=''.join(A)
            cnt+=1
    if A==B :
        answer = cnt
    else :
        answer = -1
        
    return answer

    '''
    from collections import deque

    def solution(A, B):
        a, b = deque(A), deque(B)
        for cnt in range(0, len(A)):
            if a == b:
                return cnt
            a.rotate(1)
        return -1 
    '''


Q.종이 자르기 #***

def solution(M, N):
    answer = 0
    answer=(M*N)-1
    '''
    종이를 1번 자르면 2장
    종이를 2번 자르면 3장
    종이를 3번 자르면 4장
    '''
    return answer


Q.연속된 수의 합 #***

def solution(num, total):
    answer = []
    start=total
    '''
    9번 테스크 케이스만 안됨. 반례예시
    #num=3,total=0,result=[-1,0,1] 일 경우를 위해 
    아래 if num>total 조건을 추가하였음 
    '''
    if num>total :
            start=total+num
    while True :
        arrs=list(range(start,start-num,-1))
        if sum(arrs)==total:
            answer=arrs
            break
        start-=1
        '''
        else :
            arrs=list(range(start,start+num))
            if sum(arrs)==total:
                answer=arrs
                break
            start+=1
        '''
    answer=sorted(answer)
    return answer
    #return [(total - (num * (num - 1) // 2)) // num + i for i in range(num)]
    '''댓글 해석 참조 펌
    1. result를 일반화 시키면 [x+0, x+1, x+2, x+3 ... x + (num-1)]
    2. 그리고 위 값을 전부 더한 값이 total이 됨. total = num*x + num*(num-1)//2 ※ result의 전체요소의 갯수는 num개 이므로 x의 갯수는 num개 이고 상수 부분은 첫번째 항이 0이고 마지막항이 num-1인 등차가 1인 등차수열의 합임.
    3. 2번에서 도출한 공식을 이제 위 코드에 대입해보면 [(total - (num * (num - 1) // 2)) // num + i for i in range(num)] = [num*x + (num * (num - 1) // 2)) - (num * (num - 1) // 2)) // num + i for i in range(num)] = [num*x // num + i for i in range(num)] = [x + i for i in range(num)] 1번에서의 result x식과 일치하므로 정답이 됨.


    '''


Q.다음에 올 숫자

def solution(common):
    answer = 0
    if abs(common[1]-common[0]) == abs(common[2]-common[1]) :
        x=common[1]-common[0] 
        answer=common[-1]+x
    elif (common[1]/common[0]) == common[2]/common[1] :
        x=(common[1]/common[0])
        answer=common[-1]*x 
    return answer

사용 문법 정리


-최대공약수 (약분>최대공약수 : 공통되는 약수 중에서 최대 값)
#for문으로 최대 공약수 찾기
    for i in range(min(x,y),0,-1) : #뒤에서 부터
        if x%i==0 and y%i==0 :
            x=x//i 
            y=y//i
            break 

#유클리드 호제법으로 최대 공약수(GCD, Greatest Common Divisor)를 찾기
    def euclidean_algorithm(a, b):
    # 큰 수와 작은 수를 구분하여 대입
    if a < b:
        a, b = b, a
    
    # b가 0이 될 때까지 반복
    while b != 0:
        # a를 b로 나눈 나머지를 a에 대입하고, b에는 이전의 a를 대입
        a, b = b, a % b
    
    # 최대 공약수인 a를 반환
    return a

#유클리드 호제법2
def gcd(a, b):
    while b > 0:
        a, b = b, a % b
    return a

#math 사용하여 최대 공약수 찾기 
'''
from math import gcd 
def solution(a, b):
    b //= gcd(a,b) #gcd (num1, num2....) : num1,num2... 들의 최대 공약수를 출력함 
    while b%2==0:
        b//=2
    while b%5==0:
        b//=5
    return 1 if b==1 else 2
'''

'''
from math import gcd

def solution(a, b):
    b = b / gcd(a, b)
    for i in [2, 5]:
        while not b % i:
            b //= i

    return 1 if b == 1 else 2
'''


-import math
    gcd(): 최대공약수
    lcm(): 최소공배수

-중앙값
x=sorted(array,reverse=True)
answer = x[len(x)//2]

sorted(array)[len(array) // 2]

-최빈값 
while len(array)!=0 : 
    for i,x in enumerate(set(array)) :
        array.remove(x)
    if i==0 :
        return x 
return -1

-짧게
return [i*2 for i in numbers]
answer = [i for i in range(1,n+1) if i%2!=0]
return [i for i in range(1, n+1, 2)]
return sum([i for i in range(2, n + 1, 2)])
answer = sorted(numlist,key = lambda x : (abs(x-n), n-x)) 

-배열 뒤집기 
for i in range (len(num_list)//2) :
    num_list[i],num_list[len(num_list)-1-i] = num_list[len(num_list)-1-i], num_list[i]
num_list[::-1]
num_list.reverse()
while(num_list):
    result.append(num_list.pop())

-문자열 뒤집기
for x in my_string : 
    answer=x+answer
return my_string[::-1]
return ''.join(list(reversed(my_string)))
for i in range(len(my_string)-1, -1, -1) :
    answer += my_string[i]

-리스트>문자열
str = ''.join(list)

-딕셔너리 dictionary 
dic = {"a": 1, "b": 2}
dic[key] : dic["a"] > 1 #단, key 값이 없는 경우 에러
dic.get(key) : dic.get("a") > 1 #key 값이 없는 경우 None  
dict.get(key, default=None) : print(a.get("c", 0)) > 0 #key가 존재하지 않을 경우 default 값을 출력함 

-조합 ; 경우의 수 
서로 다른 n개 중 m개를 뽑는 경우의 수 공식
조합 nCm = (n-m)!*m! 분의 n! 
n! 
---------
(n-m)!*m!

import math
    def solution(balls,share):
        return math.comb(balls,share)

def fac(n):
        ret=1
        for i in range(1,n+1) :
            ret*=i
        return ret
answer = fac(balls)//((fac(balls-share))*fac(share))


-배열 회전 
if direction=='right':
    numbers.insert(0,numbers.pop())
elif direction=='left':
    numbers.append(numbers.pop(0))

-팩토리얼
factorial = 1
while factorial <= n:
    factorial = factorial * answer

-함수 
isalpha() : x.isalpha() 알파벳 인지 ? 
isdigit() : i.isdigit() 숫자인지 ? 

-집합(set) 자료형
교집합 s1 & s2 : set(s1)&set(s2) 교집합 #set()의 & 연산자는 두 집합(sets) 간의 교집합을 반환 
합집합 s1 | s2 
차집합 s1 - s2
값 1개 추가하기 - add(): add(1) 
값 여러 개 추가하기 - update() : s1.update([4, 5, 6]) 
특정 값 제거하기 - remove() : s1.remove(2)

-평행 ; 기울기
좌표에서 기울기가 같다면 평행
기울기 = y좌표의차이/x좌표의차이 

-수
제곱수  x=n**(1/2) #제곱근 2분의 1승
기약분수 분모의 소인수가 2와 5만 존재해야 합니다.

-int()
int() : x=int(bin1,2) #bin1 값을 2진수로 변환. 단, bin1 문자열을 받아 정수로 변환  
>>>> bin(x)[2:], bin(x).replace("0b","") #ex:0b11000 처럼 0b가 붙어 나오므로 자름 
int('x',8) 함수 : 8/16/2진수 만자열을 정수형(int) 숫자로 형변환 할 수 있다. 
oct() : 10진수>8진수 문자열 
hex() : 10진수>16진수 문자열 
bin() : 10진수 > 2진수 문자열 

-문자열 밀기 
from collections import deque

def solution(A, B):
        a, b = deque(A), deque(B)
        for cnt in range(0, len(A)):
            if a == b:
                return cnt
            a.rotate(1)
        return -1 

-종이 자르기
answer=(M*N)-1
'''
종이를 1번 자르면 2장
종이를 2번 자르면 3장
종이를 3번 자르면 4장
'''

프로그래머스-코딩 기초 트레이닝

https://school.programmers.co.kr/learn/challenges/training?order=acceptance_desc 

 

코딩 기초 트레이닝 | 프로그래머스 스쿨

프로그래밍 언어를 처음 접하거나 프로그래밍 언어에 익숙해지고 싶다면? 코딩 역량을 탄탄하게 길러주는 코딩 기초 트레이닝으로 차근차근 코딩에 대한 기초 감각을 길러 보세요.

school.programmers.co.kr


코딩 기초 트레이닝 캘린더

 

 


DAY1.출력

Q.문자열 출력하기

str = input()
print(str)


Q.a와 b 출력하기

a, b = map(int, input().strip().split(' '))
print('a =', a)
print('b =', b)

 


Q.문자열 반복해서 출력하기

a, b = input().strip().split(' ')
b = int(b)

for i in range(b) :
    print(a, end='')


Q.대소문자 바꿔서 출력하기

str = input()
str2='' 
for x in str : 
    if x.isupper() :
        str2+=x.lower()
    else:
        str2+=x.upper()
print(str2)
'''
오답(에러)
주어진 코드에서 출력이 원하는 대로 나오지 않는 이유는 
반복문 안에서 x 변수에 대한 변환 작업은 원본 문자열인 str에 적용되지 않기 때문입니다. 
Python에서 문자열은 불변(immutable)하며, 문자열을 수정하려면 새로운 문자열을 생성해야 합니다.
'''
for i in range(len(str)) : 
    if str[i].isupper() : 
        str[i].lower()
        print(str[i])
    else :
        str[i]=str[i].upper()
print(str)


Q.특수문자 출력하기

출력예시 : !@#$%^&*(\'"<>?:;

print('!@#$%^&*(\\\'"<>?:;')

 

Day 2.출력, 연산
Q.덧셈식 출력하기

a, b = map(int, input().strip().split(' '))
print(a,'+',b,'=',a+b)

Q. 문자열 붙여서 출력하기

str1, str2 = input().strip().split(' ')
print(str1+str2)
#print(str1, str2, sep='')

Q. 문자열 돌리기

str = input()
for x in str :
    print(x)

Q. 홀짝 구분하기

a = int(input())
if a%2==0 :
    print(a,'is even')
else :
    print(a, 'is odd')

Q. 문자열 겹쳐쓰기

def solution(my_string, overwrite_string, s):
    answer = ''
    answer+=my_string[0:s]
    answer+=overwrite_string
    if len(answer)<len(my_string):
        answer+=my_string[len(answer):]
    # answer = my_string[:s]+overwrite_string+my_string[s+len(overwrite_string):]
    return answer

 

Day 3.연산
Q.문자열 섞기

def solution(str1, str2):
    answer = ''
    for i in range(len(str1)):
        answer+=str1[i]+str2[i]
    return answer


Q.문자 리스트를 문자열로 변환하기

def solution(arr):
    answer = ''
    for x in arr:
        answer+=x
    return answer


Q.문자열 곱하기

def solution(my_string, k):
    answer = ''
    for i in range(k):
        answer+=my_string
    return answer



Q.더 크게 합치기

def solution(a, b):
    answer = 0
    x=int(str(a)+str(b))
    y=int(str(b)+str(a))
    if x>y or x==y:
        answer=x
    else :
        answer=y

    return answer



Q.두 수의 연산값 비교하기

def solution(a, b):
    answer = 0
    x=int(str(a)+str(b))
    y=2*int(a)*(b)
    if x>y or x==y :
        answer=x
    else : 
        answer=y
    return answer
    #return max(int(str(a) + str(b)), 2 * a * b)
    #return int(str(a) + str(b)) if int(str(a) + str(b)) > 2*a*b else 2*a*b


Day 4.연산, 조건문
Q.n의 배수

def solution(num, n):
    answer = 1 if num%n==0 else 0
    return answer


Q.공배수

def solution(number, n, m):
    #오답
    #answer = 1 if number%(n*m)==0 else 0
    answer = 1 if (number%n==0 and number%m==0) else 0 
    return answer



Q.홀짝에 따라 다른 값 반환하기

def solution(n):
    answer = 0
    if n%2==0 :
        for i in range(2,n+1,2) :
            answer+=i*i
    else : 
        for i in range(1,n+1,2) :
            answer+=i
    return answer


Q.조건 문자열

def solution(ineq, eq, n, m):
    answer = 0
    #ㅎㅎ?
    if ineq=='<':
        if eq=='=' and n<=m :
            answer = 1 
        if eq=='!' and n<m :
            answer = 1
    elif ineq=='>':
        if eq=='=' and n>=m :
            answer = 1 
        if eq=='!' and n>m :
            answer = 1
    return answer



Q.flag에 따라 다른 값 반환하기

def solution(a, b, flag):
    answer = 0
    answer = a+b if flag else a-b
    return answer

 


DAY 5.조건문
Q.코드 처리하기

def solution(code):
    ret = ''
    mode=0
    for i in range(len(code)) : 
        x=str(code[i])
        if mode==0 :
            if x!='1' and i%2==0  :
                ret+=x
            elif x=='1': 
                mode=1
        else :
            if x!='1' and i%2!=0 :
                ret+=x
            elif x=='1': 
                mode=0
        #print(i, x, mode, ret, sep=' ')
    ret= 'EMPTY' if ret=='' else ret 
    # return answer if answer else 'EMPTY'
    return ret


Q.등차수열의 특정한 항만 더하기

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


Q.주사위 게임 2

def solution(a, b, c):
    answer = 0
    if a==b==c : 
        answer+=(a+b+c)*(a*a+b*b+c*c)*(a*a*a+b*b*b+c*c*c)
    elif a==b or a==c or b==c :
        answer+=(a+b+c)*(a*a+b*b+c*c)
    else :
        answer+=(a+b+c)
    return answer
    #answer *= a**(i+1)+b**(i+1)+c**(i+1)


Q.원소들의 곱과 합

def solution(num_list):
    answer = 0
    sum1=0
    sum2=1
    for x in num_list :
        sum1+=x
        sum2*=x
    if sum1**2>sum2 :
        answer = 1    
    elif sum1**2<sum2 : 
        answer = 0 
    return answer
    #sum(num_list)



Q.이어 붙인 수

def solution(num_list):
    answer = 0
    a=''
    b=''
    for x in num_list : 
        if x%2==0 : 
            a+=str(x)
        else : 
            b+=str(x)
    answer = int(a) + int(b)
    return answer



DAY 6.조건문, 반복문
Q.마지막 두 원소

def solution(num_list):
    answer = []
    size=len(num_list)
    if num_list[size-1] > num_list[size-2] :
        num_list.append(num_list[size-1]-num_list[size-2])
    else : 
        num_list.append(num_list[size-1]*2)
    answer=num_list
    return answer
    # a=num_list[-1]
    # b=num_list[-2]



Q.수 조작하기 1

def solution(n, control):
    for x in control :
        if x=='w' : 
            n=n+1 
        elif x=='s':
            n=n-1
        elif x=='d':
            n=n+10
        elif x=='a':
            n=n-10
    return n


Q.수 조작하기 2

def solution(numLog):
    answer = ''
    for i in range(1,len(numLog)) :
        tmp = numLog[i]-numLog[i-1]
        if tmp==1 :
            answer+='w'
        elif tmp==-1:
            answer+='s'
        elif tmp==10:
            answer+='d'
        elif tmp==-10:
            answer+='a'
    return answer


Q.수열과 구간 쿼리 3

def solution(arr, queries):
    for x in queries : 
        i,j=x[0],x[1]
        arr[i],arr[j] = arr[j],arr[i]
    return arr
    #for a,b in queries:
    #    arr[a],arr[b]=arr[b],arr[a]


Q.수열과 구간 쿼리 2

def solution(arr, queries):
    answer = []
    for s,e,k in queries : 
        tmp=arr[s:e+1]
        minValue = 2147000000 
        for x in tmp :
            if x>k and minValue>x : 
                minValue = x
        if minValue!=2147000000 : 
            answer.append(minValue)
        else :
            answer.append(-1)
    return answer
    #m=float('inf')
    #min(tmp)


DAY 7.반복문
Q.수열과 구간 쿼리 4

def solution(arr, queries):
    for s,e,k in queries : 
        #tmp = arr[s:e+1]
        for i in range(s,e+1) : 
            if i%k==0 : 
                arr[i]=arr[i]+1
    return arr


Q.배열 만들기 2

def solution(l, r):
    answer = []
    #*
    for num in range(l,r+1):
        if not set(str(num)) - set(['0','5']) :
            answer.append(num)
'''
set(str(num))은 num을 문자열로 변환하고, 문자열을 중복되지 않는 집합(set)으로 변환합니다. 집합은 중복된 요소를 포함하지 않으므로, 각 문자가 한 번만 나타납니다.
set(['0', '5'])는 문자 '0'과 '5'로 이루어진 문자열 리스트를 집합으로 변환합니다.
그런 다음 set(str(num)) - set(['0', '5'])는 num을 문자열로 변환한 집합에서 '0'과 '5'로 이루어진 집합을 뺀 결과를 나타냅니다. 만약 num의 문자열 표현에 '0' 또는 '5'가 없다면, 이 연산 결과는 빈 집합이 됩니다.
'''
    return answer if answer else [-1]


Q.카운트 업

def solution(start_num, end_num):
    return list(range(start_num, end_num+1))
#return [i for i in range(start,end+1)]


Q.콜라츠 수열 만들기

def solution(n):
    answer=[n]    
    while n>1 : 
        if n%2==0 : 
            n=n//2
        else :
            n=3*n+1
        answer.append(n)
    return answer


Q.배열 만들기 4

def solution(arr):
    stk = []
    i=0
    while i < len(arr) :
        if len(stk)==0 : 
            stk.append(arr[i])
            i+=1
        else : 
            if stk[-1] < arr[i] :
                stk.append(arr[i])
                i+=1
            else : 
                stk.pop() #*
    return stk


DAY 8.조건문,문자열
Q.간단한 논리 연산

def solution(x1, x2, x3, x4):
    #논리합 OR ∨ , 논리곱 AND ∧ (True 1, False 0)
    answer = True
    a=(True if x1==True or x2==True else False)
    b=(True if x3==True or x4==True else False)
    answer = False if a==False or b==False else True 
    return answer
#return (x1 | x2) & (x3 | x4)
#return (x1 or x2) and (x3 or x4)


Q.주사위 게임 3

#런타임에러 ㅠ ㅠ 
def solution(a, b, c, d):
    answer = 0
    x=set([a,b,c,d])
    y=list([a,b,c,d])

    if len(x)==1 : 
        answer=1111*a
    elif len(x)==4 :
        answer=min(x)
    elif len(x)==3 :
        ch=[0]*7
        p=0
        for i in y:
            ch.insert(i,(ch[i]+1))
        for i in ch:
            if ch[i]>1 :
                p=i
                break
        tmp=y
        tmp.remove(p) #list.remove(value) 하나만 제거함
        tmp.remove(p)
        q=tmp[0]
        r=tmp[1]
        answer=q*r
    elif len(x)==2 :
        ch=list([0]*7)
        for i in y:
            ch[i]=ch[i]+1
        #answer=int(str(ch[0])+str(ch[1])+str(ch[2])+str(ch[3])+str(ch[4])+str(ch[5])+str(ch[6]))
        for i in range(len(ch)):
            if ch[i]==3:
                answer=333
                tmp=y
                p=i
                tmp.remove(p)
                tmp.remove(p)
                tmp.remove(p)
                q=tmp[0]
                answer=(10*p+q)**2
                break
                
        if answer==0 :
            tmp=list(x)
            p=tmp[0]
            q=tmp[1]
            answer=(p+q)*abs(p-q)
    return answer

#정답 코드 https://school.programmers.co.kr/questions/47795 
def solution(a, b, c, d):
    answer = 0
    arr=[a,b,c,d]
    counts=[arr.count(i) for i in arr] #각 숫자의 출현 횟수를 저장
    
    if max(counts)==4 : #모두 같은 경우
        answer=1111*a
    elif max(counts)==3 : #pppq
        p=arr[counts.index(3)]
        q=arr[counts.index(1)]
        answer=(10*p+q)**2
    elif max(counts)==2: #ppqr or ppqq 
        if min(counts) == 2:
            return (a + c) * abs(a - c) if a == b else (a + b) * abs(a - b) #?
        else:
            p = arr[counts.index(2)]
            return (a * b * c * d) / p**2 #?
    else : #모두 다른 경우
        answer=min(arr)
        
    return answer


Q.글자 이어 붙여 문자열 만들기

def solution(my_string, index_list):
    answer = ''
    for x in index_list : 
        answer+=my_string[x]
    return answer
Q.9로 나눈 나머지
def solution(number):
    return int(number)%9


Q.문자열 여러 번 뒤집기

def solution(my_string, queries):
    for s,e in queries : 
        '''
        for i in range(e-s+1//2) : 
            #my_string[s+i], my_string[e-i] = my_string[e-i],my_string[s+i] #오류남
        '''  
        my_string = my_string[:s] + my_string[s:e+1][::-1] + my_string[e+1:]
        #my_string[start:end+1][::-1]는 파이썬에서 문자열을 일부분 선택한 후 그 부분을 뒤집는 연산을 수행하는 코드
    return my_string



DAY 9.문자열
Q.배열 만들기 5

def solution(intStrs, k, s, l):
    answer = []
    for x in (intStrs) :
        x=int(x[s:s+l])
        if x>k :
            answer.append(x)
    return answer


Q.부분 문자열 이어 붙여 문자열 만들기

def solution(my_strings, parts):
    answer = ''
    for i in range(len(my_strings)) :
        str=my_strings[i]
        s,e = parts[i]
        answer+=str[s:e+1]
    return answer


Q.문자열의 뒤의 n글자

def solution(my_string, n):
    return my_string[len(my_string)-n:]
    #return my_string[-n:]


Q.접미사 배열

def solution(my_string):
    answer = []
    size=len(my_string)
    for i in range (size):
        answer.append(my_string[i:])
    answer.sort()
    return answer


Q.접미사인지 확인하기

def solution(my_string, is_suffix):
    answer = 0
    for i in range(len(my_string)) :
        if(my_string[i:] == is_suffix) :
            answer=1
        if answer==1:
            break 
    else : 
        answer=0
        
    return answer
    #return int(my_string.endswith(is_suffix)) #endsWith()는 특정문자열로 어떤 string이 특정문자열로 끝나는지를 검사해서 그 값을 Boolean값으로 반환
    #return int(my_string[-len(is_suffix):] == is_suffix)


DAY 10.문자열
Q.문자열의 앞의 n글자

def solution(my_string, n):
    return my_string [:n]


Q.접두사인지 확인하기

def solution(my_string, is_prefix):
    #answer = 1 if my_string.startswith(is_prefix) else 0 
    answer = 1 if my_string[:len(is_prefix)] == is_prefix else 0
    return answer


Q.문자열 뒤집기

def solution(my_string, s, e):
    return my_string[:s]+my_string[s:e+1:][::-1]+my_string[e+1:]



Q.세로 읽기

def solution(my_string, m, c):
    return my_string[c-1::m]


Q.qr code

def solution(q, r, code):
    answer = ''
    for i in range(len(code)) :
        if i%q == r :
            answer+=code[i]
    return answer


DAY 11.리스트(배열)
Q.문자 개수 세기

def solution(my_string):
    answer = []
    #아스키코드 변환 ord():문자>숫자/chr():숫자>문자
    answer=[my_string.count(chr(i)) for i in range(ord('A'), ord('Z') + 1)] + [my_string.count(chr(i)) for i in range(ord('a'), ord('z') + 1)]
    return answer


Q.배열 만들기 1

def solution(n, k):
    answer = []
    for i in range(1,n+1) :
        if i%k==0 :
            answer.append(i)
    return answer
    #return [i for i in range(k,n+1,k)]
    #return [i for i in range(1, n+1) if i % k == 0]



Q.글자 지우기

def solution(my_string, indices):
    answer=''
    for i in range(len(my_string)) : 
        if i not in indices :
            answer +=my_string[i]
    return answer


Q.카운트 다운

def solution(start, end_num):
    answer=[]
    ret=start
    while ret >= end_num :
        answer.append(ret)
        ret-=1
    return answer
    #return list(range(start,end-1,-1))


Q.가까운 1 찾기

def solution(arr, idx):
    answer = 0
    for i in range(len(arr)):
        if i >= idx and arr[i] == 1 :
            answer=i
            break
    else :
        answer=-1 
    
    return answer


DAY 12.리스트(배열)
Q.리스트 자르기

def solution(n, slicer, num_list):
    answer = []
    a,b,c=slicer 
    if n==1 :
        num_list=num_list[0:b+1]
    elif n==2:
        num_list=num_list[a:]
    elif n==3:
        num_list=num_list[a:b+1]
    elif n==4:
        num_list=num_list[a:b+1:c]
    answer=num_list
    return answer



Q.첫 번째로 나오는 음수

def solution(num_list):
    answer = 0
    for x in num_list :
        if x<0 : 
            answer=num_list.index(x) #index(): x를 찾은 가장 첫 번째 인덱스
            break
    else : 
        answer=-1
    return answer


Q.배열 만들기 3

def solution(arr, intervals):
    answer = []
    for s,e in intervals :
        for i in arr[s:e+1] :
            answer.append(i)
    return answer
    #for a,b in intervals: answer+=arr[a:b+1]


Q.2의 영역

def solution(arr):
    answer = []
    s=0
    e=0
    for i in range(len(arr)):
        if arr[i] == 2 : 
            s=i
            break 
    for j in range(len(arr)-1,-1,-1):
        if arr[j] == 2:
            e=j
            break
    if arr.count(2)==0 :
        answer.append(-1)
    else :
        answer+=arr[s:e+1]
    return answer
    
    #if 2 not in arr:
    #    return [-1]
    #return arr[arr.index(2) : len(arr) - arr[::-1].index(2)]


Q.배열 조각하기

def solution(arr, query):
    answer = []
    for i in range(len(query)) :
        if i%2==0 :
            arr=arr[:query[i]+1]
        else :
            arr=arr[query[i]:]
    return arr



DAY 13.리스트(배열)
Q.n 번째 원소부터

def solution(num_list, n):
    return num_list[n-1:]


Q.순서 바꾸기

def solution(num_list, n):
    return num_list[n:]+num_list[:n]


Q.왼쪽 오른쪽

def solution(str_list):
    answer = []
    for i in str_list : 
        if i=="l" :
            answer=str_list[:str_list.index("l")]
            break
        elif i=="r":
            answer=str_list[str_list.index("r")+1:]
            break
    return answer


Q.n번째 원소까지

def solution(num_list, n):
    return num_list[:n]


Q.n개 간격의 원소들

def solution(num_list, n):
    return num_list[::n]



DAY 14.리스트(배열)
Q.홀수vs짝수

def solution(num_list):
    answer = 0
    sum1=0
    sum2=0
    for i in range(len(num_list)):
        if i%2==0:
            sum1+=num_list[i]
        else :
            sum2+=num_list[i]
    answer=sum1 if sum1>=sum2 else sum2 
    return answer
    #return max(sum(num_list[::2]), sum(num_list[1::2]))



Q.5명씩

def solution(names):
    answer = []
    for i in range(0,len(names),5):
        answer.append(names[i])
    return answer
    #return names[::5]



Q.할 일 목록

def solution(todo_list, finished):
    answer = []
    for i in range(len(todo_list)) :
        if not finished[i] :
            answer.append(todo_list[i])
    return answer
    #return [work for idx, work in enumerate(todo_list) if not finished[idx]]



Q.n보다 커질 때까지 더하기

def solution(numbers, n):
    answer = 0
    i=0
    while answer<=n:
        answer+=numbers[i]
        i+=1
    return answer



Q.수열과 구간 쿼리1

def solution(arr, queries):
    answer = []
    '''
    #테스트 케이스 하나만 정답 .. 나머지 케이스 모두 틀림
    for i in range(len(arr)):
        if i<len(queries):
            s,e = queries[i]
            if s<=i<=e :
                for j in range (s,e+1) : 
                   arr[j] +=1
    '''
    
    for i,q in enumerate(queries) :
        s=q[0]
        e=q[1]
        #if s<=i<=e : 
        for k in range(s,e+1) :
            arr[k]+=1
    return arr



DAY 15.리스트(배열),문자열
Q.조건에 맞게 수열 변환하기 1

def solution(arr):
    answer = []
    for idx,x in enumerate(arr) : 
        if x>=50 and x%2==0 :
            arr[idx]=x//2
        elif x<50 and x%2!=0 :
            arr[idx]=x*2
    return arr


Q.조건에 맞게 수열 변환하기 2 

def solution(arr):
    '''
    #* ㅠ 
    answer = 0
    arr2=[]
    arr2.append(arr.copy()) #arr2.append(arr) 안됨. 
    for x in range(len(arr)) : 
        tmp=[]
        for i in range(len(arr)) : 
            
            x = arr[i]
            if x>=50 and x%2==0 :
                arr[i]=x//2
            elif x<50 and x%2!=0 :
                arr[i]=x*2+1
            tmp.append(arr[i])
        arr2.append(tmp)
        
    for i in range(len(arr2)) :
        if arr2[i] == arr2[i+1] : 
            answer = i
            break
    '''
    
    idx = 0
    pre = arr 
    while True : 
        tmp = []
        for x in pre :
            if x>=50 and x%2==0 :
                tmp.append(x//2)
            elif x<50 and x%2!=0 :
                tmp.append(x*2+1)
            else : 
                tmp.append(x)
        if pre == tmp : 
            break
        
        idx+=1
        pre=tmp
    answer = idx     
    return answer


Q.1로 만들기

def solution(num_list):
    answer = 0
    for x in num_list : 
        while x>1 :
            if x%2==0 :
                answer+=1
                x=x//2
            elif x%2!=0 :
                answer+=1
                x=(x-1)//2
    return answer


Q.길이에 따른 연산

def solution(num_list):
    answer = 0
    if len(num_list)>=11 :
        for i in num_list : 
            answer+=i
    elif len(num_list)<=10 :
        answer+=1
        for i in num_list : 
            answer*=i
    return answer
    #return sum(num_list) if len(num_list)>=11 else prod(num_list)


Q.원하는 문자열 찾기

def solution(myString,pat):
            
    answer = 0
    myString=myString.upper()
    pat=pat.upper()
    #if(myString.startswith(pat)) : answer=1 ##?? 안되는건가 ?
    
    '''
    #정확성: 90.9 ㅠ 
    for i in range(len(myString)-len(pat)) :
        if myString[i:i+len(pat)] == pat :
            answer = 1 
            break
    '''
    
    if pat in myString : 
        answer=1
        
    return answer
    #return int(pat.lower() in myString.lower())



DAY 16.문자열
Q.대문자로 바꾸기

def solution(myString):
    return myString.upper()


Q.소문자로 바꾸기

def solution(myString):
    return myString.lower()


Q.배열에서 문자열 대소문자 변환하기

def solution(strArr):
    for i in range(len(strArr)):
        if i%2==0:
            strArr[i]=strArr[i].lower()
        else : 
            strArr[i]=strArr[i].upper()
    return strArr


Q.A 강조하기

def solution(myString):
    answer = ''
    for x in myString : 
        if x=='a':
            answer+=x.upper()
        elif x!="A" and x.isupper() :
            answer+=x.lower()
        else :
            answer+=x
    return answer
    #return myString.lower().replace('a', 'A')


Q.특정한 문자를 대문자로 바꾸기

def solution(my_string, alp):
    answer = ''
    '''
    for x in my_string :
        if x==alp :
            answer+=x.upper()
        else :
            answer+=x
    '''
    answer = my_string.replace(alp,alp.upper())
    return answer


DAY 17.문자열
Q.특정 문자열로 끝나는 가장 긴 부분 문자열 찾기

def solution(myString, pat):
    answer = ''
    ''' # 틀림 
    for i in range (len(myString)-len(pat),0,-1):
        if myString[i:i+len(pat)] == pat :
            answer = myString[:i+1] #ㅠ 틀림 .
            break
    '''
    
    #index(), find() <--> rindex(), rfind() : 뒤에서 부터
    #find(찾을 문자열), find(찾을 문자열, 시작 위치), find(찾을 문자열, 시작 위치, 종료 위치) 
    #만약 없을 경우 find()에서는 -1을 리턴하는 반면, index()에서는 ValueError가 발생
    
    answer = myString[:myString.rfind(pat)+len(pat)]
    return answer



Q.문자열이 몇 번 등장하는지

def solution(myString, pat):
    answer = 0
    for i in range(len(myString)-len(pat)+1) :
        if myString[i:i+len(pat)] == pat : 
            answer+=1
    return answer


Q.ad 제거하기

def solution(strArr):
    answer = []
    ''' 틀림 ㅠ 
    for x in strArr : 
        if x.find("ad")>0 :
            strArr.remove(x) 
    '''
    for x in strArr : 
        if x.find("ad")<0 :
            answer.append(x)

    return strArr
    #return [word for word in strArr if 'ad' not in word]



Q.공백으로 구분하기 1

def solution(my_string):
    answer=list(my_string.split())
    return answer
    #return my_string.split()


Q.공백으로 구분하기 2

def solution(my_string):
    return my_string.split()



DAY 18.문자열
Q.x 사이의 개수 

def solution(myString):
    answer = []
    for x in myString.split('x') :
        answer.append(len(x))
    return answer
    #return [len(w) for w in myString.split('x')]



Q.문자열 잘라서 정렬하기

def solution(myString):
    answer = []
    tmp=myString.split('x')
    for i in tmp :
        if i!="" :
            answer.append(i)
    answer.sort()
    return answer
    #return sorted(ch for ch in myString.split('x') if ch)
    '''
    myString.split('x'): 문자열 myString을 'x'를 구분자로 사용하여 분할한 후 각 부분을 리스트로 반환합니다. 예를 들어, "ABCxDEFxGHI"를 "x"로 분할하면 ['ABC', 'DEF', 'GHI']가 됩니다.
    for ch in myString.split('x') if ch: 리스트 컴프리헨션을 사용하여 분할된 문자열 중 빈 문자열("")을 필터링하여 제거합니다. 이 부분은 if ch 조건을 사용하여 빈 문자열이 아닌 경우에만 포함합니다.
    sorted(): 리스트를 정렬합니다. 위 코드에서는 문자열이 사전순으로 정렬됩니다.
    '''



Q.간단한 식 계산하기

def solution(binomial):
    answer = 0
    a,op,b = binomial.split()
    if op=='+' : 
        answer=int(a)+int(b)
    elif op=='-':
        answer=int(a)-int(b)
    elif op=='*':
        answer=int(a)*int(b)
    return answer
    #return eval(binomial)
    #expression (=식)을 문자열로 받아서, 실행하는 함수


Q.문자열 바꿔서 찾기

def solution(myString, pat):
    answer = 0
    tmp = ""
    for ch in myString :
        if ch=="B" : 
            tmp+="A" 
        else :
            tmp+="B"
    answer = 1 if tmp.find(pat)>=0 else 0 
    return answer


Q.rny_string

def solution(rny_string):
    answer = ''
    for i in range(len(rny_string)) :
        if rny_string[i]=='m' :
            answer+='rn'
        else : 
            answer+=rny_string[i]
    return answer
    #return rny_string.replace('m', 'rn')


DAY 19.문자열,리스트(배열)
Q.세 개의 구분자

def solution(myStr):
    answer = []
    x1=[]
    for x in myStr.split('a') : 
        tmp = list(ch for ch in x.split('b') if ch)
        x1+=tmp
    x2=[]
    for x in x1 : 
        tmp = list(ch for ch in x.split('c') if ch)
        x2+=tmp
        
    answer = x2 if len(x2)>0 else ["EMPTY"]
    return answer



Q.배열의 원소만큼 추가하기

def solution(arr):
    answer = []
    for i in arr : 
        for x in range (i) :
            answer.append(i)
    return answer



Q.반 배열에 추가, 삭제하기

def solution(arr, flag):
    answer = []
    for i in range(len(arr)) :
        if flag[i] :
            for j in range (arr[i]*2) :
                answer.append(arr[i])
        else : 
            for j in range (arr[i]) :
                answer.pop()
    return answer



Q.배열 만들기 6

def solution(arr):
    stk = []
    for i in range(len(arr)) : 
        x=arr[i]
        if len(stk)==0 : 
            stk.append(x)
        elif stk[len(stk)-1]==x :
            stk.pop()
        elif stk[len(stk)-1]!=x :
            stk.append(x)
    if len(stk)==0 : 
        stk.append(-1)
    return stk
    #elif stk[-1] == arr[i]:


Q.무작위로 K개의 수 뽑기

def solution(arr, k):
    answer = []
    idx=0
    while idx<len(arr) :
        if arr[idx] not in answer : 
            answer.append(arr[idx])
        if len(answer)==k : 
            break 
        idx+=1
    if len(answer)<k :
        while len(answer)<k:
            answer.append(-1)
    return answer


DAY 20.함수(메서드)
Q.배열의 길이를 2의 거듭제곱으로 만들기

def solution(arr): #ㅠ
    answer = []
    i=1
    while i<len(arr):
        i=i*2
    for j in range(i-len(arr)) :
        arr.append(0)
    return arr 
    '''
    a = 1
    b = len(arr)
    while a < b :
        a *= 2
    return arr + [0] * (a-b)
    '''


Q.배열 비교하기

def solution(arr1, arr2):
    answer = 0
    if len(arr1)==len(arr2) :
        sum1=0
        sum2=0
        for i in range (len(arr1)) : 
            sum1+=arr1[i]
            sum2+=arr2[i]
        if sum1==sum2 :
            answer = 0
        else : 
            answer = 1 if sum1>sum2 else -1
    else : 
        answer = 1 if len(arr1)>len(arr2) else -1
    return answer
    #sum(arr1), sum(arr2)


Q.문자열 묶기

def solution(strArr):
    arr=[0]*(len(strArr)+1)
    for x in strArr : 
        arr[len(x)]+=1
    return max(arr)
    '''
    a=[0]*31
    for x in strArr: a[len(x)]+=1
    return max(a)
    '''


Q.배열의 길이에 따라 다른 연산하기

def solution(arr, n):
    if len(arr)%2==0 : 
        for i in range (1,len(arr),2) :
            arr[i]+=n
    else : 
        for i in range(0,len(arr),2) : 
            arr[i]+=n
    return arr


    
Q.뒤에서 5등까지

def solution(num_list):
    answer = []
    for i in range(5):
        x=min(num_list)
        answer.append(x)
        num_list.remove(x)
    return answer
    #return sorted(num_list)[:5]


DAY 21.함수(메서드)
Q.뒤에서 5등 위로

def solution(num_list):
    answer = []
    #list.sort() 본 리스트를 정렬해서 반환
    #sorted(리스트) 는 본 리스트를 기반하여 정렬한 새로운 리스트를 반환
    return sorted(num_list)[5:]


Q.전국 대회 선발 고사

def solution(rank, attendance):
    answer = 0
    rank2=[]
    for i in range(len(rank)) : 
        if attendance[i]==True : 
            rank2.append(rank[i])
    a,b,c = sorted(rank2)[:3]
    answer = 10000*rank.index(a) + 100*rank.index(b) + rank.index(c)
    return answer


Q.정수 부분

def solution(flo):
    return int(flo)
    ##flo//1


Q.문자열 정수의 합

def solution(num_str):
    answer = 0
    for x in num_str : 
        answer +=int(x)
    return answer


Q.문자열을 정수로 변환하기

def solution(n_str):
    return int(n_str)



DAY 22.함수(메서드), 조건문 활용
Q.0 떼기

def solution(n_str):
    answer = ''
    while True : 
        if n_str[0]=='0' : 
            n_str=n_str[1:]
        else :
            break
    return n_str
    #return n_str.lstrip('0')
    #return str(int(n_str))
    '''
    'abcdefg'.strip('a') : 인자로 전달된 문자를 String의 왼쪽과 오른쪽에서 제거합니다.
    'abcdefg'.lstrip('a') : 인자로 전달된 문자를 String의 왼쪽에서 제거합니다.
    'abcdefg'.rstrip('a') : 인자로 전달된 문자를 String의 오른쪽에서 제거합니다.
    인자가 없을 경우 공백 제거
    '''


Q.두 수의 합

    def solution(a, b):
    return str(int(a)+int(b))



Q.문자열로 변환

def solution(n):
    return str(n)


Q.배열의 원소 삭제하기

def solution(arr, delete_list):
    for x in delete_list : 
        if x in arr : 
            arr.remove(x)
    return arr


Q.부분 문자열인지 확인하기

def solution(my_string, target):
    answer = 0 if my_string.find(target)<0 else 1
    return answer



DAY 23.조건문 활용
Q.부분 문자열

def solution(str1, str2):
    return 0 if str2.find(str1)<0 else 1 
    #return int(str1 in str2)



Q.꼬리 문자열

def solution(str_list, ex):
    answer = ''
    for x in str_list : 
        if ex not in x :
            answer +=x 
    return answer



Q.정수 찾기

def solution(num_list, n):
    return 1 if n in num_list else 0 
    #return int(n in num_list)


Q.주사위 게임 1

def solution(a, b):
    answer = 0
    if a%2!=0 and b%2!=0 :
        answer = a**2 + b**2 
    elif a%2==0 and b%2==0 : 
        answer = abs(a-b) #abs():절댓값 함수
    else : 
        answer = 2*(a+b)
    return answer



Q.날짜 비교하기

def solution(date1, date2):
    answer = -1
    for i in range (3) :
        if date1[i]<date2[i] : 
            answer=1 
            break 
        elif date1[i]>date2[i]:
            answer=0
            break
    if answer==-1 : 
        answer=0
    return answer



DAY 24.조건문 활용, 반복문 활용, 이차원 리스트(배열)
Q.커피 심부름

def solution(order):
    answer = 0
    for x in order : 
        if x=="iceamericano" or x=="americanoice"or x=="hotamericano" or x=="americanohot" or x=="americano" or x=="anything":
            answer+=4500
        elif x=="icecafelatte" or x=="cafelatteice" or x=="hotcafelatte" or x=="cafelattehot" or x=="cafelatte" :
            answer+=5000
    return answer
    #if 'latte' in want:


Q.그림 확대

def solution(picture, k):
    answer = []
    for x in picture :
        tmp=''
        for i in x :
            tmp+=i*k
        for j in range(k) :
            answer.append(tmp)
    return answer



Q.조건에 맞게 수열 변환하기 3

def solution(arr, k):
    if k%2==0:
        for i,x in enumerate(arr) :
            arr[i]=arr[i]+k
    else :
        for i,x in enumerate(arr) :
            arr[i]=arr[i]*k
    return arr
    #return [i*k if k%2!=0 else i+k for i in arr]


Q.l로 만들기

def solution(myString):
    answer = ''
    #아스키코드 변환 함수
    #ord():문자>숫자, chr():숫자>문자
    for x in myString :
        if ord(x)<ord('l'):
        #if i < "l":
            answer+='l'
        else :
            answer +=x
    return answer


Q.특별한 이차원 배열 1

def solution(n):
    answer=[]
    for i in range (n) : 
        tmp=[]
        for j in range(n) :
            if i==j :
                tmp.append(1)
            else :
                tmp.append(0)
        answer.append(tmp)
    return answer
    '''
    answer=[[0]*n for i in range(n)]
    for i in range(n): answer[i][i]=1
    '''



DAY 25.이차원 리스트(배열)
Q.정수를 나선형으로 배치하기 

#**
def solution(n):
    answer=[[0]*n for _ in range(n)]
    #시계방향 : 우,하,좌,상
    dx=[0,1,0,-1]
    dy=[1,0,-1,0]
    
    x,y=0,0
    answer[x][y]=1
    k=2
    while k<=n*n :
        for i in range(4):
            while True :
                nx=x+dx[i]
                ny=y+dy[i]
                if nx>=n or ny>=n or nx<0 or ny<0 or answer[nx][ny]!=0:
                    break
                answer[nx][ny]=k
                x=nx
                y=ny
                k+=1
    return answer


Q.특별한 이차원 배열 2

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



Q.정사각형으로 만들기

def solution(arr):
    #x=len(arr) #행의 수
    #y=len(arr[0]) #열의 수
    if len(arr) > len(arr[0]) : #행의 수가 더 많을 경우
        for i in range(len(arr)) :
            for j in range(len(arr)-(len(arr[i]))) :
                arr[i].append(0)
    elif len(arr) < len(arr[0]) : #열의 수가 더 많을 경우
        for i in range(len(arr[0])-len(arr)):
            arr.append([0]*len(arr[i]))
    return arr


Q.이차원 배열 다각선 순회하기

def solution(board, k):
    answer = 0
    for i in range(len(board)) : 
        for j in range(len(board[0])) :
            if i+j<=k :
                answer +=board[i][j]
    return answer

사용 문법 정리

-입출력
str = input()
a = int(input())
a, b = map(int, input().strip().split(' '))

-
길이 len(str)
min(counts)
max(counts)
sum(counts)

-print
print(a,'+',b,'=',a+b)
print(str1, str2, sep='')
print(a, end='')

-대소문자 변환
x.isupper()
x.islower()
x.lower()
x.upper()

-공백 제거 
strip()

-반복문 for문 
for i in range(len(str)) : 
    if str[i].isupper() : 

for x in str :
    print(x)

for i in range(0,len(names),5):
        answer.append(names[i])

while answer<=n:
        answer+=numbers[i]
        i+=1

for i,q in enumerate(queries) :
        s=q[0]
        e=q[1]

for idx,x in enumerate(arr) : 
        if x>=50 and x%2==0 :
            arr[idx]=x//2


-조건문 if문
if ineq=='<':
    answer=1
elif ineq=='>':
    answer=1
return answer 

if 2 not in arr: #arr에 2가 없다면
    return -1 

if not finished[i] :
    answer.append(todo_list[i])

if 'latte' in want:

-return 
answer = a+b if flag else a-b

- 변환
x=int(str(a)+str(b))
x=str(code[i])

-연산
짝수even    a%2==0 
홀수odd     a%2==1
배수 num%n==0 
공배수 number%n==0 and number%m==0  #number가 n의 배수이면서 m의 배수 

-숫자
나머지 n%i==0
몫(소숫값) n=n/2
몫(정수) n=n//2
거듭제곱 n**2
정수화 int(a) 
정수화 a=a//1 

- 최대/최솟값
minValue = 2147000000
m=float('inf')

-리스트[]
answer=[]
answer=list()
answer.append(1)
answer.pop()
answer.pop(4)
answer.remove(x) #하나만 제거함

-set : 중복되지 않는 집합(set) 
answer=set()
차집합 set(str(num)) - set(['0','5']) 

-짧게
return [i for i in range(start,end+1)]
return [i for i in range(k,n+1,k)]
return [i for i in range(1, n+1) if i % k == 0]
return list(range(start,end-1,-1))
return [work for idx, work in enumerate(todo_list) if not finished[idx]]
return sum(num_list) if len(num_list)>=11 else prod(num_list)
return [word for word in strArr if 'ad' not in word]
return sorted(ch for ch in myString.split('x') if ch)
return sorted(num_list)[:5]
return [i*k if k%2!=0 else i+k for i in arr]

-논리연산
#논리합 OR ∨ , 논리곱 AND ∧ (True 1, False 0)
a=(True if x1==True or x2==True else False)
b=(True if x3==True or x4==True else False)
#return (x1 | x2) & (x3 | x4)
#return (x1 or x2) and (x3 or x4)

-정렬
-sort()/sorted()
sort() : answer.sort(), list.sort(reverse=True)
    리스트 원본값을 직접 수정함
sorted() : ret=sorted(list), ret=sorted(list,reverse=True)
    리스트 원본 값은 그대로이고 정렬 값을 반환함

-함수
count() : counts=[arr.count(i) for i in arr] #각 숫자의 출현 횟수를 저장
copy() : arr2.append(arr.copy()) #arr2.append(arr) 안됨. 
abs() : 절댓값

-find( )/index() <--> rindex(), rfind() : 뒤에서 부터 
find() : x.find("ad")
    #find(찾을 문자열), find(찾을 문자열, 시작 위치), find(찾을 문자열, 시작 위치, 종료 위치) 
    찾는 문자가 없는 경우에 -1을 출력
    문자열만 사용이 가능
index() : num_list.index(x) x를 찾은 가장 첫 번째 인덱스 
    찾는 문자가 없는 경우에 ValueError 에러가 발생
    문자열, 리스트, 튜플 자료형에서 사용 가능하고 딕셔너리 자료형에는 사용 불가 
myString.rfind(pat)

-문자열 관련
endsWith(),startswith():  my_string.endswith('abc')
    endsWith() 는 특정문자열로 어떤 string이 특정문자열로 끝나는지를 검사해서 그 값을 Boolean값으로 반환 
replace() : replace('a', 'A') , my_string.replace(alp,alp.upper()) 
split() : myString.split(), myString.split(''), myString.split('x') 
strip() 
    인자가 없을 경우 공백 제거 
    'abcdefg'.strip('a') : 인자로 전달된 문자를 String의 왼쪽과 오른쪽에서 제거합니다.
    'abcdefg'.lstrip('a') : 인자로 전달된 문자를 String의 왼쪽에서 제거합니다.
    'abcdefg'.rstrip('a') : 인자로 전달된 문자를 String의 오른쪽에서 제거합니다.

-아스키코드 변환
ord() : ord('A') 문자>숫자
chr() : chr(65) 숫자>문자

-슬라이싱
my_string[len(my_string)-n:]
my_string[-n:]
num_list[::n] #n의 간격 

- from math import prod 
prod() : num_list 원소값을 모두 곱한 값을 리턴
return sum(num_list) if len(num_list)>=11 else prod(num_list) 

-2차원 배열
answer=[[0]*n for i in range(n)]
answer=[[0]*n for _ in range(n)]
for s,e in intervals :
for a,b in intervals: answer+=arr[a:b+1]
return [work for idx, work in enumerate(todo_list) if not finished[idx]]
for i,q in enumerate(queries) :

-2차원 배열 방향 
answer=[[0]*n for _ in range(n)]
#ex 시계방향 : 우,하,좌,상
   dx=[0,1,0,-1]
   dy=[1,0,-1,0]

-변수 바꾸기 
a,b = b,a
arr[i],arr[j] = arr[j],arr[i] 

+ Recent posts