코딩테스트

코딩테스트

[카카오 2020 블라인드 코딩테스트] 문자열 압축 (c++)

https://school.programmers.co.kr/learn/courses/30/lessons/60057 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 위의 문제에 대한 풀이입니다. 우선 문제를 보면 무식한 방식으로 풀어도 될거같다는 느낌이 옵니다. 제한사항을 보면 문자열 길이가 1000이하로 주어졌는데, 반복가능한 문자열 단위는 최대 500입니다. 그 이유는 전체 문자열 길이의 절반을 넘어가면 반복되는 문자열을 통한 압축이 불가능해지기 때문입니다 ex: aaaabb >> 길이 단위를 4로 해도 2aaaa 이런식으로 압축이 불가능합니다. 길이가 ..

코딩테스트

[2021 카카오 블라인드 코딩테스트] 택시 합승 (c++)

https://school.programmers.co.kr/learn/courses/30/lessons/72413 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 위의 문제에 대한 풀이입니다. 이번엔 오답+ 정답 코드를 포스팅하는데, 우선 정답 먼저 보겠습니다. 택시합승이란 문제는 결국 어느지점까지 합승할지? 를 해결하면 풀 수 있습니다. 따라서 플로이드 와샬 알고리즘을 통하여 모든 노드들 간의 최단거리를 찾고, 어떤 합승지점에서 최소 값이 나오는지 linear 탐색을 통해 찾으면 해결됩니다. 아래는 해결 코드입니다. #include #include #in..

코딩테스트

[2021 카카오 블라인드 테스트] 순위 검색 (c++)

https://school.programmers.co.kr/learn/courses/30/lessons/72412 위의 문제에 대한 해설입니다. input으로 들어오는 2개의 vector 에서 각 벡터 안 1개의 string들은 총 5가지 유효한 string 정보를 가지고 있다. parser를 통해 유효한 5개의 string의 string을 추출한 뒤, 마지막에 위치한 점수에 대한 부분은 stoi() 함수를 통해 숫자로 바꾼다. map 자료구조를 통해 앞선 4개의 string들을 하나로 묶어 key 값으로써 사용하고, stoi()를 통해 정수형으로 바꾼 점수 정보를 value로써 추가한다. 이때 고려할 사항은 query에서는 '-' 라는 문자열이 특수성을 가진다는 것이다. '-'는 어떤 것이 와도 상관없..

코딩테스트

dp를 찾는 방법. [interval dp], 백준 11066번

dp는 상황을 나누고, 그 간의 관계를 파악하여 점화식 혹은 a=b와 같은 고정된 수식으로 표현하여 문제를 효율적으로 해결하는 방식이다. 예를 들어 동전이 연속으로 앞면이 나올 확률을 구한다고 생각해보자. 모든 상황은 결국 나누면 앞면, 뒷면 으로 나뉜다. 이를 수식으로 표현해보자. n-1 째까지 앞면 나올 확률 * 앞면 나올 확률 = n 째까지 앞면 나올 확률 즉 f(n-1)* 1/2 = f(n) 이라는 점화식을 구할 수 있다. dp는 이런 특정 행동 (동전을 던짐) 에 따른 관계의 변화를 수식으로 표현해서 구할 수 있다. (특정행동 n-1번 = 특정행동 n번 이런식으로 생각하면 쉽다.) 전에 knapsack 알고리즘에 대해서도 정리했었는데, dp라고 생각하고 식을 구해도 해결할 수 있다. 추가로 in..

코딩테스트

백준 14595 동방탈출 c++ (분리 집합 응용)

분리집합 응용문제를 하나 들고 왔습니다. 분리집합에 관한 기본적인 지식은 생략하고 해당 문제의 핵심 아이디어만 아래 코드블럭의 주석에 구체적이게 달아 놓았으니 참고하세요! #include using namespace std; #include int n, m,cnt; int arr[1000000]; int find(int a) { if (arr[a] == a) return a; else return arr[a] = find(arr[a]); } void join(int a, int b) { a = find(a); b = find(b); if (a == b)return; arr[a] = b; //두번째 파라미터가 첫번째 파라미터의 부모가 된다. } int main() { scanf("%d %d", &n, &m..

코딩테스트

[백준 14939번 , 1208번] 백준 문제로 배우는 비트 마스킹

비트 마스킹 (bit masking) 이란? 이진수와 관련된 개념이다 이진수 110 은 2^2+2^1 으로 십진수 6을 표현한다. 그리고 이진수는 또다른 원론적인 의미로 해석될 수 있는데 바로 true false다. 즉 110 은 단순 십진수 6 뿐 아니라, 첫째, 둘째 놈은 true, 셋째 놈은 false 로 의미 부여를 하고 갈 수 도 있는것. 이번엔 거꾸로 가보자. 눈앞에 10개 버튼이 있는데, 나는 각버튼을 누를 수 도, 누르지 않을 수도 있다. 내가 버튼을 누를 수 있는 경우의 수는? 간단한 수학이다. 누른다, 안누른다 = 2 2^10= 1024 가지 경우의 수가 나온다. 아래 이진수에 부여한 의미를 생각해보자 0000000000 == 십진수 0 >> 전부 버튼을 누르지 않는다 000000000..

코딩테스트

최장 증가 수열(LIS), 최장 공통 문자열(LCS)

lis는 10, 20, 10, 30, 20, 50 이런 길이 5의 수열중 10, 20 ,30 ,50 과 같이 계속해서 증가하는 수열들 중, 가장 긴 수열을 찾는 문제다. 우선 lcs는 푸는 방식이 정말 다양한데, 전부 시간 복잡도가 다르다. dp를 통해서 풀게되면 O(N^2) 이고, lower_bound를 통해서 풀게 되면 O(NlogN) 의 시간 복잡도가 발생한다. lis 문제는 시간초과를 가지고 장난을 많이 치기에 lower_bound 방식만 가지고 문제를 풀어보겠다. 자세한건 아래 문제를 보면서 알아보자..! 1.lis 의 길이는? lis의 길이를 구하는 문제로, 위 의 입력의 경우 10,20,30,50 이기에 4가 정답입니다. 흔히 전깃줄 문제로 응용 됩니다. 자세한 건 아래 문제를 확인 해봅시다..

코딩테스트

knapsack 알고리즘 (백준 1535 , 4781 , 7579 )

knapsack은 "제한된 자원" 으로 "최적(최대 or 최소) 의 이득" 을 얻는 문제에서 사용된다. 아래는 대표적인 예시 중 하나다. n개의 보석이있다. 이중 1~ n번째 보석중 k 번째 보석의 무게를 w_k, 가격을 c_k 라고 정의한다. 내가 가방에 최대로 담을 수 있는 무게가 w_max일때, 내가 담을 수 있는 최대 가치는? 대충 이런 느낌이지만, knapsack도 상황에 따라 다양한 방식으로 나눠져 있으므로 지금부터 같이 하나하나 알아보자! 1) fractional knapsack - 보석을 쪼개서 가방에 담을 수 있다. >> 그냥 무게당 가치가 높은것들을 우선적으로 가방에 담으면 끝이다. 예를들어 무게3에 가치 9, 무게 2에 가치 4 무게 1에 가치 1인 보석이있다고하면 1번의 무게 1당 ..

코앤미
'코딩테스트' 카테고리의 글 목록 (7 Page)