글

Programmers) 모의고사

문제 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ... 2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ... 3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ... 1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요. 제한 조건 시험은 최대 10,000 문제로 구성되어있습니다. 문제의 정답은 1, 2, 3, 4, 5중 하나입니다. 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요. 입출력 예 answers return [1,2,3,4,5] [1] [1,3,2,4,2] [1,2,3] 입출력 예 설명 입출력 예 #1 수포자...

Programmers) 소수 찾기

문제 한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요. 제한사항 numbers는 길이 1 이상 7 이하인 문자열입니다. numbers는 0~9까지 숫자만으로 이루어져 있습니다. 013 은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다. 입출력 예 numbers return 17 3 011 2 입출력 예 설명 예제 #1 [1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다. 예제 #2 [0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다. 11과 011은 같은 숫자로 취급합니다. 설명 오랜만에 간단한 문제입니다. 숫자로 이루어진 특정 문자열이 들어왔을 때, 각 문자로 이룰 수 있는 숫자의 경우의 수를 탐색하고, 만들어진 숫자 중에 소수는 몇개 있는가 판단하는 문제입니다. 여기서 문제 될 거라면 각 문자의 조합 수를 판단하...

Programmers) N으로 표현

문제 아래와 같이 5와 사칙연산만으로 12를 표현할 수 있습니다. 12 = 5 + 5 + (5 / 5) + (5 / 5) 12 = 55 / 5 + 5 / 5 12 = (55 + 5) / 5 5를 사용한 횟수는 각각 6,5,4 입니다. 그리고 이중 가장 작은 경우는 4입니다. 이처럼 숫자 N과 number가 주어질 때, N과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return 하도록 solution 함수를 작성하세요. 제한사항 N은 1 이상 9 이하입니다. number는 1 이상 32,000 이하입니다. 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다. 최솟값이 8보다 크면 -1을 return 합니다. 입출력 예 N number return 5 12 4 2 11 3 입출력 예 설명 예제 #1 문제에 나온 예와 같습니다. 예제 #2 11 = 22 / 2 와 같이 2를 3번만 사용하여 표현할 수 있습니다. 설명 복잡한 문제를 작은 문제로 쪼개어 최적의 해를 찾는 동적 계획법(다이나믹 프로그래밍 - Dynamic Programming)을 사용하여 푸는 문제입니다. 동적 계획법이나 그리디 알고리즘은 늘 봐도 익숙하지 않은 개념 이므로... 공부하고 문제를 푸는 데 좀 애를 먹었습니다. 물론 동적 계획법의 경우 '최적의 해'를 찾기만 하면 의외로 쉽게 해결되는 경우가 많아서 코딩 테스트에 나오게 되면 푸는 재미가 있는 알고리즘이긴 합니다. 그럼 제가 찾은 규칙에 대해 설명하겠습니다. 1) 숫자가 합쳐진 형태 (ex : N, NN, NNN, 문제에서는 5, 55, 555가 되겠죠?)는 경우의 수를 탐색할 때 쓰지 않는다. 즉 처음에 리스트에 담아두어야 한다. 2) N이 3개를 사용하는 계산식의 경우,  2개 & 1개, 혹은 1개 & 2개의 연산으로 표현할 수 있다...

2020.06.06 리스트를 단 한줄로 만들자, List Comprehension과 리스트 생성의 성능 비교

이미지
이번 일일 파이썬 주제는 List Comprehension 입니다. 파이썬을 배우시는 분 들이라면 한 번쯤 배워본 문법일 테고, 리스트를 단 한 줄 코드로 생성하는 깔끔한 특성 때문에 많이들 애용하고 계실 겁니다. 사실 저는 List Comprehension(리스트 컴프리헨션)을 그렇게 많이 사용하는 편은 아닙니다. 물론 코드의 행을 줄일 수록 전체적인 코드가 간결 해진다는 장점 도 있을 것이며, 리스트 컴프리헨션을 사용한 행을 보고 '아 이 코드는 리스트를 생성하는 코드 구나' 쉽게 알아볼 수 있기 때문에 좋긴 하지만, 문제는 그 한 줄이 너무나도 길어질 수 있고, 그 한 줄을 해석하는 데 영겁의 시간이 걸리는 경우 가 잦아지는, 즉 코드의 복잡도를 증가시키는 문제가 있었기 때문에(물론 이건 실력이 부족한 저의 문제...) 기어이 고집을 부려가면서, 강제로 for문 몇개 집어 넣어 가면서, append로 꾸역꾸역 데이터를 집어넣으면서 리스트를 만들고 그랬죠. 리스트 컴프리헨션 안쓸꺼야!!! 하지만 최근에 미디움을 돌아다니면서, 리스트 컴프리헨션이 성능이 굳이 반복문 돌리고 append 함수 사용하는 것보다 월등히 뛰어나다는 것을 알게 되면서... 부랴부랴 코딩할 때 리스트 컴프리헨션을 공부하기 시작했고, 이 내용은 공유하면 좋겠다고 생각하여 일일 파이썬 주제로 사용하게 되었습니다. 제가 참조한 미디움 글은 아래의 글입니다. Faster Lists In Python See what list actions are the fastest in Python to speed up your programs. David Tippett  in  Level Up Coding 이 글은 제가 이제부터 소개 드릴 리스트 생성의 성능 개선 파트 말고도, 리스트를 정렬하는 방법 중 가장 성능이 좋은 방법 에 대해서도 big O 표기법를 통해 설명하고 있으...