[코딩테스트 연습] 프로그래머스 lv0 100제

Nam_JU·2023년 6월 9일
0

Algorithm

목록 보기
8/20
post-thumbnail

2023.06.09

DAY 4,5


피자나눠먹기 1

def solution(n):
    answer = 0
    if n%7 == 0:
        answer = n/7
    else:
        answer = n//7 +1
    return answer    

피자나눠먹기 2

  • 케이스 3개에서 에러
  • 수정코드
def solution(n):
    pizza=1
    while (6*pizza)%n!=0:
        pizza+=1
        
    return pizza

회고

문제의 의도를 파악하여 풀지않고 예제만 보면서 코드를 짰다
해당 문제는 최소공배수를 구하는 거였는데 while문을 떠올렸음에도 냅다 코드부터 치고보는게 문제였다


피자나눠먹기 3

  • 내코드
def solution(slice, n):
    if n%slice==0:
        return n//slice
    else:
        return n//slice+1
  • 리펙토링
def solution(slice, n):
    d, m = divmod(n, slice)
    return d + int(m != 0)

divmod() 몫과 나머지를 동시에 구하고 싶을 때 사용한다
두 개의 숫자를 인자로 받아, 첫번 째 숫자를 두번 째 숫자로 나눈 몫과 나머지를 튜플(tuple) 형태로 반환


옷가게 할인받기

  • 수정코드
def solution(price):
    answer = 0
    if price >=500000:
        answer = price - price*0.2
    elif price >=300000:
        answer = price - price*0.1
    elif price >= 100000:
        answer = price - price*0.05
    else:
        answer = price
        
    return int(answer)

테스트코드에서 에러가 났는데 이걸 유추하는 연습도 필요할것 같다
어디가 문제지 고민하다보니 소숫점, 할인 적용을 받지 않는 else부분을 생각하지 않아서 통과하지 못했다


아이스아메리카노

  • 내코드
def solution(money):
    answer = []
    cup = money//5500
    answer.append(cup)
    answer.append(money-cup*5500)
    return answer
  • 리펙토링
