TIL No.14: Python - 알고리즘 10문제.

BLAKE KIM·2020년 7월 6일
0

2016년

내 코드

def solution(a, b):
    answer = None
    weeks = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]
    if a == 1:
        b = b + 4
        i = b % 7
        answer = weeks[i]
    elif a == 2:
        i = b % 7
        answer = weeks[i]
    elif a == 3:
        b = b + 1
        i = b % 7
        answer = weeks[i]
    elif a == 4:
        b = b + 4
        i = b % 7
        answer = weeks[i]
    elif a == 5:
        b = b + 6
        i = b % 7
        answer = weeks[i]
    elif a == 6:
        b = b + 2
        i = b % 7
        answer = weeks[i]
    elif a == 7:
        b = b + 4
        i = b % 7
        answer = weeks[i]
    elif a == 8:
        i = b % 7
        answer = weeks[i]
    elif a == 9:
        b = b + 3
        i = b % 7
        answer = weeks[i]
    elif a == 10:
        b = b + 5
        i = b % 7
        answer = weeks[i]
    elif a == 11:
        b = b + 1
        i = b % 7
        answer = weeks[i]
    elif a == 12:
        b = b + 3
        i = b % 7
        answer = weeks[i]
    
    return answer

다른 사람의 풀이

def solution(a,b):
    months = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    days = ['FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED', 'THU']
    return days[(sum(months[:a-1])+b-1)%7]
  • sum(): 괄호 안에 숫자로 이루어진 list를 넣으면 해당 list의 원소들의 합을 구할 수 있다.

가운데 글자 가져오기

내 코드

def solution(s):
	if len(s)%2 == 0:
		i = len(s)//2
		answer = s[i-1]+s[i]
	else:
		i = len(s)//2
		answer = s[i]
	return answer

다른 사람의 풀이

