목록Algorithm (131)
Dolphins의 HelloWorld
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42588 풀이 복잡하게 생각하기보다 그냥 단순하게 이중배열을 통해 일일히 비교해주면 쉽게 풀 수 있는 문제이다.
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42584 풀이 이중배열을 통해 풀 수 있는 아주 간단한 문제이다. 잘 모르겠다면 다시 한번 생각해보고 코드를 확인하도록 하자.
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42579 풀이 map함수를 이용해서 풀면 어려운 문제는 아니지만 요구조건과 처리해야할 사항들이 좀 있기 때문에 헷갈리지 않고 잘 정리해나가면서 푸는것이 필요한 문제이다. 이 문제를 푼 절차는 다음과 같다. 1. map함수를 통해 장르 이름을 key 재생 횟수를 value로 삼아서 장르당 총 재생횟수를 구한다. 2. 위의 map함수를 통해 가장 많이들은 장르, 두번째로 많이 들은 장르를 알아낸다. 3. 노래별 재생 횟수와 index를 함께 인자로 가지는 vector
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42578 풀이 옷의 종류를 string, 갯수를 int로 하는 map함수를 사용하면 각 옷의 가짓수별로 몇개가 있는지 알아내는 것은 어렵지 않다. 여기서 스파이가 착용할 수 있는 옷의 모든 경우의 수를 알아내기 위해 생각한 방법은 옷의 갯수마다 1을더한 것을 모두 곱한다음 1을 빼는것이다. 여기서 1을 더하는 이유는 안입는 경우도 포함하기 위함이며 모든 옷을 안입는 한가지의 경우는 존재하지 않으므로 1을 빼서 마무리하는 것이다.
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42577 풀이 어떤 번호가 다른 번호의 접두어인지 쉽게 알기위해 문자열의 길이가 짧은 것부터 순서대로 먼저 정렬하는 작업을 수행하였다. 그런다음 이중배열을 사용하여 가장 짧은 문자열부터 시작하여 뒤에 있는 문자열들이 해당 문자열을 포함하고 있는지 검사하여 있다면 false 없다면 true를 반환하도록 하였다.
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42576 풀이 map함수의 활용법을 알고 있다면 쉽게 풀 수 있는 문제이다. 완주한 선수의 이름을 key로 삼아서 그 이름이 나올 때마다 value를 증가시키고 그 다음에는 참가한 선수의 이름에 대해 value를 감소시킨다. value가 0보다 작은 이름을 가진 사람이 완주하지 못한 사람이 될 것이다.
문제 링크 : https://www.acmicpc.net/problem/1107 #include #include using namespace std; bool not_work[10]; int channel(int num) //버튼이 고장나지 않았다면 해당 채널의 자릿수 반환 { int len = 0; do { len++; if (not_work[num % 10]) //버튼이 고장나있다면 0 반환 return 0; num /= 10; } while (num != 0); return len; } int main() { int N, num; //틀고자하는 채널, 고장난 버튼의 수 int tmp; //그냥 임시적으로 쓰는 변수 scanf("%d %d", &N, &num); for (int i = 0; i < n..
다음 순열 순열을 사전순으로 나열했을 때, 다음에 오는 순열을 어떻게 찾을것인가? ex) 현재 3 4 1 2 라고 나열되어 있을 때 다음 순열인 3 4 2 1 을 어떻게 출력할 수 있을까 다음 순열을 찾는 알고리즘은 다음과 같다. 1. A[i-1] = i 이면서 A[j] > A[i-1]을 만족하는 가장 큰 j를 찾는다. 3. A[i-1]과 A[j]를 swap 4. A[i]부터 순열을 뒤집는다. 코드를 작성한 후 결과를 확인해보면 다음과 같다. #include using namespace std; bool next(int *arr, int size) { int x, y; for (int i = size - 1; i > 0; i--) { if (arr[i..
비트마스크란 비트연산을 사용하여 부분 집합을 표현하는 것이다. 기본적으로 &, | , ~ , ^ (and,or,not,xor) 연산이 있으며. 비트연산중에는 > 연산이 있다. 만약 A > B 같은 경우 오른쪽으로 B비트만큼 민다는 의미를 가진다. 실제로 직접 밀어보면 왼쪽으로 밀 때는 숫자가 2^B배가 되고 오른쪽으로 밀 때는 숫자가 2^B로 나눈값이 된다. 비트마스크의 가장 큰 특징은 정수로 집합을 나타낼 수 있다는 점이다. 예를들어 70을 8자리의 비트셋으로 나타내면 01000110이다. 이것을 1이 있는 자리인 {1,2,6}으로 표현할 수 있는것이다. - n이 포함되어 있는지 검사 만약 2가 포함되어있는지 검사하고 싶다면 70 & ( 1
문제링크 : https://www.acmicpc.net/problem/1939 풀이 문제를 어떻게 풀까 하다가 이진탐색과 DFS를 결합하기로 하였다. DFS같은 경우 경로를 따라 다리를 건널 때 DFS함수에 매개변수로 넣어준 하중이 다리가 견딜 수 있는 하중보다 높으면 다리를 못건너도록 하여 트럭이 목적지까지 가면 따로 지정해준 전역변수에 true를 할당하도록 하였고 목적지까지 가지 못한다면 false를 할당하도록 하였다. 나머지 과정은 그 true인지 false인지에 따라 처리를 달리해주며 무게에 따라 이진탐색을 계속 하도록 하였다. #include #include #include using namespace std; vector v[100001]; bool map[100001]; int start_p..