전체 글

전체 글

    [프로그래머스][파이썬/Python] (2018 서머코딩/윈터코딩) 스킬트리

    [프로그래머스][파이썬/Python] (2018 서머코딩/윈터코딩) 스킬트리

    문제 설명 선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다. 예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일 때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다. 위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다. 선행 스킬 순서 skill과 유저들이 만든 스킬트리를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요. 제한 조건 ..

    [프로그래머스][파이썬/Python] 쇠막대기

    [프로그래머스][파이썬/Python] 쇠막대기

    문제 설명 여러 개의 쇠막대기를 레이저로 절단하려고 합니다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자릅니다. 쇠막대기와 레이저의 배치는 다음 조건을 만족합니다. 쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있습니다. 쇠막대기를 다른 쇠막대기 위에 놓는 경우 완전히 포함되도록 놓되, 끝점은 겹치지 않도록 놓습니다. 각 쇠막대기를 자르는 레이저는 적어도 하나 존재합니다. 레이저는 어떤 쇠막대기의 양 끝점과도 겹치지 않습니다. 아래 그림은 위 조건을 만족하는 예를 보여줍니다. 수평으로 그려진 굵은 실선은 쇠막대기이고, 점은 레이저의 위치, 수직으로 그려진 점선 화살표는 레이저의 발사 방향입니다. 이러한 레이저와 쇠막대기의 배치는 다음과 ..

    [프로그래머스][파이썬/Python] (2018 카카오 코딩테스트) 비밀지도

    [프로그래머스][파이썬/Python] (2018 카카오 코딩테스트) 비밀지도

    문제 설명 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다. 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 공백(" ") 또는벽("#") 두 종류로 이루어져 있다. 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 "지도 1"과 "지도 2"라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다. "지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다. 암호화된 배열은 지도의 각 가로줄에서 ..

    [프로그래머스][파이썬/Python] 2016년

    [프로그래머스][파이썬/Python] 2016년

    문제 설명 2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각 SUN, MON, TUE, WED, THU, FRI, SAT 입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 TUE를 반환하세요. 제한 조건 2016년은 윤년입니다. 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다.) 입출력 예 제출 코드 import datetime def solution(a, b): d = datetime.datetime(2016, a, b) weekdays = ..

    [파이썬/Python] 재귀함수(Recursive function)와 메모이제이션(Memoization)

    [파이썬/Python] 재귀함수(Recursive function)와 메모이제이션(Memoization)

    재귀함수(recursive function)란 함수 내부에서 자기 자신(함수)을 다시 호출하는 함수이다. 잘만 활용하면 참 좋다고 생각하는데, 가장 중요한 탈출 조건을 생각해내는 것이 상당히 까다로운 편이라 권장되지는 않고 있다. 또한, 재귀함수만 이용할 경우 과도하게 스택메모리를 이용하게 되고 탈출 조건을 잘못 세울 경우 스택오버플로우 에러가 발생할 위험도 존재한다. 그래서 동적 프로그래밍(Dynamic Progrmming)처럼 재귀함수의 각 단계 결과값을 저장하여 성능을 높여주는 방법도 존재한다. 우선 재귀함수의 예시를 두 개 들어보자. 1. 팩토리얼 구하기 일반적인 for문을 이용하여 팩토리얼을 구하면 다음과 같은 코드를 짤 수 있다. def factorial_for(n): if n == 0 or ..

    [파이썬/Python] 리스트 안에서 반복문, Comprehension

    [파이썬/Python] 리스트 안에서 반복문, Comprehension

    요즘 틈 나는 대로 프로그래머스의 코딩 테스트 문제를 풀고 있다. 지금 Python으로 풀 수 있는 Level 1 문제들은 세 문제만을 남겨두고 있으며, 슬슬 Level 2 문제들도 풀어나가고 있다. 코드 정리는 귀찮아서 못하고 있는데 일단 Git에만 푸쉬해두고 있는 상태다. (Git에도 사실 다 푸쉬는 못했다..ㅎ) 아 글은 언제 쓰냐아으ㅏ으아아ㅏㅏ 귀찮다. 아직 저레벨 수준의 코딩 테스트 문제들이었지만, 문제를 풀어나가며 유용했던 함수 및 메소드를 정리해볼까 한다. 오늘은 그 첫 번째 순서로 Python에서 아주 유용한 comprehension이다. Comprehension Comprehension이란, iterable한 객체를 생성하는 방법 중 하나로 아주 유용하게 쓰고 있다. 나는 list랑 di..

    [파이썬/Python] 진법 변환 함수 - int( )

    [파이썬/Python] 진법 변환 함수 - int( )

    프로그래머스 강의 에서 숫자 num과 진법을 나타내는 base를 파라미터로 제공해줄 때, 10진법 숫자로 출력하라는 문제가 있었다. 나는 다음과 같은 코드로 짰다. num, base = map(int, input().strip().split(' ')) # 프로그래머스 측에서 제공해주는 입력값을 받음 num = str(num) length = len(num) sum = 0 for i in range(length): sum = sum + int(num[i])*pow(base, length-i-1) print(sum) 잘 굴러는 갔는데, python답지 못하다고 할 것이다. 그러나 어쩌나... 이렇게 밖에 짤 줄 모르는 나다. 근데 python 내의 내장 함수를 이용하는 코드를 보니 살짝 충격적이었다. pyt..

    [파이썬/Python] divmod와 언패킹(unpacking)을 활용하여 몫과 나머지 구하기

    [파이썬/Python] divmod와 언패킹(unpacking)을 활용하여 몫과 나머지 구하기

    a와 b라는 수가 주어진 후, a과 b를 나눈 몫과 나머지를 구하는 연산은 무엇일까? 1. 몫을 구하는 연산자 //, 나머지를 구하는 연산자 %를 통해 출력 a = 5 b = 3 print(a//b, a%b) # 출력값 : 1 2 많은 사람들이 위와 같이 코드를 짤 것이라고 생각한다. 나 또한 위처럼 짰다. 하지만 프로그래머스 인강 '파이썬을 파이썬답게'에서는 몫과 나머지를 한꺼번에 구하는 내장 함수 divmod와 unpacking 기법을 활용하여 몫과 나머지를 구하는 방법을 알려준다. 2. 몫과 나머지를 한꺼번에 구하는 내장 함수 divmod와 unpacking을 통해 출력 a = 5 b = 3 print(*divmod(a, b)) # 출력값 : 1 2 python 내장함수 중 divmod는 복소수가 ..