목록알고리즘 (172)
컴굥일지

문제 https://www.acmicpc.net/problem/2930 문제 내용 상근이가 가위바위보를 한다. 친구들과의 가위바위보를 했을 때의 점수를 출력하고, 친구들의 수를 미리 알고 있었을 때 상근이가 가장 많이 획득할 수 있는 점수도 출력하면 된다. 문제 풀이 check_win()이라는 함수를 만들어 문제를 해결했다. 상근이의 수와 친구의 수를 인자로 넘겨서 상근이가 몇 점을 획득할지 반환하는 함수이다. 이 함수를 main함수의 반복문 안에서 사용하면 된다. arr배열은 상근이가 친구들의 수를 모두 알고 있을 때, 가위/보/바위를 냈을 때 어떤 점수를 받는지를 저장한 것이다. 이중에 가장 큰 값을 저장하면 max_score를 얻을 수 있다. 그냥 score는 상근이와 친구들의 수를 그냥 비교하면 ..

문제 https://www.acmicpc.net/problem/1181 문제 내용 단어를 입력받아서 조건에 따라 정렬하여 출력하면 된다. 1. 길이가 짧은 것부터 2. 길이가 같으면 사전 순으로 ** 단, 같은 단어는 1번만 출력한다 (중복 제거하기)** 문제 풀이 조건 1, 2는 그냥 vector로 입력받아서 정렬 기준을 새로 정해서 sort()하면 되었었다. 다만, 추가 조건에 중복을 제거하라고 했기 때문에 set을 사용해서 문제를 풀었다. set에서 정렬의 기준을 바꾸려면 구조체를 선언하여 비교를 해야 한다. 그리고 vector처럼 정렬을 나중에 sort()를 써서 하는 것이 아니라, 애초에 set을 선언할 때 두 번째 인자로 미리 만든 구조체를 넣어 주어야 한다. 코드 #include #inclu..

문제 https://www.acmicpc.net/problem/2164 문제 내용 1~N까지의 카드가 있다. 1번이 제일 위에 있고, N이 제일 아래에 있다. 카드가 한 장 남을 때까지 두 가지 행위를 번갈아가며 진행한다. 1. 제일 위에 있는 카드를 버린다. 2. 제일 위에 있는 카드를 제일 밑으로 옮긴다. 문제 풀이 queue를 사용하여 문제를 풀면 된다. queue에 1~N까지 차례로 추가하고 위에서 설명한 행위를 진행하면 된다. 코드 #include #include using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); //입력 int n; cin >> n; queue qq; //문제 해결 fo..

문제 https://www.acmicpc.net/problem/10828 문제 내용 Stack을 사용할 때 쓰는 함수들을 쓰면 된다. Stack STL을 사용할 줄 안다면 쉽게 풀 수 있다. 문제 풀이 5가지 명령 중에 명령 그대로 함수를 쓰면 안 되는 것이 2가지 있다. 바로 pop()과 top()이다. 이 두 함수는 사용하기 전에 stack이 비어있는지 반드시 확인해야 한다. 코드 #include #include using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); //입력 int n,tmp; cin >> n; stack ss; string str; //문제 해결 for (int i = 0; i ..

문제 https://www.acmicpc.net/problem/14606 문제 내용 피자판의 탑을 분리하며 얻을 수 있는 즐거움의 최대치를 출력하는 것이다. 높이가 A인 탑을 높이가 B와 C인 탑으로 분리했다면, 이때 얻을 수 있는 즐거움의 크기는 B*C이다. 문제 풀이 일단, 높이가 A인 탑을 분리하여 가장 큰 즐거움을 얻기 위해서는, 분리하는 두 탑의 높이가 같거나 높이가 1 차이여야 한다. ex) 7 => (1,6) (2,5) (3,4) => (3,4)로 나눌 때가 가장 값이 커진다. ex) 6 => (1,5) (2,4) (3,3) => (3,3)으로 나눌 때가 가장 값이 커진다. 이 문제는 탑을 계속해서 나누어가야 하므로 dp를 이용하는 것이 좋다. 먼저, dp[1]=0, dp[2]=1이다. 피자..

