Algorithm/programmers/level1/210613/10문제 (with python)

yellow·2021년 6월 13일
0

알고리즘 문제

목록 보기
37/58

2021년 6월 13일

프로그래머스에서 푼 level1 10문제 모음집입니다.
문제 풀이에 대한 설명은 코드에 주석으로 표시하였습니다.

📖 문제1 : 다트 게임

⌨ 코드

def solution(dartResult):
    answer = 0
    
    # 'S', 'D', 'T'에 대한 제곱수를 미리 사전 자료형에 담아두었다.
    sdt = {
        'S' : 1,
        'D' : 2,
        'T' : 3
    }
    
    
    tmp = list()
    # iterator
    i = 0
    while i < len(dartResult):
        # 현재 문자가 정수형이라면
        if dartResult[i].isdecimal():
            # 그런데 한 문자는 한 개의 숫자로 이루어져있어서 10을 처리할 수 없기 때문에 따로 처리
            if dartResult[i] == '1' and dartResult[i+1] == '0':
                tmp.append(10)
                i += 1
            else:
                # 한자릿수의 숫자는 바로 리스트tmp에 넣는다.
                tmp.append(int(dartResult[i]))
        # 현재 문자가 알파벳이라면(S,D,T)
        elif dartResult[i].isalpha():
            tmp[-1] **= sdt[dartResult[i]]
        else:
            # 현재 문자가 '*'이라면
            if dartResult[i] == '*':
                if len(tmp) > 1:
                    tmp[-1] *= 2
                    tmp[-2] *= 2
                # 첫 번째 기회에서 스타상이라면
                else:
                    tmp[-1] *= 2
            # 현재 문자가 '#'이라면
            elif dartResult[i] == '#':
                tmp[-1] *= (-1)
        i += 1
    # 현재까지 구한 점수 더하기
    for i in tmp:
        answer += i
    return answer

⌨ 코드 -> 다른 분의 코드

  • 10점을 처리하기 위해 미리 문자열 '10'을 'k'로 대체해놓고 문제를 푼 게 인상적.....
def solution(dartResult):
    point = []
    answer = []
    
    # 10점을 처리하기 위해서 미리 문자열'10'을 'k'로 대체
    dartResult = dartResult.replace('10','k')
    point = ['10' if i == 'k' else i for i in dartResult]
    print(point)

    i = -1
    sdt = ['S', 'D', 'T']
    for j in point:
        if j in sdt :
            answer[i] = answer[i] ** (sdt.index(j)+1)
        elif j == '*':
            answer[i] = answer[i] * 2
            if i != 0 :
                answer[i - 1] = answer[i - 1] * 2
        elif j == '#':
            answer[i] = answer[i] * (-1)
        else:
            answer.append(int(j))
            i += 1
    return sum(answer)

💡 알게된 문법

  • c++에서는 for문의 iterator를 for문 내에서 변경 가능한 것과는 달리, python에서는 불가능하다.
    변경하고 나서 당장은 값이 변해있지만, 다시 for문이 돌아가는 시점에서 iterator가 원래 값으로 되돌아온다.
# 0 1 2 4가 아닌, 
# 결과 : 0 1 2 3 4
for i in range(5):
    print(i, end = ' ')
    if i == 2:
        i += 1

📖 문제2 : 나누어 떨어지는 숫자 배열

⌨ 코드

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

    if not answer:
        answer.append(-1)

    return answer

⌨ 코드2 -> 더 간결한 코드

def solution(arr, divisor):
    answer = []
    arr.sort()
    # 리스트 컴프리헨션 사용
    answer = [x for x in arr if x % divisor == 0]
    return answer if answer else [-1] 

📖 문제3 : 두 정수 사이의 합

⌨ 코드

def solution(a, b):
    answer=0
    a,b=min(a,b),max(a,b)
    for i in range(a,b+1):
        answer+=i
    return answer

⌨ 코드 -> 다른 분의 코드

  • sum() 사용
def solution(a, b):
    answer = 0
    if a>b : a,b = b,a
    return sum(range(a,b+1))

range(n)

  • 범위 자료형
  • return값: <class 'range'> (Immutable sequence type)
  • list()함수를 이용해 범위를 리스트로 변경하면 범위 내부에 어떤 값이 들어있는지 확인할 수 있다.

📖 문제4 : 문자열 내 마음대로 정렬하기

⌨ 코드

def solution(strings, n):
   # 람다 함수를 사용해서, 첫번째 기준: 인덱스 n에 있는 문자, 두번째 기준: 사전에서 앞에 나온 것 순으로
   return sorted(strings, key=lambda x: (x[n], x))
  • 드디어 나도 처음으로 한줄 코드로 풀어봤다!

📖 문제5 : 문자열 내 p와 y의 개수

