본문 바로가기

알고리즘풀이/프로그래머스

[10/22] Lv1.

👉 사용 언어 : PYTHON3

삼총사

✅ Solution

 

from itertools import combinations
def solution(number):
    cnt = 0
    number_combi = list(combinations(number, 3))
    for i in range(len(number_combi)):
        if sum(number_combi[i]) == 0:
            cnt += 1
    return cnt

 

✅ 파이썬에서의 순열(Permutations)과 조합(Combinations)

 

👉 순열(Permutations)

 

from itertools import combinations, permutations

nums = [1,2,3,4]
perm = list(combinations(nums, 2))

 

: [(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)] 출력

 

👉 조합(Combinations)

 

from itertools import combinations, permutations

nums = [1,2,3,4]
combi = list(combinations(nums, 2))

 

: [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)] 출력

 

✅ sum(iterable)

👉 iterable 의 합 출력

✅ sum(iterable, start)

👉 iterable 합과 start 더한값 출력

? iterable : 리스트 / 튜플 / 딕셔너리 - ?

? 주의 iterable 안에 숫자가 아닌 객체가 존재하면 TypeError 발생 ?

숫자 문자열과 영단어

✅ Solution

 

def solution(s):
    info = {'zero':0, 'one':1, 'two':2, 'three':3, 'four':4, 'five':5, 'six':6, 'seven':7, 'eight':8, 'nine':9}
    key_list = list(info.keys())
    for key in key_list:
        s = s.replace(key, str(info[key]))
    return int(s)

 

딕셔너리 key - value 특성 및 replace 함수 사용하여 풀이함.

 

👉 딕셔너리 Key - Value

  • 딕셔너리 생성 : dictionary = { 키:값, 키:값, ... }
  • 키 : boolean / 정수 / 실수 / 자료형 - 모두 가능 ( 수정 가능한 데이터 타입의 키 생성 _ "TypeError" )
  • 키는 중복 불가능

👉 딕셔너리 관련 함수

  • 키-값 개수 확인 : len(딕셔너리명)
  • 해당 딕셔너리의 모든 키-값 보기 : 딕셔너리명.items( ) _ 키-값을 포함하는 튜플 목록을 반환
  • 모든 키 보기 : 딕셔너리명.keys( ) _ dict.keys([]) 반환
  • 모든 값 보기 : 딕셔너리명.values( ) _ dict.values([]) 반환
  • 특정 키로 해당하는 값에 접근하기 : 딕셔너리명[특정 키 ] _ 키가 존재하지 않는다? "KeyError"
  • 특정 키가 딕셔너리에 존재하는지 확인 : 특정 키 in 딕셔너리 _ true/false 반환
  • KeyError 방지하는 또 다른 방법 : 딕셔너리명.get(특정 키) _ 있으면 해당값 / 없으면 None 반환
  • 새로운 키-값 추가하기 : 딕셔너리명[키] = 값
  • 추가하려는 키가 이미 딕셔너리에 존재하는 경우, 새로운 키-값이 추가되지 않고 기존 키에 해당하는 값만 바뀜
  • 특정 키-값 삭제하기 : del 딕셔너리명[특정 키] 또는 딕셔너리명.pop(특정 키) _ pop()은 삭제한 값 반환
  • 딕셔너리의 마지막 키-값 삭제하기 : 딕셔너리명.popitem( )

👉 replace( )

 

str.replace(old_str, new_str[, optional_max])

 

  • 문자열.replace(str1, str2) : 문자열 내 str1을 str2로 대체
  • 문자열.replace(str1, str2, num) : 문자열 내 str1을 num개만 str2로 대체

? 주의 ? str.replace( )을 따로 저장하려면 결과값을 다른 문자열 변수에 저장해야함

( str.replace( ) 해도 str 출력하면 결과가 반영되지 X )

 

 다른 사람 풀이 참고

 

num_dic = {"zero":"0", "one":"1", "two":"2", "three":"3", "four":"4", "five":"5", "six":"6", "seven":"7", "eight":"8", "nine":"9"}

def solution(s):
    answer = s
    for key, value in num_dic.items():
        answer = answer.replace(key, value)
    return int(answer)

K 번째 수

✅ Solution

 

def solution(array, commands):
    answer = []
    for i in commands:
        res_list = sorted(array[i[0]-1:i[1]])
        answer.append(res_list[i[2]-1])
    return answer

 

리스트의 슬라이싱 사용하여 풀이함.

 

👉 리스트 슬라이싱

  • 리스트명[시작index : 끝index] : 끝index-1까지만 포함되므로 주의해야한다.

👉 해당 문제 풀이에서는 리스트의 인덱스 범위를 주의해서 확인해야 한다.

 