문제 https://www.acmicpc.net/problem/9658 문제 내용 상근이와 창영이가 번갈아가며 돌을 가져가는데, 한 번에 1개, 3개, 4개를 가져갈 수 있다. 마지막 돌을 가져가는 사람이 지는 게임이다. 누가 이기는지 구하면 된다. 문제 풀이 [백준 9657 돌 게임 3] 문제에서 이기는 조건이 뒤바뀐 문제이다. 마지막에 가져가는 사람이 지게 되며, 양쪽 다 완벽하게 게임을 한다는 것을 유의하자. 돌의 개수에 따른 규칙은 밑의 코드 주석으로 달아두었다. 코드 #include using namespace std; int dp[1005] = { 0, }; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); //입력 int..

문제 https://www.acmicpc.net/problem/2294 문제 내용 동전 n개를 입력하여 k원을 만들려고 한다. 최소한의 동전 개수를 사용하여 k원을 만들려고 할 때, 동전 개수를 출력하면 된다. 문제 풀이 이 문제는 아래의 [백준 11047 동전 0]과 유사하다. [BOJ/백준 11047][C++] 동전 0 문제 https://www.acmicpc.net/problem/11047 문제 내용 동전을 적절히 사용해서 K원을 만드는 문제이다. 이때 동전의 최소화하여 사용하는 것이 이 문제의 핵심이다. 문제 풀이 이 문제는 greedy한 성격이 있 gyong0117.tistory.com 동전 0 문제에서는 주어지는 동전의 가치가 서로 배수관계에 있기 때문에 greedy 하게 풀 수 있었다. 하지..

문제 https://www.acmicpc.net/problem/15312 문제 내용 영어 이름 2개를 입력받아, 두 이름의 궁합을 출력하면 된다. 궁합은 알파벳의 획순을 두고, 인접한 것끼리 계속 더해나가면 되는 방식이다. (1의 자리만 나타낸다) 문제 풀이 먼저, 문제 힌트에 적힌 대로 각 알파벳 별로 획순을 배열에 미리 저장해둔다. 그리고 문자열 두 개를 입력받아, 알파벳을 번갈아가며 저장하면 된다. 이때 알파벳 자체를 저장하기보단, 알파벳의 획순을 저장한다. 그리고 반복문 안에서 양 옆의 숫자와 계속 더해나가면 된다. 원소가 2개만 남았을 때, 결과를 출력하고 반복문을 멈추면 된다. 코드 #include #include #include using namespace std; //획 int line[2..

문제 https://www.acmicpc.net/problem/9076 문제 내용 심판 5명의 점수가 주어진다. 이때 최고점과 최저점의 점수를 제외한 심판 3명의 점수 중, 최고점과 최저점의 차이가 4 이상이면 "KIN"을 출력한다. 그렇지 않으면 심판 3명의 점수의 합계를 출력하면 된다. 문제 풀이 심판 5명의 점수를 입력받은 뒤 정렬을 진행한다. 이후, 0번과 4번 인덱스는 각각 최저점과 최고점이니 배제하고 생각한다. 4번 인덱스와 1번 인덱스의 차가 4 이상이면 "KIN"을 출력하고 다음 테스트 케이스로 넘어간다. 그렇지 않다면 인덱스 1~3까지의 합을 더하고 출력하면 된다. 코드 #include #include #include using namespace std; int main() { //입력 ..

문제 https://www.acmicpc.net/problem/1337 문제 내용 올바른 배열을 만들기 위해 추가해야 하는 최소한의 원소의 개수를 구하면 된다. 올바른 배열은 배열 안의 원소 중 5개가 연속인 경우를 말한다. 문제 풀이 처음에는 어떻게 풀어야 할지 고민이 많았다. 일단 배열을 입력받아서 sort()로 정렬을 진행한다. 그 이후, 처음부터 끝까지 반복문을 돌아야 한다. 반복문 안에, 또 다른 반복문이 필요하다. 현재 원소를 포함하여 5개가 연속되는지를 판단하는 것이다. 매 반복문마다 연속되는 것의 개수를 파악하고, 결괏값을 max()로 판단해서 업데이트하면 된다. 결괏값이 만약 5 이상이라면, 한 번에 연속되는 것이 5개 이상이라는 의미이므로 추가해야 할 원소의 개수는 0개이다. 결괏값이 ..