[선린 알고리즘 연구반] 알고리즘 기초 연습 #2


재제출 죄송합니다.

괄호

문제 링크

  • http://icpc.me/9012

풀이

여는 괄호는 스택에 넣고, 닫는 괄호 나오면 스택에서 빼면서 케이스 분석하면 됩니다.

쇠막대기

문제 링크

  • http://icpc.me/10799

풀이

링크

프린터 큐

문제 링크

  • http://icpc.me/1966

풀이

링크

수 정렬하기2

문제 링크

  • http://icpc.me/2751

풀이

입력받고 정렬하고 출력하면 끝나는 문제

1
2
3
4
5
6
7
8
9
10
#include <bits/stdc++.h>
using namespace std;

int main(){
    int arr[1000000] = {0};
    int n; scanf("%d", &n);
    for(int i=0; i<n; scanf("%d", &arr[i++]));
    sort(arr, arr+n);
    for(int i=0; i<n; printf("%d\n", arr[i++]));
}

좌표 정렬하기

문제 링크

  • http://icpc.me/11650

풀이

pair와 sort를 적절히 잘 쓰자.

이름

나이순 정렬

  • http://icpc.me/10814

풀이

비교 함수 잘 만들어주자.
나이가 같으면 입력받은 순서대로 정렬해야 하니 stable_sort를 써주면 편하게 할 수 있다.

수족관1

문제 링크

  • http://icpc.me/8982

풀이

문제에서 하라는대로 잘 구현하면 된다.
소스코드

회전 초밥

문제 링크

  • http://icpc.me/2531

풀이

링크

보물

문제 링크

  • http://icpc.me/1026

풀이

A는 오름차순, B는 내림차순으로 배열하면 최소가 된다는 것을 쉽게 알 수 있다.

커플 만들기

문제 링크

  • http://icpc.me/1727

풀이

남자와 여자를 각각 정렬했을 때, dp[i][j]를 남자 i명, 여자 j명을 매칭하는 최솟값이라 정의하자.
i > j인 경우에는 dp[i][j] = min(dp[i-1][j-1] + abs(a[i] - b[j]), dp[i-1][j])
i < j인 경우에는 dp[i][j] = min(dp[i-1][j-1] + abs(a[i] - b[j]), dp[i][j-1])