TIL - Algoithms

Seob·2020년 7월 6일
1

Algorithms

목록 보기
1/8
post-thumbnail

사전 스터디 마지막 주차인 4주 차가 시작되었다.

우리 팀은 이번 주차에 개인 공부 + 알고리즘을 진행하기로 하였다.

호기롭게 하루에 알고리즘 10개씩 하기로 했다.

연습문제라고 쓰여 있는 "쉬운" 거만 10개 골라서 금방 할 줄 알았는데 예상외로 시간이 꽤 걸렸다.😅

프로그래머스에 있는 코딩테스트 연습에 올라온 문제들을 풀었다.

2016년

내가 작성한 답

def solution(a, b):
    answer = ''
    days = ['FRI','SAT','SUN','MON','TUE','WED','THU']
    months = [31,29,31,30,31,30,31,31,30,31,30,31]
    answer = days[(sum(months[:a-1])+b)%7-1]
    return answer

처음에 이 문제를 보자마자 든 생각은 '이게 연습문제라고?' , '연습을 이렇게 한다고???' 였다..ㅋㅋㅋ
처음에는 '어떻게 해야겠다'는 생각도 없이 '이게 뭐야..😮' 하면서 그냥 문제만 뚫어져라 보고 있었다.

어떤 날짜가 나와도 답이 나와야 했기 때문에, days[숫자] 형식으로 접근해야겠다고 생각했다.
1월 1일이 금요일이므로 daysFRI로 시작하게 했다. 그리고 7일마다 다시 리스트의 처음 부분으로 돌아와야 했기 때문에 나머지를 구해주는 %를 사용했고 1월 1일로부터 지난 날을 모두 더하기 위해서 sumb를 더하고 1일부터 시작했기 때문에 1을 빼주었다.

다른 사람의 답

import datetime

def getDayName(a,b):
    t = 'MON TUE WED THU FRI SAT SUN'.split()
    return t[datetime.datetime(2016, a, b).weekday()]

배운점

  • sum(리스트 범위) 함수로 리스트값을 모두 더할 수 있다는 점을 새롭게 알게 되었다.
  • datetime을 활용하면 저렇게 간단하게도 할 수 있는데 import 할 생각은 해보지도 못했다.
  • 나머지를 구해서 어디에 써먹나 궁금했는데 여기에서 써먹게 되었다(?)

가운데 글자 가져오기

내가 작성한 답

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

문제에서 요구한데로 짝수/홀수를 구분해야겠다고 먼저 생각했고 짝수인 경우와 홀수인 경우를 다르게 해주기 위해 조건문으로 나누었다.

다른 사람의 답

def string_middle(str):
    # 함수를 완성하세요

    return str[(len(str)-1)//2:len(str)//2+1]

변수도 없고 조건문도 없이 이렇게 깰끔하게도 가능하다니,,? 😲

배운점

  • 몫만 구할 때는 //를 쓰면 나누고 올림/내림을 안 해줘도 된다.
  • 생각의 시야를 넓히자(?)👀

같은 숫자는 싫어

내가 작성한 답

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

먼저 arr의 첫 번째 요소를 숫자를 answer에 추가하고 추가된 요소와 그다음 요소가 다를 경우에만 answerappend해주어 연속으로 같은 숫자가 나오지 않을 경우에만 append시켰다.

다른 사람의 답

def no_continuous(s):
    a = []
    for i in s:
        if a[-1:] == [i]: continue
        a.append(i)
    return a

마지막으로 append 된 부분을 [-1:]로 처리한 부분이 인상적이었다.

나누어 떨어지는 숫자 배열

내가 작성한 답

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

나누어서 나머지가 0인 요소만 answerappend해주었고, 아무 값도 리스트에 없다면 -1append하였다.

다른 사람의 답

def solution(arr, divisor): return sorted([n for n in arr if n%divisor == 0]) or [-1]

배운점

sorted() 함수를 공부해보면 좋을것 같다.

두 정수 사이의 합

내가 작성한 답

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

다른 사람의 답

def adder(a, b):
    if a > b: a, b = b, a
    return sum(range(a,b+1))

ab보다 클 때만 스왑을 해줬다

배운점

  • a, b = b, a swap 하기
  • sum() 두 변수 사이 값 모두 더하기..!

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

내가 작성한 답

def solution(strings, n):
    answer = []
    s = []
    for string in strings:
        s.append(string[n:n+1]+string)
        print(s)
        s.sort()
        print(s)
    for i in s:
        answer.append(i[1:])
        print(answer)            
    return answer

n번째 문자를 기준으로 정렬을 해야 해서 n번째 문자를 각 요소 앞에 붙여주고 sort 했다.
그 이후 맨 앞에 붙은 n번째 문자를 제외한 문자를 answer.append했다.

다른 사람의 답

def strange_sort(strings, n):
    '''strings의 문자열들을 n번째 글자를 기준으로 정렬해서 return하세요'''
    return sorted(strings, key=lambda x: x[n])

배운점

sorted() , lamda 를 사용해서 간단하게 코드를 짜보자

문자열 내 p와 y의 개수

내가 작성한 답

def solution(s):
    num_lower_p = s.count('p')
    num_upper_p = s.count('P')
    num_p = num_lower_p + num_upper_p
    num_lower_y = s.count('y')
    num_upper_y = s.count('Y')
    num_y = num_lower_y + num_upper_y
    if num_p == num_y:
        return True
    else:
        return False

다른 사람의 답

def numPY(s):
    # 함수를 완성하세요
    return s.lower().count('p') == s.lower().count('y')

배운점

  • 다른 사람의 답을 보고 나니 소문자나 대문자로 모두 바꾸어 count 했어도 이 코드에서는 문제가 없을 거 라는 걸 깨달았다.
  • return에서 비교를 하여 바로 True, False가 반환되도록 하는것도 간결하고 좋아보인다.

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

내가 작성한 답

def solution(s):
    answer = ''
    lst = []
    for i in range(len(s)):
        lst.append(s[i:i+1])
        lst.sort()
        lst.reverse()
    for i in lst:
        answer = answer+i
    return answer

다른 사람의 답

def solution(s):
    return ''.join(sorted(s, reverse=True))

배운점

  • sorted함수를 모르고 있었던 때라서 문자열을 리스트로 바꿔서 sort 했는데 sorted함수는 시퀀스 자료형 뿐만 아니라 순서에 구애받지 않는 자료형도 적용 가능하고 list로 반환한다.
  • for문으로 직접 문자열을 만들 필요 없이 join으로 간단하게 해결할 수 있었다. 😔

문자열 다루기 기본

내가 작성한 답

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

int타입으로 변환이 되면 True, 아니면 False를 리턴하게 했다.

다른 사람의 답

def alpha_string46(s):
    return s.isdigit() and len(s) in (4, 6)

배운점

  • isalpha함수는 문자열이 문자인지 아닌지를 True,False로 리턴한다.
  • isdigit함수는 문자열이 숫자인지 아닌지를 True,False로 리턴한다.

서울에서 김서방 찾기

내가 작성한 답

def solution(seoul):
    location = seoul.index('Kim')
    answer = '김서방은 '+str(location)+'에 있다'
    return answer

다른 사람의 답

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

배운점

  • 문자열 포매팅을 좀 더 공부해봐야겠다
profile
Hello, world!

0개의 댓글