본문 바로가기

Tech

(580)
[프로그래머스] 124 나라의 숫자 문제설명 https://programmers.co.kr/learn/courses/30/lessons/12899 코딩테스트 연습 - 124 나라의 숫자 programmers.co.kr 사고과정 이것도 DP로 풀어야 하나 싶었지만 그런 문제는 아니었다. N진법 변환문제인건가 싶었지만 그것도 아니었다.. 엄청 난해한 문제라 질문하기에서 아이디어를 봤는데 3진법을 좀 특수적으로 운영해서 풀어야 했다.. 즉, 3진법을 이용하되 3으로 나누어떨어질때는 몫을 하나 감소시켜서 나머지가 0이 안되게 한 뒤 3은 4로 바꾸어주저야 한다.. 매우 난해한 문제인 듯하다.. 이걸 어찌 풀라고...흑 풀이(스스로 못 푼 풀이) def solution(n): answer = '' while n: t = n % 3 if not t:..
[밑시딥] 과거의 기억을 그대로, 순환신경망(RNN) 🔊 해당 포스팅은 밑바닥부터 시작하는 딥러닝 2권의 교재 내용을 기반으로 자연어처리 딥러닝 신경망을 Tensorflow, Pytorch와 같은 딥러닝 프레임워크를 사용하지 않고 순수한 Numpy로 구현하면서 자연어 처리의 기초를 탄탄히 하고자 하는 목적 하에 게시되는 포스팅입니다. 내용은 주로 필자가 중요하다고 생각되는 내용 위주로 작성되었음을 알려드립니다. 이전 포스팅까지는 Feed-Forward Neural Network(FNN)에 대해서 다루었다. 단어의 분산을 표현하기 위해 학습시켰던 신경망 모델인 CBOW 모델, Skip-gram 모델 모두 하나의 은닉층으로 하는 FNN 신경망 모델이었다. 하지만 이 FNN 모델은 순서가 중요한 특성으로 여겨지는 시퀀스 데이터 즉, 시계열 데이터를 잘 다루지 못..
[프로그래머스] 멀쩡한 사각형 문제설명 https://programmers.co.kr/learn/courses/30/lessons/62048 코딩테스트 연습 - 멀쩡한 사각형 가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을 programmers.co.kr 사고과정 주어진 문제 범위가 1억이라 DP문제일 것 같아서 어떻게든 규칙을 찾아내려 했다.. 그러나 실패했다.. 질문하기 탭에 가서 보았는데, w, h의 최대공약수를 활용해서 푸는 문제였다..윾.. 그래도 덕분에 파이썬으로 최대공약수를 구현하는 방법을 알게 되었다. 일명 유클리드 호제법! 유클리드 호제법은 큰 수를 작은수로 나..
[프로그래머스] 오픈채팅방 문제설명 https://programmers.co.kr/learn/courses/30/lessons/42888 코딩테스트 연습 - 오픈채팅방 오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오 programmers.co.kr 사고과정 해쉬인 딕셔너리를 이용해야 하는 문제인 것 같았다. 그런데 입력 파라미터에서 출력결과로 어떻게 변환시켜 내뱉을지에 대한 고민이 매우 많았다.. 이런저런 시도를 해보다가 아이디어가 잘 떠오르지 않아서 구글링해서 소스코드는 보지 않고 어떤 아이디어만 사용한건지 보았다. 그래서 key는 ID로, value는 닉네임으로 하는 딕셔너리를 정의하고 Ent..
[프로그래머스] 문자열 내 마음대로 정렬하기 문제설명 https://programmers.co.kr/learn/courses/30/lessons/12915 코딩테스트 연습 - 문자열 내 마음대로 정렬하기 문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱 programmers.co.kr 사고과정 문제에서 n번째 인덱스로 정렬하고 난 후에 사전순으로 정렬하라고 입출력 예시를 주어서 무조건 정렬 순서를 입출력 예시로만 생각해서 구현하려 했다.. 그러다보니 테스트케이스를 통과하지 못했고.. 머리를 쥐어싸매도 도저히 아이디어가 잘떠오르지 않았다.. 정렬 알고리즘 같은 것을 직..
[프로그래머스] 두 정수 사이의 합 문제설명 https://programmers.co.kr/learn/courses/30/lessons/12912 코딩테스트 연습 - 두 정수 사이의 합 두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다. 제한 조건 a와 b가 같은 경우 programmers.co.kr 사고과정 단순이 리스트 컴프리헨션을 사용한 것보다 제네레이터를 활용해서 구현했다. 풀이 def solution(a, b): if a == b: return a elif a < b: return sum(x for x in range(a, b+1)) else: return sum(x fo..
[프로그래머스] 나누어 떨어지는 숫자 배열 문제설명 https://programmers.co.kr/learn/courses/30/lessons/12910 코딩테스트 연습 - 나누어 떨어지는 숫자 배열 array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하 programmers.co.kr 사고과정 단순한 구현 문제였다. 배열 원소 하나씩 돌면서 divisor과 나누어떨어지는지 확인하면 됨. 단, 마지막에 나누어떨어지는 숫자를 append 한 리스트 길이가 0이면 -1을 반환하는 처리만 추가해주면 된다. 풀이 def solution(arr, divisor): answer ..
[프로그래머스] 같은 숫자는 싫어 문제설명 https://programmers.co.kr/learn/courses/30/lessons/12906 코딩테스트 연습 - 같은 숫자는 싫어 배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 programmers.co.kr 사고과정 스택을 활용하는 전형적인 문제이다. 스택이 비어있을 때는 바로 숫자를 넣고, 다음 배열의 원소를 돌때마다 스택의 가장 상위값을 확인하고 가장 상위값과 같으면 넣지말고 다르면 넣는 방식으로 구현하면 된다. 풀이 def solution(arr): stack = [] for a in arr: if not stack: sta..
[프로그래머스] 다트 게임 문제설명 https://programmers.co.kr/learn/courses/30/lessons/17682# 코딩테스트 연습 - [1차] 다트 게임 programmers.co.kr 사고과정 문제가 스택을 활용해야 하는 듯한 문제인 게 감이 팍왔다.. 조건이 상당히 까다로웠다.. 시간이 좀 오래 걸리긴 했지만 구현에 성공했다... 중간에 많이 헤맨 부분이 잘 구현했는데 *(스타상) 일 때, 스택에서 뽑아낸 2개의 데이터를 다시 넣어줄 때 뽑아낸 순서 반대로 넣어줬어야 했는데 뽑아낸 순서대로 넣어주어서 테스트 케이스에서 자꾸 오류를 발생시켰다.. 그래도 디버깅해서 다행이다.. 스택에서 빼고 넣어줄 때 순서에 유의해야겠다! 풀이 def solution(dartResult): stack1 = [] # 숫자넣..
[프로그램스] 가운데 글자 가져오기 문제설명 https://programmers.co.kr/learn/courses/30/lessons/12903 코딩테스트 연습 - 가운데 글자 가져오기 단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다. 재한사항 s는 길이가 1 이상, 100이하인 스트링입니다. 입출력 예 s ret programmers.co.kr 사고과정 홀수 일 경우는 문자길이를 2로 나누었을 때의 인덱스를 가져오면 된다. 짝수 일 경우는 문자길이를 2로 나누었을 때의 인덱스 -1 부터 +1 인덱스까지의 슬라이싱으로 가져오면 된다. 풀이 def solution(s): mid = len(s) // 2 if len(s) % 2 != 0: return s[mi..
[프로그래머스] 비밀지도 문제설명 https://programmers.co.kr/learn/courses/30/lessons/17681 코딩테스트 연습 - [1차] 비밀지도 비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다 programmers.co.kr 사고과정 십진수를 이진수로 DFS 함수로 바꾸어주는 것이 가장 핵심이었다. 즉 암호화된 10진수 값을 이진수 값으로 부호화한다. 그리고 n길이 만큼 이진수 길이가 나오지 않은 값들은 모두 왼쪽에다가 0을 빈자리에 모두 추가해주어야 한다. 그리고 난 후 두 맵의 동일한 원소끼리 합쳤을 때 값이 1 이상이면 벽이고 0이면 공백으로 최종 맵을 갱신해주..
[프로그래머스] 부족한 금액 계산하기 문제설명 https://programmers.co.kr/learn/courses/30/lessons/82612 코딩테스트 연습 - 부족한 금액 계산하기 새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이 programmers.co.kr 사고과정 count 만큼 반복해서 money에서 price를 빼주되 count할 때마다 price에 1배씩 증가시켜 빼준다. 결과 money값이 음수면 부족하다는 의미이므로 절댓값을 취해 부족한 금액을 반환하고 만약 양수라면 부족하지 않다는 것이므로 0을 반환하면 된다. 풀이 def solution(price, money, co..
[프로그래머스] 나머지가 1이 되는 수 찾기 문제설명 https://programmers.co.kr/learn/courses/30/lessons/87389 코딩테스트 연습 - 나머지가 1이 되는 수 찾기 자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다. 제한사항 입 programmers.co.kr 사고과정 그냥 단순히 1부터 N+1까지 loop를 돌면서 N이랑 나누었을 때, 나머지가 1이 되는 수가 발견되는 순간 바로 리턴하면 된다! 풀이 def solution(n): for i in range(1, n+1): if n % i == 1: return i
[프로그래머스] 최소 직사각형 문제설명 https://programmers.co.kr/learn/courses/30/lessons/86491 코딩테스트 연습 - 최소직사각형 [[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]] 120 [[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]] 133 programmers.co.kr 사고과정 모든 명함들을 다 넣을 수 있는 최소 지갑 크기를 구해야 한다. 명심해야 할 점은 주어진 명함의 가로, 세로를 바꾸어서 수납이 가능하다는 점! 그래서 우선은 각 명함마다 길이를 오름차순으로 모두 정렬하면서 가로, 세로 길이를 오름차순으로 재정렬한다. 그리고 난 뒤의 가로 길이의 최댓값, 세로길이의 최댓값을 구한 후 넓이를 구해주면 된다! 풀이 de..
[프로그래머스] 2016년 문제설명 https://programmers.co.kr/learn/courses/30/lessons/12901 코딩테스트 연습 - 2016년 2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까 programmers.co.kr 사고과정 이런 문제가 더 어려운 듯 하다... 우선 2016년 한정으로 문제가 주어지기 때문에 2016년의 월마다 일수를 리스트로 정의했다. 그리고 2016년 1월 1일이 금요일이기 때문에 금요일부터 시작해서 목요일까지 순서로 리스트를 정의했다. 그리고 만약 문제에서 1월달 날짜로 주어진다면 그냥 바로 일수(b)에..
[프로그래머스] 두 개 뽑아서 더하기 문제설명 https://programmers.co.kr/learn/courses/30/lessons/68644 코딩테스트 연습 - 두 개 뽑아서 더하기 정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요. 제한 programmers.co.kr 사고과정 N개 중 2개를 뽑는 조합의 경우의 수를 탐색하면서 그 경우의 수를 합한 결과값을 집합 자료구조형에 담아서 unique한 원소들만 남도록 구현했다. 한 가지 배운점이 있는데, 그 동안 nested function(중첩 함수)에서 바깥 함수에서 정의한 변수를 inner 함수에서 사용할 때 어떻게 해..
[프로그래머스] 예산 문제설명 https://programmers.co.kr/learn/courses/30/lessons/12982 코딩테스트 연습 - 예산 S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 programmers.co.kr 사고과정 최대한 많은 부서의 물품을 구매해 줄 수 있도록 이라는 문장에서 그리디 유형이라는 것을 예상했다. 그리고 그리디는 정렬 과 자주 연계되기 때문에 정렬도 같이 생각함! 문제에서 부서별로 신청한 금액이 d 배열로 주어지는데, 예산 안에서 최대한 많은 부서에 지원해야 하니까 d 배열을 오름차순으로 정렬한 뒤 d를 for loop를 돌면서 예산을 차감하다..
[프로그래머스] 3진법 뒤집기 문제설명 https://programmers.co.kr/learn/courses/30/lessons/68935 코딩테스트 연습 - 3진법 뒤집기 자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요. 제한사항 n은 1 이상 100,000,000 이하인 자연수 programmers.co.kr 사고과정 10진수를 n진수로 만드는 방법은 재귀함수로 활용해서 쉽게 구현했다. 그런데 n진수로 만든다음 뒤집은 후 다시 이를 10진수로 변환하라고 해서, '뒤집는 것까지' 10진수에서 n진수로 만들 때 적용했다. 그런데 이렇게 하면 10진수로 변환하는 로직을 적용하면, 변환 이전의 10진수값으로 다시 돌아..
[프로그래머스] 약수의 개수와 덧셈 문제설명 https://programmers.co.kr/learn/courses/30/lessons/77884 코딩테스트 연습 - 약수의 개수와 덧셈 두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주 programmers.co.kr 사고과정 소수 판별이나 소수의 개수를 구하는 에라토스테네스의 체 처럼 제곱근을 활용해서 탐색하는 시간 복잡도를 줄일 수 있지 않을까를 계속 파고들었다.. 하지만 결국 구현을 하지 못해서 그냥 1부터 X까지 선형적으로 약수를 탐색했다. 다른사람 풀이를 보니 약수가 홀수개인 모든 수는 제곱수라는 것을 이용..
[프로그래머스] 폰켓몬 문제설명 https://programmers.co.kr/learn/courses/30/lessons/1845 코딩테스트 연습 - 폰켓몬 당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다. programmers.co.kr 사고과정 set 자료구조를 활용했다. 어차피 요구하는 사항은 폰켓몬 종류 최대 개수만 리턴하면 되기 때문에 구현이 간단했다. 풀이에 비해 문제가 길어서...살짝 쫄은 상태에서 읽었다..쫄지말자.. 풀이 def solution(nums): monster = len(set(nums)) n = len(nums) if monster