1번.

수열이 정렬되어 있지 않으니까 이분 탐색은 못쓴다.

#include <stdio.h>

int a[100051];

int main() {
    int n, q;
    scanf("%d %d", &n, &q);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);

    for(int j=1; j<=q; j++) {
        int k;
        scanf("%d", &k);
        int ans = -1;
        for (int i = 1; i <= n; i++) {   
            if (a[i] == k) {
                ans = i;                 
                break;                  
            }
        }
        printf("%d\n", ans);
    }
}

2번. 

이게 조금 어려울수있는데 알고보면 쉽다.

시각을 전부 0시 0분부터 몇 분째인지로 바꾸면 0~1439 사이의 정수가 된다.
이걸 정렬해 두면 s 이상 e 이하인 기록 개수는 upper_bound(e) − lower_bound(s)로 
바로 구할 수 있다.

s가 e보다 늦으면 자정을 넘는 구간이니까 [s, 23:59]와 [00:00, e] 

두 구간으로 나눠서 각각 세고 더하면 된다.

#include <stdio.h>

int n, q;
int data[100071];  
int cnt[1440];      

int lower_bound(int start, int end, int key) {
    int result = end + 1;
    while (start <= end) {
        int mid = (start + end) / 2;
        if (data[mid] >= key) {     
            result = mid;
            end = mid - 1;
        }
        else start = mid + 1;
    }
    return result;
}

int upper_bound(int start, int end, int key) {
    int result = end + 1;
    while (start <= end) {
        int mid = (start + end) / 2;
        if (data[mid] > key) {    
            result = mid;
            end = mid - 1;
        }
        else start = mid + 1;
    }
    return result;
}

// s 이상 e 이하인 기록의 개수 (s <= e)
int count(int s, int e) {
    return upper_bound(1, n, e) - lower_bound(1, n, s);
}

int main() {
    int h, m, h2, m2;

    scanf("%d %d", &n, &q);
    for (int i = 1; i <= n; i++) {
        scanf("%d:%d", &h, &m);     // "hh:mm" 을 시, 분으로 읽기, 문자열써도 된다.
        cnt[h * 60 + m]++; ///이렇게 안하고 배열에 넣고 정렬해도 된다. 
    }
		
    int idx = 1;
    for (int t = 0; t < 1440; t++)
        for (int c = 0; c < cnt[t]; c++)
            data[idx++] = t;

    while (q--) {
        scanf("%d:%d %d:%d", &h, &m, &h2, &m2);
        int s = h * 60 + m, e = h2 * 60 + m2;
        if (s <= e) printf("%d\n", count(s, e));
        else printf("%d\n", count(s, 1439) + count(0, e));   // 자정을 넘는 구간
    }
}

3번

시험에 나온것처럼 bfs 돌린후에 마지막에 처리하면 끝.
거리 배열을 만들어놓으면 다양한 문제를 해결가능하다.

#include <stdio.h>
#include <queue>
using namespace std;

int n, m, s, k;
int adj[1001][1001];   
int dist[1001];        

int main() {
    scanf("%d %d %d %d", &n, &m, &s, &k);
    for (int i = 0; i < m; i++) {
        int u, v;
        scanf("%d %d", &u, &v);
        adj[u][v] = adj[v][u] = 1;    
    }

    for (int i = 1; i <= n; i++) dist[i] = -1;

    // BFS
    queue<int> q;
    dist[s] = 0;
    q.push(s);
    while (!q.empty()) {
        int x = q.front();
        q.pop();
        for (int y = 1; y <= n; y++) {
            if (adj[x][y] && dist[y] == -1) {
                dist[y] = dist[x] + 1;
                q.push(y);
            }
        }
    }

    // 번호가 작은 순서대로 거리가 k인 정점 출력
    int found = 0;
    for (int i = 1; i <= n; i++) {
        if (dist[i] == k) {
            printf("%d\n", i);
            found = 1;
        }
    }
    if (!found) printf("-1\n");
}
4번

인접리스트 -> 입력순
인접행렬 -> 사전순(번호가 작은순서, 큰순서)

#include <stdio.h>
#include <vector>
using namespace std;

vector<int> adj[1001];   
int order[1001];         // 방문 순서 (0이면 미방문)
int cnt = 0;

void dfs(int x) {
    order[x] = ++cnt;
   
    for (int i = 0; i < adj[x].size(); i++) {
        int y = adj[x][i];
        if (order[y] == 0) dfs(y);
    }
}

int main() {
    int n, m, r;
    scanf("%d %d %d", &n, &m, &r);
    for (int i = 0; i < m; i++) {
        int u, v;
        scanf("%d %d", &u, &v);
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    dfs(r);
    for (int i = 1; i <= n; i++) printf("%d\n", order[i]);
}

5번

두더지는 8방향나올수도있고 문자열입력나올수도있으니까 응용문제목록중에 
세균 안풀었으면 풀어보자. 이건 워낙 풀이가 다양 

#include <stdio.h>
#include <algorithm>
using namespace std;

int n, A[51][51], cnt, area[1300];
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
int best, bestCnt;

void input() {
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            scanf("%d", &A[i][j]);
}

void output() {
    printf("%d %d\n", best, bestCnt);
}

bool safe(int a, int b) {
    return (0 <= a && a < n) && (0 <= b && b < n);
}

bool cmp(int a, int b) {
    return a > b;
}

void dfs(int a, int b, int c) {
    A[a][b] = c;                                 
    for (int i = 0; i < 4; i++)
        if (safe(a + dx[i], b + dy[i]) && A[a + dx[i]][b + dy[i]] == 1)
            dfs(a + dx[i], b + dy[i], c);
}

void solve() {
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            if (A[i][j] == 1) {
                cnt++;
                dfs(i, j, cnt + 1);               
            }

    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            if (A[i][j]) area[A[i][j] - 2]++;     

    sort(area, area + cnt, cmp);                   

    best = area[0];                            
    for (int i = 0; i < cnt; i++)
        if (area[i] == best) bestCnt++;            
}

int main() {
    input();
    solve();
    output();
}
6번
0은빼 문제에서 좀더많이 뺴는문제다.
스택이 비어있을때 pop하면 오류가 발생하니까 
비어있는지 검사를 꼭 해준다.

#include <stdio.h>
#include <stack>
using namespace std;

int main() {
    int n;
    stack<int> st;

    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        int x;
        scanf("%d", &x);
        if (x > 0) {
            st.push(x);                       
        } else {
            int k = -x;                        
            while (!st.empty() && k > 0 ) {     
                st.pop();
                k--;
            }
        }
    }

    int sum = 0;
    while (!st.empty()) {                      
        sum += st.top();
        st.pop();
    }
    printf("%d\n", sum);
}