def solution(money):
    return [money//5500, money%5500]

난 바보가 분명함
애초에 일의자리까지 값이 주어지지 않으니 바로 %로 해결하면됨...



2023.06.12

DAY 6,7



짝수 홀수 개수

  • 내코드
def solution(num_list):
    answer = []
    odd, even=0,0
    for x in num_list:
        if x%2==0:
            even+=1
        else:
            odd+=1
    answer.append(even)
    answer.append(odd)
    return answer
  • 리펙토링
def solution(num_list):
    answer=[0,0]
    for x in num_list:
        answer[x%2]+=1
    return answer

2로 나눴을 때 나머지값이 0,1 둘 중 하나로 나오기때문에, answer 배열의 0,1 위치에 맞춰 누적합을 넣으면 코드가 더 간단해진다


문자 반복 출력하기

  • 내코드
def solution(my_string, n):
    answer=""
    for x in my_string:
        answer+=x*n
    return answer
  • 리펙토링
def solution(my_string, n):
    return ''.join( x*n for x in my_string)

파이썬 컴프리헨션을 사용한 리펙토링 코드
파이썬 코테를 공부하다보면 생소한 for 문들이 보이는데 자주 사용하도록 노력하자


특정 문자 제거하기

  • 내코드
def solution(my_string, letter):
    answer = ''
    for x in my_string:
        if x!= letter:
            answer+=x
    return answer
  • 리펙토링
def solution(my_string, letter):
    return my_string.replace(letter, '')

.replace()를 사용해 문자열을 ''로 바꿔 코드를 더 줄일 수 있다


각도기

  • 내코드
def solution(angle):
    answer = 0
    if angle<90:
        answer=1
    elif angle==90:
        answer=2
    elif angle<180:
        answer=3
    else:
        answer=4
    return answer

양꼬치

  • 내코드
def solution(n, k):
    sheep = n*12000
    drink = (k-(n//10))*2000
    return sheep+drink
  • 리펙토링
def solution(n, k):
    return 12000*n + 2000*(k-n//10)

나 되게 비효율적으로 짜는구나 새삼 깨달음
연산자 우선순위 생각해서 괄호 줄이기, 불필요한 변수 사용 줄이기


짝수의 합

  • 내코드
def solution(n):
    answer = 0
    for i in range(2,n+1):
        if i%2==0:
            answer+=i
    return answer
  • 리펙토링
def solution(n):
    return sum( x for x in range(2, n+1, 2))
  • 파이썬 컴프리헨션 사용
  • 2~n 범위에서 2씩 증가하는 값을 sum으로 합한다


2023.06.13

DAY8
새벽에 끝냄


뒤집은 소수

  • 내코드
def solution(age):
    answer = ''
    age_list = []

    # 알파벳 문자 배열 생성
    for i in range(97, 123):
        age_list.append(chr(i))
    # 문자열 자르기
    for x in str(age):
        answer += age_list[int(x)]
    return answer

아스키코드로 생성하는건 쉽게 했는데 age를 자르는 부분에서 의외로 걸렸다. enumerate 써야하나 10으로 나누고 몫구해서 돌려야 하나 비효율적으로 생각했음

  • 리펙토링
def solution(age):
    # age = "2" "3"
    # i = 0, 1
    return ''.join([chr(int(i) + 97) for i in str(age)])

진로순서 정하기

  • 내코드
def solution(emergency):
    answer = []
    danger = sorted(emergency, reverse=True) # [76, 24, 3]

    for i in emergency:
        answer.append(danger.index(i)+1)

    return answer

필요한 아이디어는 다 생각을 하는데 코드정리가 안되어 있어서인지 비효율적으로 왔다갔다 하는 느낌 ;ㅅ;



2023.06.14 DAY9

  • 문제 난이도가 점점 어려워지는듯
  • 리펙토링하면서 복습하니까 시간이 제법 걸림

개미군단

  • 내코드
def solution(hp):
    answer = 0
    while hp > 0:
        if hp%5 !=0:
            answer += hp//5
            hp = hp%5
            if hp%3 !=0:
                answer += hp//3
                hp = hp%3
            else:
                answer += hp//3
                hp = 0
        else:
            answer += hp//5
            hp = 0
        answer +=hp
        hp=0
    return answer
print(solution(hp))

난 바본가..?
if 문으로 전부 해결해야한다는 강박이 있는듯. 사고를 확장하자...

  • 리펙토링
def solution(hp):
    answer = 0
    ant = [5,3,1]
    
    for x in ant:
        if hp==0:
            break
        answer += hp//x
        hp = hp%x

    return answer

배열로 전체 돌리면서 answer에 몫 저장, 나머지를 hp와 치환하여 hp==0일 경우 멈추기.


모스부호

  • 정답코드
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'
}
    q = letter.split(' ')
    for x in q:
        answer+=morse[x]
        
    return answer

morse={} 이런 형태를 처음봐서 어떤식으로 접근해야할지 어려웠다. 파이썬의 {} 형식은 dict, dctionary 형태인 key, value 튜플 형식이다

morse를 전체 돌리고 split으로 나눈 q를 비교해 같으면 answer에 넣는 방식을 생각했는데 비효율적이었다. 단순하게 생각하자.

  • 리펙토링
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'
}       
    return ''.join(morse[x] for x in letter.split(' '))

가위바위보

  • 내코드
def solution(rsp):
    answer = ''
    for x in rsp:
        if x =='2':
            answer+='0'
        elif x == '0':
            answer +='5'
        elif x == '5':
            answer +='2'
    return answer
  • 리펙토링
def solution(rsp):
    compare = {'0':'5', '2':'0', '5':'2' }
    return ''.join(compare[i] for i in rsp)

모스부호 문제에서 봤던 튜플을 사용해서 문제를 풀수 있다


구슬을 나누는 경우의 수

from math import factorial as fac
def solution(balls, share):
    answer = 0
    n = fac(balls)
    m = fac(share)
    b = fac(balls - share)*m
        
    return n/b

파이썬 factorial을 import하여 사용하기



23.06.19

Day10

다시풀이

  • 2차원으로 만들기
  • 공던지기

배열 회전시키기

  • 내코드
def solution(numbers, direction):
    answer = []
    if direction == "right":
        answer.append(numbers.pop())
        for x in numbers:
            answer.append(x)
    else:
        a = numbers.pop(0)
        for x in numbers:
            answer.append(x)
        answer.append(a)
    return answer

rotate가 생각 안나서 비효율적으로 풀었다...

  • 다른코드1
def solution(numbers, direction):
    if direction == "right":
        answer = [numbers[-1]] + numbers[:len(numbers)-1]
    else:
        answer = numbers[1:] + [numbers[0]]
    return answer

내 코드를 개선한다면 위의 코드와 같을듯. 불필요한 append보다는 슬라이싱을 사용

  • 다른코드2
from collections import deque
def solution(numbers, direction):
    numbers = deque(numbers)
    if direction == "right":
        numbers.rotate(1)
    else:
        numbers.rotate(-1)
    return list(numbers)

deque의 rotate를 사용한 방식.
deque를 떠올렸지만 어떻게 써야할지를 몰라서 못사용함.
사용법 숙지하기



2023.06.23

DAY 11,12


펙토리얼

  • 테스트코드 에러 66점..
  • 파이썬 팩토리얼을 사용하면 쉽다
from math import factorial
def solution(n):
    k=10
    while n<factorial(k):
        k-=1
    return k

파이썬 팩토리얼
from math import factorial


문자열 정렬

  • 내코드
def solution(my_string):
    answer = []
    for x in my_string:
        if x.isdigit():
            answer.append(int(x))
    answer.sort()
    return answer
  • 리펙토링
def solution(my_string):
    return sorted(int(x) for x in my_string if x.isdigit())

숨어있는 숫자

  • 내코드
def solution(my_string):
    answer = 0
    for x in my_string:
        if x.isdigit():
            answer+=int(x)
    return answer
  • 리펙토링
def solution(my_string):
    return sum(int(x) for x in my_string if x.isdigit())

sum()을 사용할때 밖으로 빼서 한번에 묶기


소인수분해

  • 테케오류
  • 코드수정
def solution(n):
    answer = []
    d = 2
    while d<=n:
        if n%d==0:
            if d not in answer:
                answer.append(d)
            n=n//d
        else:
            d+=1

    return answer

set() -> list()로 중복을 없앴는데 이부분이 문제인것 같아서 기존코드에 not in을 사용해서 조건문을 수정함
시간복잡도...?문제인가?



2023.06.24

DAY13


컨트롤 제트

  • 내코드
def solution(s):
    answer =0
    num = list(s.split(" "))
    for i in range(len(num)):
        if num[i]!="Z":
            answer+=int(num[i])
        else:
            answer-=int(num[i-1])
    return answer

리스트에 공백을 제거해서 문자열을 넣고 합을 구했다
스택을 사용하는 방식으로 리펙토링 해봄

  • 리펙토링
def solution(s):
    answer = []
    for x in s.split():
        if x != 'Z':
            answer.append(int(x))
        else:
            answer.pop()
    return sum(answer)

파이썬에서 문자열.split()을 사용할때 괄호안의 파라미터에 아무런 값이 없을 경우 띄어쓰기, 엔터를 구분하여 문자열을 나눈다

중복된 문자 제거

  • 내코드
def solution(my_string):
    answer = []
    arr = list(my_string)

    for x in arr:
        if x not in answer:
            answer.append(x)
    return "".join(answer)

문제 자체는 쉬웠는데 처음엔 왜 이중 for문으로 전체 탐색을 하려고 했는지 모르겠음 ㅎㅎ not in이 생각나서 위 문제 처럼 list를 사용했으나 문자열 자체만으로 구할 수 있는 간단한 문제였다

  • 리펙토링
def solution(my_string):
    answer = ''
    for x in my_string:
        if x not in answer:
            answer+=x
    return answer


2023.06.25

DAY14,15


3,6,9게임

  • 내코드
def solution(order):
    answer = 0
    game = [3,6,9]
    
    while order>0:
        t = order%10
        if t in game:
            answer+=1
        order = order//10    
    return answer

이어진 숫자를 한자리 수로 나누는 방식이 떠오르지 않아서 10나누기를 사용함.

  • 다른코드
def solution(order):
    answer = 0
    order = str(order)
    return order.count('3') + order.count('6') + order.count('9')

이어진 숫자를 문자열로 변환하기
동일한 문자열이 있는지 문자열.count()를 활용해서 사용


암호해독

  • 나의코드
def solution(cipher, code):
    answer = ''
    for x in range(code-1, len(cipher), code):
        answer+=cipher[x]
    return answer

증가폭을 range만 떠올림; 슬라이싱 잘 활용하도록 하자

  • 다른코드
def solution(cipher, code):
    answer = cipher[code-1::code]
    return answer

파이썬 슬라이싱

 a[7::2] # 인덱스 7부터 2씩 증가시키면서 리스트의 마지막 요소까지 가져옴


영어가 싫어요

  • 다른코드
def solution(numbers):
    nums=["zero","one","two","three","four","five","six","seven","eight","nine"]

    for idx, x in enumerate(nums):
        numbers = numbers.replace(x, str(idx))

    return int(numbers)

리스트까지는 만들었는데 이 문자열을 어떻게 대응해서 바꾸지 고민하다가 검색해봄

enumerate로 리스트를 받아와 대응되는 x값을 numbers에서 찾아 해당 인덱스를 문자열로 변환함


한 번만 등장한 문자

  1. 딕셔너리 사용이 약해서 해당 방식을 사용
  2. for ch in s.split()를 사용하려고 했으나 주어진 값이 "abcabcabc"임으로 split()을 나눠도 문자열 통짜로 됨!
    그래서 list(s)사용 (문자열 자체인 s를 사용해도 됨)
  3. 빈 key값을 사용하여 해당 문자(ch)가 있는지 확인 후 카운트
    => 중복 문자를 정렬할 수 있음

  4. key, value값을 가져오기 위해 딕셔너리.items()사용
    [0] = keys, [1] = values
    value에서 1인 값들인 key값만 가져와 오름차순으로 정렬해 문자열로 반환
  • 내코드
def solution(s):
    word = dict()

    for ch in list(s):
        if ch not in word.keys():
            word[ch] = 0
        word[ch] += 1
        
    return ''.join(sorted([ch[0] for ch in word.items() if ch[1]==1]))
  • 다른코드
def solution(s):
    answer = ''
    for x in s:
        if s.count(x)==1:
            answer+=x
            
    return ''.join(sorted(answer))
  1. 문자열을 탐색하여 문자가 하나밖에 없는것을 answer에 저장 문자열.count()
  2. 문자가 하나씩 밖에 없는 answer를 오름차순 정렬하여 문자열로 반환


2023.06.26

DAY 16,17


가장 큰 수 찾기

  • 내코드
def solution(array):
    answer = []
    max_num = sorted(array, reverse=True)
    idx = array.index(max_num[0])
    return [max_num[0],idx]
  • 다른코드
def solution(array):
    return [max(array), array.index(max(array))]

따로 변수에 내림차순 정렬후 최대값에 대응하는 인덱스를 찾았는데 다른 코드를 보니 max(array)만으로 최대값을 한번에 찾을 수 있었다


문자열 계산하기

  • 코드1
def solution(my_string):
    
    s = my_string.split(' ')
    answer = int(s[0])
    
    for x in range(1, len(s), 2):
        if s[x]=='+':
            answer+=int(s[x+1])
        else:
            answer-=int(s[x+1])
    return answer

split으로 정리하고 범위를 지정하는것 까지는 좋았는데 2번씩 띄어서 계산한다는걸 생각 못하고 막혀버림,,, 반성하자ㅏㅏ

  • 코드2
def solution(my_string):
    return eval(my_string)

파이썬 내장함수 eval(문자열)
문자로 표현된 표현식을 계산해준다. 코테 풀때는 요긴하겠지만
서버입장에서는 해당 명령어로 인해 해킹, 공격을 받을 수 있는 허점이 될 수 있다


숫자찾기

  • 내코드
def solution(num, k):
    answer = -1
    num = str(num)
    for x in num:
        if x == str(k):
            return num.index(x)+1
    return answer
  • 다른코드
def solution(num, k):
    answer = -1
    for idx, x in enumerate(str(num)):
        if x == str(k):
            return idx+1
    return answer

enumerate를 사용하는 방식


n의 배수 고르기

  • 내코드
def solution(n, numlist):
    answer = []
    for x in numlist:
        if x%n==0:
            answer.append(x)
    return answer
  • 리펙토링
def solution(n, numlist):
    return [x for x in numlist if x%n==0]

자릿수 더하기

  • 내코드
def solution(n):
    # answer = 0
    # n = str(n)
    # for x in n:
    #     answer += int(x)
    return sum(int(x) for x in str(n))

O,X 퀴즈

  • 내코드
def solution(quiz):
    answer = []
    
    for x in quiz:
        s= x.split()
        if s[1] == '+':
            if(int(s[0])+int(s[2])) == int(s[len(s)-1]):
                answer.append("O")
            else:
                answer.append("X")
        else:
            if(int(s[0])-int(s[2])) == int(s[len(s)-1]):
                answer.append("O")
            else:
                answer.append("X")
    return answer


2023.06.27

DAY18, 19



2023.06.29

DAY20


직사각형 넓이 구하기

🍎 파이썬 2차원 좌표 정렬, 탐색

   # key[0], value[1] 탐색
   x = [dt[0] for dt in dots]
   y = [dt[1] for dt in dots]
   
   # 오름차순 정렬 lambda식
    dots = sorted(key = lambda dt:dt[1])
  • 다른코드1
def solution(dots):
    answer = 0
    x = [dt[0] for dt in dots]
    y = [dt[1] for dt in dots]

    w = max(x) - min(x)
    h = max(y) - min(y)
    area = w*h

    return area

2차원 배열 탐색, enumerate, 딕셔너리 같은 구현 부분이 아직 부족함
for문을 통해 key, value 값만 탐색 가능
최대값은 비교없이 바로 배열에서 찾을 수 있다


캐릭터의 좌표

테케에서 막혔을때 반례를 찾는 공부가 필요할것 같다
다른 사람들의 코드를 봐도 어떤 점에서 다르고 뭘 염두했는지 감이 안잡혔다
위의 코드는 끝까지 이동 한 뒤 반대로 이동하면 좌표가 달라지는 부분을 염두하지 않았다. and조건에서 한값이 막히면 바로 contiue로 넘어가버린다
["left", "left", "left", "right", "right", "right", "right"], [5, 5] 테케를 줬을때 [2,0] 이아닌 [-3,0]이 나옴

  • 내코드
def solution(keyinput, board):
    x=y=0
    xarea = board[0]//2
    yarea = board[1]//2
    for key in keyinput:
        if key =="up":
            if y>=yarea:
                y=yarea
            else:
                y+=1
        elif key == "down":
            if y<=-yarea:
                y=-yarea
            else:
                y-=1
        elif key == "left":
            if x<=-xarea:
                x=-xarea
            else:
                x-=1
        elif key == "right":
            if x>=xarea:
                x=xarea
            else:
                x+=1

    return [x,y]
  • 다른코드
def solution(keyinput, board):
    x_lim,y_lim = board[0]//2,board[1]//2
    move = {'left':(-1,0),'right':(1,0),'up':(0,1),'down':(0,-1)}
    x,y = 0,0
    for k in keyinput:
        dx,dy = move[k]
        if abs(x+dx)>x_lim or abs(y+dy)>y_lim:
            continue
        else:
            x,y = x+dx,y+dy

    return [x,y]

다항식 더하기

테케 에러ㅎㅎ 문자열 조합... 공부하자

  • 다른코드
def solution(polynomial):
    xnum = 0
    const = 0
    for c in polynomial.split(' + '):
        if c.isdigit():
            const+=int(c)
        else:
            xnum = xnum+1 if c=='x' else xnum+int(c[:-1])
    if xnum == 0:
        return str(const)
    elif xnum==1:
        return 'x + '+str(const) if const!=0 else 'x'
    else:
        return f'{xnum}x + {const}' if const!=0 else f'{xnum}x'


23.07.01

  • 안전지대 다시풀이

숨어있는 숫자의 덧셈(2)

  • 내코드
def solution(my_string):
    answer = 0
    for x in my_string:
        if x.isalpha():
            my_string = my_string.replace(x,' ')
    for i in my_string.split():
        answer+=int(i)
    return answer

digit를 기준으로 나눴을때 변수 하나를 더 둬서 앞으로 체크를 하는 방식을 하려고했으나... 코드구현이 점점 복잡해졌다. 반대로 알파벳 기준으로 분별해 공백으로 바꾸고 공백 기준으로 숫자로 변환함

  • 다른코드
def solution(my_string):
    intch = "0"
    answer = 0
    for ch in my_string:
        if ch.isdigit():
            intch += ch
        else:
            answer += int(intch)
            intch = "0"
    answer += int(intch)
    return answer

digit 기준으로 나눈 코드
연속된 숫자를 어떻게 판별하나갸 관건이었는데 else에서 바로 answer를 숫자화 시켜 바꿈, intch변수를 사용해서 초기화 or 문자열 합침을 두가지 활용한거 보고 감탄함


삼각형의 완성조건(2)

  • 내코드
def solution(sides):
    answer = 0
    sides.sort()
    a,b = sides
    c=0

    # b가 가장 클 경우 a+c<b, [3+c]<6
    # c=[0<1,2,3<a+b(6)]
    for c in range(b-a+1, b+1):
        answer+=1

    # c가 가장 클 경우 a+b>c, [3+6]>c
    for c in range(b+1,a+b):
        answer+=1

    return answer

외계어사전

  • 내코드 89점 - 테케에러
  • 코드 수정
def solution2(spell, dic):
    answer=0
    for word in dic:
        ch = 0
        for x in spell:
            if x in word:
                ch+=1
        if ch == len(spell):
            return 1
    return 2

길이 체크를 spell로 해줬어야함



2023.07.03

  • 겹치는 선분의 길이 다시풀이

유한소수 판별하기

  • 내코드 - 테케오류 91점

    소인수분해 코드를 추가함
  • 코드 수정
def solution(a, b):
    # 기약분수인지 판별 // 기약분수로 만들기
    for i in range(2, a + 1):
        if a % i == 0 and b % i == 0:
            a = a // i
            b = b // i
    # 소인수 분해
    num = []  # 소인수 저장
    i = 2
    while i <= b:  # 소인수 구하기
        if b % i == 0:
            b //= i #나눈값의 몫을 대입
            num.append(i)
        else:
            i += 1

    if all(i in [2, 5] for i in num):
        # 소인수가 2와 5만 존재하면 유한소수 그렇징 않으면 무한소수
        return 1
    return 2

print(solution(13,14))



2023.07.04

DAY23

특이한 정렬

def solution(numlist, n):
    answer = sorted(numlist, key=lambda x: (abs(x-n), -x))
    return answer

기준을 삼아서 정렬하는 문제는 lambda 사용하기
매개변수 x가 numlist값들을 순회하면서 절대값(abs)를 사용하여 기준값 n에서 가장 작은 값을 내림차순(-x)으로 정렬한다



2023.07.07

갑작스런 이석증으로 쉬어감 ;ㅅ;
마지막 부분부터 난이도가 헬이라 속도를 줄였다


로그인 성공?

  • 내코드
def solution(id_pw, db):
    for [x, y] in db:
        if x == id_pw[0]:
            if y == id_pw[1]:
                return "login"
            else:
                return "wrong pw"
    return "fail"

이차원 배열 탐색이 아직 어색함.
key, value값을 자유자재로 다룰 수 있도록 연습필요


옹알이(1)

  • 다른코드
from itertools import permutations
def solution(babbling):
    answer=0
    baby = ["aya","ye","woo","ma"]
    temp=[]
    
    # 모든 경우의 수
    for i in range(1, len(baby)+1):
        for j in permutations(baby, i):
            temp.append(''.join(j))
    # cnt
    for k in babbling:
        if k in temp:
            answer+=1
    return answer

항상 순열, 조합 관련된 문제는 제대로 풀지 못했는데 from itertools import permutations를 활용하여 전체 경우의 수를 만들고 같은 경우를 세는 코드를 공부함

🍎 파이썬 순열과 조합

순열 Promutations

  • 서로다른 n개에서 r개를 선택할때 순서를 고려하여, 중복없이 뽑을 경우의 수
    nPr = n!/(n-r)!
  • A,B,C 에서 순서에 상관있고, 중복없이 뽑을 경우의 수
from itertools import permutations
arr = ['a','b','c']
for x in permutations(arr,2):
    print(x)
    """
    ('a', 'b')
    ('a', 'c')
    ('b', 'a')
    ('b', 'c')
    ('c', 'a')
    ('c', 'b')
    """

조합 Combinations

  • 서로다른 n개에서 r를 선택할 때 순서를 고려하지 않고, 중복없이 뽑는 경우의 수
    nCr = n!/r!(n-r)!
from itertools import combinations
arr = ['a','b','c']
for y in combinations(arr,2):
    print(y)
    """
    ('a', 'b')
    ('a', 'c')
    ('b', 'c')
    """

A에서 B만들기

  • 내코드
def solution(before, after):
    cnt=0
    answer=0
    for x in before:
        if before.count(x)==after.count(x):
            cnt+=1
        if cnt == len(before):
            answer=1
    return answer

[-1::]로 풀었다가 지문을 재대로 못읽어서 테케 에러남
딕셔너리를 활용헤서 같은 값을 모으려다가 count()를 활용


k의 개수

  • 내코드
def solution(i, j, k):
    answer = 0

    for c in range(i, j+1):
        for find in str(c):
            if str(k)==find:
                answer+=1
    return answer

겁나 비효율적으로 풀었다

  • 다른코드
def solution(i, j, k):
    return sum(str(x).count(str(k)) for x in range(i, j+1))

위에서 count풀어 놓고 활용을 못하네,,,


이진수 더하기

  • 내코드
def solution(bin1, bin2):
    answer = ''
    ad = int(bin1,2) + int(bin2,2)
    answer = bin(ad)
    return answer[2:]
  • 리펙토링
def solution(bin1, bin2):
    return bin(int(bin1,2)+int(bin2,2))[2:]

🍎 파이썬 이진수, 십진수 변환

십진수를 이준수로 변환

b = bin(16)
print(b)
# 0b10000

이진수를 십진수로 변환

a = int('0b10000', 2)
print(a)
# 16


2023.07.08

  • 치킨쿠폰 다시 풀기

문자열 밀기

  • 내코드
from collections import deque
def solution(A, B):
    qA=deque(A)
    qB=deque(B)

    for i in range(len(A)):        
        if qA==qB:
            return i
        qA.rotate(1)
    return -1

원래 append(pop())를 사용하려고 했는데 어떤 이유에서인지 에러가 자꾸나 rotate를 사용했다

  • 다른코드 - insert, pop사용
def solution(A,B):
    A, B = list(A), list(B)
    for cnt in range(len(A)):
        if A == B:
            return cnt
        A.insert(0,A.pop())
    return -1


2023.07.09

profile
개발기록

0개의 댓글