def solution(str):
    return str[(len(str)-1)//2:len(str)//2+1]
  • 내가 짠 코드와 달리 주어진 문자열의 길이가 짝수이든 홀수이든 상관없이 주어진 조건을 만족하고 문제를 풀 수 있다. 슬라이싱 개념에 대한 이해가 필요하다.

같은 숫자는 싫어

내 코드

def solution(arr):
	k = []
    for i in range(len(arr)):
    	if i > 0:
        	if arr[i-1] != arr[i]:
                k.append(arr[i])
            elif arr[i-1] == arr[i]:
                continue
        else:
            k.append(arr[i])
    return k

다른 사람의 풀이

def solution(s):
    a = []
    for i in s:
        if a[-1:] == [i]: continue
        a.append(i)
    return a
  • a[-1:]은 첫 for문이 돌아갈 때 빈 배열일 경우도 문제 없이 작동한다. 슬라이싱을 알면 많은 것이 편해진다. 또한 연속되는 수만 제거하면 되기 때문에 마지막에 append된 수랑만 비교하면 된다. list의 index에 -1을 넣으면 가장 마지막에 append된 수를 반환한다.

나누어 떨어지는 숫자 배열

내 코드

def solution(arr, divisor):
    newArr = []
    for i in arr:
        if i % divisor == 0:
            newArr.append(i)
    if newArr == []:
        newArr.append(-1)
    newArr.sort()
    answer = newArr
    return answer

다른 사람의 풀이

def solution(arr, divisor): return sorted([n for n in arr if n%divisor == 0]) or [-1]
  • sorted는 정렬된 값을 반환해주고 .sort()는 값을 반환해주지 않기 때문에 None이 된다. 즉 두 가지 모두 정렬은 하지만 값의 반환여부에 대한 차이가 존재한다.

두 정수 사이의 합

내 코드

def solution(a, b):
    if a == b:
        answer = a
    elif a < b:
        i = b-a
        sum = 0
        for j in range(i+1):
            set = a + j
            sum = sum + set
        answer = sum
    elif a > b:
        i = a-b
        sum = 0
        for j in range(i+1):
            set = b + j
            sum = sum + set
        answer = sum
    return answer

다른 사람의 풀이

def solution(a, b):
    return sum(range(min(a,b),max(a,b)+1))
  • min()은 두 값 중 작은 값, max()는 두 값 중 큰 값을 반환한다. 안에 여러 수가 들어간다면 각각 최솟값과 최댓값을 반환한다.

문자열 내 마음대로 정렬하기

내 코드

def solution(strings, n):
    sortList = []
    for i in range(len(strings)):
        sortList.append((strings[i][n], strings[i]))
    sortList.sort()
    ansList = []
    for i in range(len(strings)):
        ansList.append(sortList[i][1])
    answer = ansList
    return answer

다른 사람의 풀이

def solution(strings, n):
    return sorted(strings, key=lambda x: x[n])
  • 람다 표현식은 'lambda 인자: 표현식'의 형식으로 쓰이고 표현식에 해당하는 값을 반환한다고 생각하면 편하다. 여기서는 sorted의 key로 strings의 인덱스 n에 해당하는 값을 준다.
  • sorted()는 정렬할 때 key를 따로 설정 가능하다는 점을 기억하자.

문자열 내 p와 y의 개수

내 코드

def solution(s):
    answer = True
    pCount = 0
    yCount = 0
    n = s.lower()
    for i in n:
        if i == "p":
            pCount += 1
        elif i == "y":
            yCount += 1
            
    if pCount == yCount:
        answer = True
    elif pCount != yCount:
        answer = False
    elif pCount == 0 and yCount == 0:
        answer = True
        
    return answer

다른 사람의 풀이

def solution(s):
    return s.lower().count('p') == s.lower().count('y')
  • count()는 주어진 문자열에 대한 부분 문자열의 수를 반환하는 메소드이다.

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

내 코드

def solution(s):
    str = []
    k = ""
    for i in s:
        str.append(i)
    str.sort()
    str.reverse()
    for i in str:
        k = k + i
    answer = k
    return answer

다른 사람의 풀이

def solution(s):
    return ''.join(sorted(s, reverse=True))
  • join()은 .앞에 주어진 문자열과 괄호 안의 것을 하나씩 꺼내서 합쳐준다. 즉 .앞에 공백이 아닌 다른 문자가 있는 경우 s에 담긴 것 하나마다 붙게 된다. 즉 괄호 안에 list가 있다고 생각하면 이해하기 편하다.
  • list()는 괄호 안에 문자열을 넣으면 문자 각각 하나를 원소로 하는 list를 반환한다. (다른 풀이에서 본 것 정리)

문자열 다루기 기본

내 코드

def solution(s):
    answer = True
    if len(s) == 4 or len(s) == 6:
        try:
            k = int(s)
            answer = True
        except:
            answer = False
            
    else:
        answer = False
        
    return answer

다른 사람의 풀이

def solution(s):
    return s.isdigit() and len(s) in (4, 6)
  • isdigit()은 문자열이 숫자인지 판단해주는 것으로 이와 반대로 isalpha()는 문자열이 문자인지 아닌지를 판단해준다.
  • in 연산자는 논리 연산자로 사용 가능하다.

서울에서 김서방 찾기

내 코드

def solution(seoul):
    i = 0
    if len(seoul) >= 1 and len(seoul) <= 1000:
            for i in range(len(seoul)):
                if seoul[i] == "Kim":
                    break
    i = str(i)
    answer = "김서방은 "+ i + "에 있다"
    return answer

다른 사람의 풀이

def solution(seoul):
    return "김서방은 {}에 있다".format(seoul.index('Kim'))
  • format()은 포맷팅과 유사한 방식으로 {}안에 format()의 괄호 안의 값을 넣어서 출력하는 방식이다. {}를 여러 개 사용하고 괄호 안에 같은 수의 값을 주면 차례로 {}에 들어가 출력한다. {}안에 index를 집어 넣어 순서를 지정할 수도 있다.
  • index()는 해당 원소의 위치를 반환한다. 즉 index값을 반환한다.
profile
BackEnd

0개의 댓글