하루하루 꾸준히, 인생은 되는대로

알고리즘

2022-05-12 알고리즘 문제

긤효중 2022. 5. 12. 10:38

https://www.acmicpc.net/problem/15970

 

15970번: 화살표 그리기

직선 위에 위치를 나타내는 0, 1, 2, ...와 같은 음수가 아닌 정수들이 일정한 간격으로 오른쪽 방향으로 놓여 있다. 이러한 위치들 중 N개의 위치에 하나씩 점들이 주어진다(<그림 1>). 주어진 점들

www.acmicpc.net

#include <iostream>
#include <algorithm>
#include <cctype>
#include <cstdlib>

//백준 15970 화살표 그리기
//같은 색깔의 점 중 거리가 가장 가까운 점을 찾기
/*색깔이 다르면 색깔의 오름차순으로, 색깔이 같다면 위치를 오름차순으로 sort하고 찾는다*/
using namespace std;
struct PAIR{
    int x;
    int color;
};

typedef struct PAIR p;
 
bool cmp(p a, p b){
    if(a.color != b.color){
        return a.color<b.color;
    }
    else if(a.color == b.color){
        if(a.x != b.x){
            return a.x<b.x;
        }
    }
}
 
int min(int a,int b){
    if(a<b){
        return a;
    }
    else{
        return b;
    }
}
int main(void){
 
    p arr[5000];
    int n;
    cin >> n;
    for(int i = 0;i<n;i++){
        cin >> arr[i].x >> arr[i].color;
    }
    sort(arr,arr+n,cmp);
 
    long long sum = 0;
    for(int i = 0;i<n;i++){
        int Min = 200000000;
        for(int j = 0;j<n;j++){
            if(arr[i].color == arr[j].color && i != j){
                 Min = min(Min,abs(arr[i].x - arr[j].x));  
            }
        }
        sum = sum + Min;
    }
    cout << sum;
 
}

https://www.acmicpc.net/problem/5597

 

5597번: 과제 안 내신 분..?

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다. 교수님이 내준 특별과제를 28명이 제출했는데,

www.acmicpc.net

#include <iostream>
using namespace std;
int main(void){
    bool check[30] = {false, };
    for(int i = 0;i<28;i++){
        int number;
        cin >> number;
        check[number] = true;
    }
    int arr[2];
    int idx = 0;
    for(int i = 0;i<=30;i++){
        if(i == 0){
            continue;
        }
        if(check[i] == false){
            arr[idx] = i;
            idx++;
        }
    }
    if(arr[0] < arr[1]){
        cout << arr[0] << '\n';
        cout << arr[1];
    }
    else{
        cout << arr[1] << '\n';
        cout << arr[0];
    }
}

https://www.acmicpc.net/problem/8958

 

8958번: OX퀴즈

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수

www.acmicpc.net

#include <iostream>
#include <string>
using namespace std;
int main(void){
    int t;
    cin >> t;
    while(t--){
        string str;
        cin >> str;
        int count = 0;
        int sum = 0;
        for(int i = 0;i<str.size();i++){
            if(str[i] == 'X'){
                count = 0;
            }
            else{
                count++;
                sum = sum + count;
 
            }
        }
        cout << sum << '\n';
    }
}

https://www.acmicpc.net/problem/10974

 

10974번: 모든 순열

N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오.

www.acmicpc.net

#include <iostream>
using namespace std;
int n;
bool visited[10];
int arr[10];
 
void dfs(int start){
    if(start == n){
        for(int i = 0;i<n;i++){
            cout << arr[i] << ' ';
        }
        cout << '\n';
        return;
    }
    for(int i = 1;i<=n;i++){
        if(visited[i] == false){
            visited[i] = true;
            arr[start] = i;
            dfs(start+1);
            visited[i] = false;
        }
    }
}
int main(void){
    cin >> n;
    dfs(0);
}