✅ 다른 사람 풀이 참고

 

def solution(array, commands):
    return list(map(lambda x:sorted(array[x[0]-1:x[1]])[x[2]-1], commands))

콜라 문제

✅ Solution

 

def solution(a, b, n):
    answer = 0
    while n >= a:
        answer += (n//a)*b
        n = n - a*(n//a) + (n//a)*b
    return answer

 

👉 단순 산수 문제(?)

 

✅ 다른 사람 풀이 참고

 

solution = lambda a, b, n: max(n - b, 0) // (a - b) * b

하샤드 수

✅ Solution

 

def solution(x):
    res = 0
    x_rep = x
    while x >= 10:
        res += x%10
        x = x//10
    res += x
    return x_rep%res == 0

 

👉 이것도 산수..(?)

 

✅ 다른 사람 풀이 참고

 

def Harshad(n):
    return n%sum(int(x) for x in str(n)) == 0

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(Harshad(18))

 

👉 정수를 문자열로 표현해서 하나씩 뽑아서 다시 정수화 한 후, 더하는 방법 사용 (천재다)

3진법 뒤집기

✅ Solution

 

def solution(n):
    th_list = []
    while n > 0:
        n, r = divmod(n, 3)
        th_list.append(r)
    return int(''.join(map(str,th_list)), 3)

 

👉 reverse( ) 및 n진수 사용하여 풀이함.

👉 앗 어차피 뒤집어진 3진법을 구하므로 reverse( ) 사용할 필요없이 순서대로 리스트에 담으면 됨!

 

✅ 리스트명.reverse( )

: 리스트 원소 순서를 거꾸로 뒤집어준다.

  • 리스트 타입에 사용 가능
  • 반환값 없이 자기자신을 변경

✅ reversed( )

: 리스트 원소 순서를 거꾸로 뒤집어준다.

  • reversed object 생성 _ 뒤집은 리스트를 다시 사용하려면 다른 변수에 저장해야한다.
  • 리스트, 튜플, 딕셔너리, 스트링에도 사용 가능

✅ 슬라이싱[::-1]

: 객체 전체를 반대로 뒤집어준다.

 

n진수  → 10진수

: int(string, base)

: base에 진법(n)을 넣어주면 된다.

 

10진수  → 2, 8, 16진수

: int(string, base)

  • 2진수 : bin( )
  • 8진수 : oct( )
  • 16진수 : hex( )

: 0b는 2진수, 0o는 8진수, 0x는 16진수를 의미한다. 앞의 진법 표시를 지울려면 [2:]를 해준다.

 

divmod( )

divmod(a, b)

: a를 b로 나눈 몫과 나머지 모두 반환

 

 map( )

map(int 또는 str, 리스트명)

: 해당 리스트 원소를 int ↔️ str 변환

 

 join( )

''.join(리스트명) 또는 '구분자'.join(리스트명)

: 리스트([]) 문자열("~")로 변환

: 후자의 경우, 문자열로 합쳐질때 각 원소 사이에 구분자가 추가된다.

 

✅ 다른 사람 풀이 참고

 

def solution(n):
    tmp = ''
    while n:
        tmp += str(n % 3)
        n = n // 3

    answer = int(tmp, 3)
    return answer

같은 숫자는 싫어

✅ Solution

 

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

 

👉 반복문과 인덱스 사용해서 풀이함. (생각보다 너무 빨리 풀려서 당황.. 단순하게 생각해야한다)

 

✅ 다른 사람 풀이 참고

 

def no_continuous(s):
    # 함수를 완성하세요
    a = []
    for i in s:
        if a[-1:] == [i]: continue
        a.append(i)
    return a

추억점수

✅ Solution

 

def solution(name, yearning, photo):
    answer = []
    dict = {}
    for i in range(len(name)):
        dict[name[i]] = yearning[i]
    for j in photo:
        y_sum = 0
        for k in j:
            if k in dict:
                y_sum += dict[k]
        answer.append(y_sum)
    return answer

 

👉 딕셔너리 사용해서 풀이함. (위의 딕셔너리 관련 함수 및 설명 참고)

 

✅ 다른 사람 풀이 참고

 

def solution(이름, 점수, 사진):
    return [sum(점수[이름.index(j)] for j in i if j in 이름) for i in 사진]

 

👉 어떻게 한줄...? 더 분발하자 🥲

'알고리즘풀이 > 프로그래머스' 카테고리의 다른 글

[11/16] Lv1.  (0) 2023.11.10
[11/8] Lv1.  (0) 2023.11.04
[10/31] Lv1.  (0) 2023.11.01
[9/30] Lv1.  (0) 2023.09.27
[9/21] Lv1.  (0) 2023.09.15