⌨ 코드

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

    return answer

-> lower()로 모든 알파벳을 소문자를 만든 후에
s.count('p') != s.count('y')를 하는 방법도 있음!


📖 문제6 : 문자열 내림차순으로 배치하기

⌨ 코드

  • 문제를 잘못 읽어서.....오름차순 정렬인데 대문자가 나중에 오는 것인줄 알고 풀었다..... 문제를 잘 읽자^0^
def solution(s):
    answer = ''
    # 대문자를 담는 리스트
    upper = []
    # 소문자를 담는 리스트
    lower = []
    
    # 문자열에는 sort()가 없어서 일부로 list로 만들었지만,
    # sorted()를 사용해서 정렬할 수 있으니 굳이 list로 만들 필요가 없었다.
    s = list(s)
    for i in s:
        if i.isupper():
            upper.append(i)
        else:
            lower.append(i)
            
    upper.sort(reverse=True)
    lower.sort(reverse=True)
    answer = ''.join(lower)+''.join(upper)
    return answer

💡 문자열 정렬

문자열을 정렬할 때 sorted()함수를 사용하면 된다.
대신 sorted()함수는 list를 리턴하기 때문에 다시 문자열로 만들고 싶다면 join()함수와 같이 사용해야한다.
문자열을 정렬할 때 대문자가 먼저오고 소문자가 나중에 온다!


📖 문제 7 : 문자열 다루기 기본

⌨ 코드

def solution(s):

    return True if (len(s) == 4 or len(s) == 6) and s.isdigit() else False

⌨ 코드 -> 다른 분의 코드

  • s의 길이가 4 혹은 6인지 검사하는 코드를 'in 연산자'를 써서 처리하셨다.
def solution(s):
    return if s.isdigit() and len(s) in (4,6)

📖 문제8 : 서울에서 김서방 찾기

⌨ 코드

def solution(seoul):
    return "김서방은 {}에 있다".format(seoul.index("Kim"))

요소의 위치 찾기

1. 문자열 -> find() , rfind()

  • find() : 왼쪽부터 찾아서 처음 등장하는 위치를 찾는다.
  • rfind() : 오른쪽부터 찾아서 처음 등장하는 위치를 찾는다.
  • 찾는 요소가 문자열 내에 없다면 -1을 리턴한다.
print("장발장은 거꾸로 해도 장발장".find("장발장")) # 0
print("장발장은 거꾸로 해도 장발장".rfind("장발장")) # 12

2. 리스트 -> index()

  • index() : 왼쪽부터 찾아서 처음 등장하는 위치를 찾는다.
  • 찾는 요소가 리스트 내에 없다면 ValueError가 발생한다.
a = list("장발장은 거꾸로 해도 장발장")
print(a.index("장")) # 0

📖 문제9 : 소수 찾기

⌨ 코드

def solution(n):
    answer = 0
    # 에라토스테네스의 체를 위한 표
    # index에 해당하는 수가 소수이면 True, 아니면 False
    isPrime = [True] * (n+1)

    for i in range(2, n//2+1):
        # 소수의 배수들은 모두 소수가 아니다.
        if isPrime[i]:
            j = 2
            while i * j <= (n):
                isPrime[i*j] = False
                j += 1
  
    # 소수의 개수 세기
    for i in range(2, n+1):
        if isPrime[i]:
            answer += 1 
    return answer

⌨ 코드 -> 다른 분의 코드

  • 에라토스테네스의 체로 문제를 푸신 건 나와 똑같지만, 2부터 n까지의 수를 담은 집합을 생성한 뒤에 소수의 배수들을 삭제하는 방식이라는 점에서 다르다.
def solution(n):
    # 2 ~ n의 수를 담은 집합 생성 -> 나중에는 소수의 집합이 된다.
    num = set(range(2, n+1))
    
    for i in range(2, n+1):
        # i가 소수라면
        if i in num:
            # n이하의 i의 배수를 num에서 삭제한다.    
            num -= set(range(i*2, n+1, i))
            
    return len(num)

range로 n이하의 i의 배수 리스트 만들기

i, n = 5, 100
a = list(range(i, n+1, i))
print(a) # [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]

📖 문제10 : 수박수박수박수박수박수?

⌨ 코드

def solution(n):
    return "수박"*(n//2) if n % 2 == 0 else "수박"*(n//2) + "수"

⌨ 코드 -> 다른 분의 코드 (더 간결!!!!!!!)

def solution(n):
    return "수박"*(n//2) + "수"*(n%2)

한줄 코드에 욕심이 나서 한줄 코드도 많이 작성해본 하루였다.
이제는 한줄코드보다는 좀 더 친절한 코드로 작성해야지..

profile
할 수 있어! :)

0개의 댓글