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

 

 

1759번: 암호 만들기

첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.

www.acmicpc.net

#include "bits/stdc++.h"
using namespace std;
//암호 만들기
char arr[15];
int n, m;

void recursive(int start, int cnt1, int cnt2, string str) {
    //printf("==%s %d %d\n", str.c_str(), cnt1, cnt2);
    if (str.size() == n && cnt1 >= 1 && cnt2 >= 2) {
        printf("%s\n", str.c_str());
        return;
    }
   for (int i=start; i<m; i++) {
        //str += arr[i];
        if (arr[i] == 'a' || arr[i] == 'e' || arr[i] == 'i' || arr[i] == 'o' || arr[i] == 'u') {
            cnt1++;
        }
        else {
            cnt2++;
        }
        recursive(i+1, cnt1, cnt2, str+arr[i]);
        if (arr[i] == 'a' || arr[i] == 'e' || arr[i] == 'i' || arr[i] == 'o' || arr[i] == 'u') {
            cnt1--;
        }
        else {
            cnt2--;
        }
   }
}

int main() {
   cin >> n >> m;
   for (int i=0; i<m; i++) {
        cin >> arr[i];
   }
   sort(arr, arr + m);
   recursive(0, 0, 0, "");
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 - 퇴사  (0) 2022.03.19
백준 - 부분수열의 합  (0) 2022.03.19
백준 - 로또  (0) 2022.03.19
백준 숫자카드 - 이분탐색  (0) 2022.03.18
백준 1,2,3 더하기 (브루트 포스)  (0) 2022.03.18

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

 

14501번: 퇴사

첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.

www.acmicpc.net

 

 

 

#include "bits/stdc++.h"
using namespace std;
//퇴사
int n, maxi;
pair<int, int> arr[15];

void recursive(int start, int sum) {
    if (start >= n) {
        if (sum > maxi) maxi = sum;
        return;
    }
    for (int i=start; i<n; i++) {
        if (i+arr[i].first <= n) {
            recursive(i+arr[i].first, sum+arr[i].second);
        }
        else {
            recursive(i+arr[i].first, sum);
        }
    }
}

int main() {
    cin >> n;
    for (int i=0; i<n; i++) {
        cin >> arr[i].first >> arr[i].second;
    }
    recursive(0, 0);
    printf("%d", maxi);
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 - 암호만들기  (0) 2022.03.19
백준 - 부분수열의 합  (0) 2022.03.19
백준 - 로또  (0) 2022.03.19
백준 숫자카드 - 이분탐색  (0) 2022.03.18
백준 1,2,3 더하기 (브루트 포스)  (0) 2022.03.18

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

 

1182번: 부분수열의 합

첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.

www.acmicpc.net

 

JW

 

#include "bits/stdc++.h"
using namespace std;
//부분수열의 합
int arr[20], n, m, cnt;

void recursive(int start, int level, int sum) {
    if (start == level && sum == m) {
        cnt++;
    }
    for (int i=start; i<n; i++) {
        recursive(i+1, level, sum+arr[i]);
    }
}

int main() {
    cin >> n >> m;
    for (int i=0; i<n; i++) {
        cin >> arr[i];
    }
    for (int i=1; i<=n; i++) {
        recursive(0, i, 0);
    }
    printf("%d", cnt);
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 - 암호만들기  (0) 2022.03.19
백준 - 퇴사  (0) 2022.03.19
백준 - 로또  (0) 2022.03.19
백준 숫자카드 - 이분탐색  (0) 2022.03.18
백준 1,2,3 더하기 (브루트 포스)  (0) 2022.03.18

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

 

6603번: 로또

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로

www.acmicpc.net

 

JW

#include "bits/stdc++.h"
using namespace std;
//로또
int arr[13], result[6], n = 1;

void recursive(int start, int index) {
    if (index == 6) {
        for (int i=0; i<6; i++) {
            printf("%d ", result[i]);
        }
        printf("\n");
        return;
    }
    for (int i=start; i<n; i++) {
        result[index] = arr[i];
        recursive(i+1, index+1);
    }
}

int main() {
    while (n != 0) {
        cin >> n;
        for (int i=0; i<n; i++) {
            cin >> arr[i];
        }
        recursive(0, 0);
        printf("\n");
    }
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 - 퇴사  (0) 2022.03.19
백준 - 부분수열의 합  (0) 2022.03.19
백준 숫자카드 - 이분탐색  (0) 2022.03.18
백준 1,2,3 더하기 (브루트 포스)  (0) 2022.03.18
백준 숨바꼭질 4 (역추적)  (0) 2022.03.14

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

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

 

 

 

#include "bits/stdc++.h"
using namespace std;
// 숫자 카드
int main() {
    int n, m, arr[10000], finding[10000];
    cin >> n;
    for (int i=0; i<n; i++) {
        cin >> arr[i];
    }
    sort(arr, arr + n);
    cin >> m;
    for (int i=0; i<m; i++) {
        cin >> finding[i];
    }
    for (int i=0; i<m; i++) {
        int l = 0, r = n-1;
        bool found = false;
        while (l <= r) {
            int a = (l + r)/2;
            if (finding[i] == arr[a]) {
                printf("1 ");
                found = true;
                break;
            }
            if (finding[i] > arr[a]) {
                l = a+1;
            }
            if (finding[i] < arr[a]) {
                r = a-1;
            }
        }
        if (!found) printf("0 ");
    }
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 - 부분수열의 합  (0) 2022.03.19
백준 - 로또  (0) 2022.03.19
백준 1,2,3 더하기 (브루트 포스)  (0) 2022.03.18
백준 숨바꼭질 4 (역추적)  (0) 2022.03.14
백준 일곱 난쟁이  (0) 2022.03.14

 

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

 

9095번: 1, 2, 3 더하기

각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.

www.acmicpc.net

JW

 

 

#include "bits/stdc++.h"
using namespace std;
//1, 2, 3 더하기
int cnt, arr[10], n;

void recursive(int sum) {
    if (sum == n) {
        cnt++;
        return;
    }
    if (sum > n) return;
    for (int i=1; i<=3; i++) {
        recursive(sum+i);
    }
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        cnt = 0;
        cin >> n;
        for (int i=1; i<=3; i++) {
            recursive(i);
        }
        printf("%d\n", cnt);
    }
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 - 로또  (0) 2022.03.19
백준 숫자카드 - 이분탐색  (0) 2022.03.18
백준 숨바꼭질 4 (역추적)  (0) 2022.03.14
백준 일곱 난쟁이  (0) 2022.03.14
백준 2×n 타일링 2  (0) 2022.03.14

 

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

 

13913번: 숨바꼭질 4

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

 

 

 

 

 

#include <bits/stdc++.h>
using namespace std;
//숨바꼭질 4
int main(void) {
    queue<int> q;
    int n, m, visited[10000] = {0,}, time[10000] = {0,};
    cin >> n >> m;

    q.push(n);
    visited[n] = 1;

    while (!q.empty()) {
        int now = q.front();
        q.pop();
        if (now == m) {
            printf("%d\n", time[m]);
            break;
        }
        if (time[now-1] >= 0 && visited[now-1] == 0) {
            q.push(now-1);
           visited[now-1] = 1;
           time[now-1] = time[now] + 1;
        }
        if (time[now+1] <= 10000 && visited[now+1] == 0) {
            q.push(now+1);
            visited[now+1] = 1;
            time[now+1] = time[now] + 1;
        }
        if (time[now*2] <= 10000 && visited[now*2] == 0) {
            q.push(now*2);
            visited[now*2] = 1;
            time[now*2] = time[now] + 1;
        }
    }
    int path[10000], index = 0;
    int now = m;
    path[index] = now;
    index++;
    while(now != n) {
        //printf("===%d \n", now);
        if (now-1 >= 0 && visited[now-1] == 1 && time[now-1] == time[now]-1) {
            now = now - 1;
        }
        else if (now+1 <= 10000 && visited[now+1] == 1 && time[now+1] == time[now]-1) {
            now = now+1;
        }
        else if (now % 2 == 0 && visited[now/2] == 1 && time[now/2] == time[now]-1) {
            now = now/2;
        }
        path[index] = now;
        index++;
    }
    //return 0;

    for (int i=index-1; i>=0; i--) {
        printf("%d ", path[i]);
    }

    return 0;
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 숫자카드 - 이분탐색  (0) 2022.03.18
백준 1,2,3 더하기 (브루트 포스)  (0) 2022.03.18
백준 일곱 난쟁이  (0) 2022.03.14
백준 2×n 타일링 2  (0) 2022.03.14
백준 꿀따기 21758번 (11점 )  (0) 2022.03.11

 

 

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

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

 

#include "bits/stdc++.h"
using namespace std;
// 일곱 난쟁이
int main() {
    int height[9], sum = 0;
    for (int i=0; i<9; i++) {
        cin >> height[i];
        sum += height[i];
    }
    sort(height, height+9);
    for (int i=0; i<8; i++) {
        for (int j=i+1; j<9; j++) {
            if (sum - height[i] - height[j] == 100) {
                for (int k=0; k<9; k++) {
                    if (k == i || k == j) continue;
                    printf("%d\n", height[k]);
                }
                return 0;
            }
        }
    }
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 1,2,3 더하기 (브루트 포스)  (0) 2022.03.18
백준 숨바꼭질 4 (역추적)  (0) 2022.03.14
백준 2×n 타일링 2  (0) 2022.03.14
백준 꿀따기 21758번 (11점 )  (0) 2022.03.11
백준 균형잡힌 세상  (0) 2022.03.07

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

 

11727번: 2×n 타일링 2

2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다.

www.acmicpc.net

JW 

 

#include "bits/stdc++.h"
using namespace std;
// 2*n 타일링 2
int dp[1001];
int recursive(int n) {
    if (n == 1) return 1;
    if (n == 2) return 3;
    if (dp[n] != 0) {
        return dp[n];
    }
    dp[n] = recursive(n-1)%10007 + 2*recursive(n-2)%10007;
    return dp[n];
}

int main() {
    int n;
    cin >> n;
    printf("%d", recursive(n)%10007);
}

 

 

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 숨바꼭질 4 (역추적)  (0) 2022.03.14
백준 일곱 난쟁이  (0) 2022.03.14
백준 꿀따기 21758번 (11점 )  (0) 2022.03.11
백준 균형잡힌 세상  (0) 2022.03.07
백준 소수 구하기 1929  (0) 2022.03.07

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

 

21758번: 꿀 따기

첫 번째 줄에 가능한 최대의 꿀의 양을 출력한다.

www.acmicpc.net

 

JW학생

 

#include "bits/stdc++.h"
using namespace std;
// 꿀 따기 (3중 for문)
int main() {
    int n, max = 0, arr[100000] = {0,};
    cin >> n;
    for (int i=0; i<n; i++) {
        cin >> arr[i];
    }
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            if (j == i) continue;
            for (int k=0; k<n; k++) {
                if (k == i || k == j) continue;
                int itemp = i, jtemp = j;
                int sum = 0;
                while (itemp != k) {
                    if (itemp < k) itemp++;
                    else itemp--;
                    if (itemp == j) continue;
                    sum += arr[itemp];
                }
                while (jtemp != k) {
                    if (jtemp < k) jtemp++;
                    else jtemp--;
                    if (jtemp == i) continue;
                    sum += arr[jtemp];
                }
                if (sum > max) max = sum;
            }
        }
    }
    printf("%d", max);
}

 

 

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 일곱 난쟁이  (0) 2022.03.14
백준 2×n 타일링 2  (0) 2022.03.14
백준 균형잡힌 세상  (0) 2022.03.07
백준 소수 구하기 1929  (0) 2022.03.07
백준 토마토  (0) 2022.03.07

4949번: 균형잡힌 세상 (acmicpc.net)

 

4949번: 균형잡힌 세상

하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마

www.acmicpc.net

 

 

#include <bits/stdc++.h>
using namespace std;
//균형잡힌 세상
int main() {
    string str;

    getline(cin, str);
    while (str != ".") {
        stack<char> bracket;
        int len = str.size();
        for (int i=0; i<len; i++) {
            if (str[i] == '(' || str[i] == '[') {
                bracket.push(str[i]);
            }
            else if (str[i] == ')' && !bracket.empty() && bracket.top() == '(') {
                bracket.pop();
            }
            else if (str[i] == ']' && !bracket.empty() && bracket.top() == '[') {
                bracket.pop();
            }
            else if (str[i] == ')' || str[i] == ']') {
                bracket.push('a');
                break;
            }
        }
        if (bracket.empty()) {
            printf("yes\n");
        }
        else {
            printf("no\n");
        }
        getline(cin, str);
    }
}

 

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 2×n 타일링 2  (0) 2022.03.14
백준 꿀따기 21758번 (11점 )  (0) 2022.03.11
백준 소수 구하기 1929  (0) 2022.03.07
백준 토마토  (0) 2022.03.07
스택 Stack  (0) 2022.02.04

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

 

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

www.acmicpc.net

 

#include <bits/stdc++.h>
using namespace std;
//소수 구하기
int main() {
	int n, m;
	cin >> n >> m;
	for (int i=n; i<=m; i++) {
		bool prime = true;
		if (i == 1) prime = false;
		else {
			for (int j=2; j*j<=i; j++) {
				if (i % j == 0) {
					prime = false;
					break;
				}
			}
		}
		if (prime) printf("%d\n", i);
	}
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 꿀따기 21758번 (11점 )  (0) 2022.03.11
백준 균형잡힌 세상  (0) 2022.03.07
백준 토마토  (0) 2022.03.07
스택 Stack  (0) 2022.02.04
단어 뒤집기 2  (0) 2021.12.31

 

 

JW

 

 

#include <bits/stdc++.h>
using namespace std;
//토마토

int main() {
	queue<pair<int, int>> q;
	int n, m;
	int arr[1002][1002] = {0,}, visited[1002][1002] = {0,};
	cin >> n >> m;
	for (int i=1; i<=m; i++) {
		for (int j=1; j<=n; j++) {
			cin >> arr[i][j];
		}
	}

	for (int i=1; i<=m; i++) {
		for (int j=1; j<=n; j++) {
			if (arr[i][j] == 1) {
				q.push({i, j});
				visited[i][j] = 1;
			}
			else if (arr[i][j] == -1) {
				visited[i][j] = 1;
			}
		}
	}
	while (!q.empty()) {
		int x = q.front().first;
		int y = q.front().second;
		q.pop();
		if (x-1 != 0 && arr[x-1][y] == 0 && visited[x-1][y] == 0) {
			q.push({x-1, y});
			arr[x-1][y] = arr[x][y] + 1;
			visited[x-1][y] = 1;
		}
		if (x+1 != m+1 && arr[x+1][y] == 0 && visited[x+1][y] == 0) {
			q.push({x+1, y});
			arr[x+1][y] = arr[x][y] + 1;
			visited[x+1][y] = 1;
		}
		if (y-1 != 0 && arr[x][y-1] == 0 && visited[x][y-1] == 0) {
			q.push({x, y-1});
			arr[x][y-1] = arr[x][y] + 1;
			visited[x][y-1] = 1;
		}
		if (y+1 != n+1 && arr[x][y+1] == 0 && visited[x][y+1] == 0) {
			q.push({x, y+1});
			arr[x][y+1] = arr[x][y] + 1;
			visited[x][y+1] = 1;
		}
	}
	for (int i=1; i<=m; i++) {
		for (int j=1; j<=n; j++) {
			if (visited[i][j] == 0) {
				printf("-1");
				return 0;
			}
		}
	}
	int maxi = 0;
	for (int i=1; i<=m; i++) {
		for (int j=1; j<=n; j++) {
			if (arr[i][j] > maxi) {
				maxi = arr[i][j];
			}
		}
	}
	printf("%d", maxi-1);
}

 

 

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 균형잡힌 세상  (0) 2022.03.07
백준 소수 구하기 1929  (0) 2022.03.07
스택 Stack  (0) 2022.02.04
단어 뒤집기 2  (0) 2021.12.31
백준 : 가운데를 말해요 1655번  (0) 2020.05.10

10828번: 스택 (acmicpc.net)

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

#include <bits/stdc++.h>
using namespace std;
//X정우 학생 
int main() {
   string cmd;
   int cnt, stack[10000] = {0,}, push;
   cin >> cnt;
   for (int i=0; i<cnt; i++) {
      cin >> cmd;
      if (cmd == "push") {
         cin >> push;
         for (int j=0; j<10000; j++) {
            if (stack[j] == 0) {
               stack[j] = push;
               break;
            }
         }
      }
      else if (cmd == "pop") {
         if (stack[0] == 0) {
            printf("-1\n");
         }
         else {
            for (int j=0; j<10000; j++) {
               if (stack[j] == 0) {
                  printf("%d\n", stack[j-1]);
                  stack[j-1] = 0;
                  break;
               }
            }
         }
      }
      else if (cmd == "size") {
         int cnt = 0;
         for (int j=0; j<10000; j++) {
            if (stack[j] != 0) {
               cnt++;
            }
            else {
               break;
            }
         }
         printf("%d\n", cnt);
      }
      else if (cmd == "empty") {
         if (stack[0] == 0) {
            printf("1\n");
         }
         else {
            printf("0\n");
         }
      }
      else if (cmd == "top") {
         if (stack[0] == 0) {
            printf("-1\n");
         }
         else {
            for (int j=0; j<10000; j++) {
               if (stack[j] == 0) {
                  printf("%d\n", stack[j-1]);
                  break;
               }
            }
         }
      }
   }
   
   return 0;
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 소수 구하기 1929  (0) 2022.03.07
백준 토마토  (0) 2022.03.07
단어 뒤집기 2  (0) 2021.12.31
백준 : 가운데를 말해요 1655번  (0) 2020.05.10
BOJ 외판원 순회 2 - 10971번  (0) 2020.05.08

X혁 학생의 단어뒤집기2 성공 코드

 

#include <bits/stdc++.h>
using namespace std;
//단어 뒤집기 2
int main()
{
    stack<char> k,l;
    string a;
    int i,j,b;
    getline(cin,a);
    b=a.size();
    for(i=0;i<b;i++){
        if(a[i]=='<'){
            k.push(a[i]);
            while(!l.empty()){
                cout << l.top();
                l.pop();
            }
            cout << "<";
        }
        if(a[i]=='>'){
            k.pop();
            cout << ">";
        }
         if(!k.empty()&&a[i]!='<'){

            cout << a[i];
        }
         if(k.empty()&&a[i]!='>'){
            l.push(a[i]);
        }
    }


    return 0;
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 토마토  (0) 2022.03.07
스택 Stack  (0) 2022.02.04
백준 : 가운데를 말해요 1655번  (0) 2020.05.10
BOJ 외판원 순회 2 - 10971번  (0) 2020.05.08
백준 - 프린터 큐 : 1966번  (0) 2020.04.26

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

 

1655번: 가운데를 말해요

첫째 줄에는 수빈이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 수빈이가 외치는 정수가 차례대로 주어진다. 정수는 -10,000보다 크거나 같고, 10,000보다 작거나 같다.

www.acmicpc.net

 

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
//가운데를 말해요  1655 
int main()
{
    priority_queue <int> p;
    priority_queue <int, vector<int>, greater<int>> q;
    int n,i,a;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a);
        if(p.empty() || q.empty())
        {
            //puts("11");
            p.push(a);
        }
        else
        {
            //puts("22");
            if(q.top()<=a)
            {
                //puts("33");
                q.push(a);
            }
            else
            {
                //puts("44");
                p.push(a);
            }
        }
        if(!(p.size() == q.size() || p.size() == q.size() + 1))
        {
            //uts("55");
            if(p.size() > q.size())
            {
                q.push(p.top());
                p.pop();
            }
            else{
                p.push(q.top());
                q.pop();
            }
        }
        printf("%d\n", p.top());
    }
    return 0;
}

 

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

스택 Stack  (0) 2022.02.04
단어 뒤집기 2  (0) 2021.12.31
BOJ 외판원 순회 2 - 10971번  (0) 2020.05.08
백준 - 프린터 큐 : 1966번  (0) 2020.04.26
백준 - 로마 숫자 만들기 : 16922번  (0) 2020.04.26

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

 

10971번: 외판원 순회 2

첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j로 가기 위한 비용을 나타낸다. 항상 순회할 수 있는 경우만 입력으로 주어진다.

www.acmicpc.net

 

 

//나머지
#include<stdio.h>
#include<vector>
#include<stack>
#include<string.h>
#include<algorithm>
using namespace std;

int main(void)
{
    int n;
    int w[10][10] = {0, };
    int a[10];
    int min=2100000000;

    for(int i=0; i<10; i++)
    {
        a[i] = i;
    }
    int sum=0;

    scanf("%d", &n);
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            scanf("%d", &w[i][j]);
        }
    }
    do{
        sum=0;
        int flag = 1;
        for(int i=0; i<n; i++)
        {
            int x;
            if(i+1 < n)
            {
                x = w[a[i]][a[i+1]];
                sum+=x;
            }
            else
            {
                x = w[a[i]][a[0]];
                sum+=x;
            }
            if(x==0)
            {
                flag++;
            }
        }
        if(flag == 1 && min>sum)
        {
            min = sum;
        }
    }while(next_permutation(a, a+n)!=0);

    printf("%d", min);
	return 0;
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

단어 뒤집기 2  (0) 2021.12.31
백준 : 가운데를 말해요 1655번  (0) 2020.05.10
백준 - 프린터 큐 : 1966번  (0) 2020.04.26
백준 - 로마 숫자 만들기 : 16922번  (0) 2020.04.26
백준 - 두 로봇 : 15971  (0) 2020.03.31

 

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

 

1966번: 프린터 큐

문제 여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에 쌓여서 FIFO - First In First Out - 에 따라 인쇄가 되게 된다. 하지만 상근이는 새로운 프린터기 내부 소프트웨어를 개발하였는데, 이 프린터기는 다음과 같은 조건에 따라 인쇄를 하게 된다. 현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를

www.acmicpc.net

 

 

 

#include<bits/stdc++.h>
using namespace std; 

int myq_evaluate(queue<pair<int, int> > Q)	
{
	int siz = Q.size();
	int first_importance = Q.front().second;	
	int now_importance;
	
	for(int i=1; i<siz; i++)
	{
		Q.pop();
		if(Q.front().second > first_importance)
		{
			return 1;
		}
	}
	
	return 0;
}

int main(void)
{
	int t;
	int ans = 1;
	int temp;
	
	scanf("%d", &t);	
	
	for(int i=0; i<t; i++)
	{
		int n, m;	
		ans = 1;
		
		scanf("%d %d", &n, &m);	
		queue<pair<int, int> >q;	
		pair<int, int> temp_front;
		
		for(int j=0; j<n; j++)
		{
			scanf("%d", &temp);
			q.push(make_pair(j, temp));	
		}
		
		
		while(1)
		{
			while(myq_evaluate(q))	
			{
				temp_front = q.front();	
				q.pop();
				q.push(temp_front);
			}
			
			if(q.front().first != m)	
			{
				q.pop();
				ans++;
			}
			else
			{
				break;
			}
		}
		
		printf("%d\n", ans); 
	}
	
	return 0;
}

 

 

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int main()
{

    int a,b,i,d[100]={0,},cnt=0,f;
    scanf("%d",&f);
    while(f>0)
    {
        priority_queue<pair<int,int>> p;
        scanf("%d %d",&a,&b);
        for(i=0;i<a;i++)
        {
            scanf("%d",&d[i]);
            p.push({d[i],i});
        }
        while(!p.empty())
        {
            cnt++;
            int t=p.top().second;
            if(b==t)
            {
                printf("%d\n",cnt);
                break;
            }

            p.pop();
        }
        f--;
        cnt=0;
    }
    return 0;
}

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

 

16922번: 로마 숫자 만들기

2, 6, 10, 11, 15, 20, 51, 55, 60, 100을 만들 수 있다.

www.acmicpc.net

 

 

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
//로마 숫자 만들기
int main()
{
    int n,i,j,k,check[1100]={0,},cnt=0,sum=0;
    scanf("%d",&n);
    for(i=0;i<=n;i++)
    {
        for(j=0;j<=n-i;j++)
        {
            for(k=0;k<=n-i-j;k++)
            {
                check[i+5*j+10*k+50*(n-i-j-k)]++;
            }
        }
    }
    for(i=1;i<1100;i++)
    {
        if(check[i]!=0)
        {
            cnt++;
            sum+=check[i];
        }
    }
    printf("%d %d",cnt,sum);
    return 0;
}

 

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

 

15971번: 두 로봇

2018년 강원도에서 새로운 동굴이 발견되었다. 이 동굴에는 총 N개의 넓은 방이 존재하며 좁은 통로로 서로 연결되어 있는 것으로 밝혀졌다. N개의 방은 1번부터 N번까지의 번호를 붙여 1번 방, 2번 방, …, N번 방으로 부른다. 통로는 정확히 N-1개가 발견되었는데, 각각 서로 다른 두 방 사이를 연결시켜 주며 중간에 다른 통로와 이어지는 경우는 없다고 한다. 또한 이 통로들을 이용하여 임의의 두 방 사이를 이동하는 것이 가능하며, 임의의 두 방 사

www.acmicpc.net

 

 

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
/*
5 1 5
1 2 1
2 3 2
3 4 3
4 5 4
*/
int vi[100010],max1,tot;
vector <pair<int,int>> v[100010];

void dfs(int s, int e, int lmax, int l)
{
    if(s==e) {
        max1=lmax;
        tot=l;
    }
    else{
        vi[s]++;
        for(int i=0;i<v[s].size();i++)
        {
            if(vi[v[s][i].first]==0)
            {
                int last=lmax>v[s][i].second?lmax:v[s][i].second;
                dfs(v[s][i].first,e,last,l+v[s][i].second);
            }
        }
    }

}
int main()
{
    int r,r1,r2,i,s,e,d;

    scanf("%d %d %d",&r,&r1,&r2);
    for(i=1;i<r;i++)
    {
        scanf("%d %d %d",&s,&e,&d);
        v[s].push_back(make_pair(e,d));
        v[e].push_back(make_pair(s,d));
    }
    dfs(r1,r2,0,0);
    printf("%d",tot-max1);
    return 0;
}

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

 

15973번: 두 박스

표준 입력으로 두 박스의 정보가 한 줄에 하나씩 주어진다. 각 박스의 정보는 왼쪽 아래 꼭짓점 좌표 (x1, y1)과 오른쪽 위 꼭짓점 좌표 (x2, y2)로 구성되는데 이들 좌푯값 x1, y1, x2, y2 (x1 < x2, y1 < y2)가 공백을 사이에 두고 주어진다.

www.acmicpc.net

 

 

https://www.acmicpc.net/problem/15973
두박스 - 정올 2018 년도 중등 전국
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int a1, b1, a2, b2, x1, y1, x2, y2,i;
    int j,arr[100][100]={0,},cnt=0,f=0,l=0,k=0,g=0;
    scanf("%d %d %d %d %d %d %d %d",
          &a1,&b1,&a2,&b2,&x1,&y1,&x2,&y2);

    i=a1>x1 ?a1 : x1;
    j=a2>x2 ? x2 : a2;
    f=j-i;
    k=b1>y1?b1:y1;
    l=b2>y2?y2:b2;
    g=l-k;
    printf("== %d  %d\n", f, g);
    if(f>0 && g>0) puts("FACE");
    if((f>0 && g==0) || (f==0 && g>0)) puts("LINE");
    if(f<0 || g<0) puts("NULL");
    if(f==0 && g==0) puts("POINT");
    return 0;
}

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

 

17618번: 신기한 수

평소에 수에 대한 관심이 많은 아이인 민철이는 오늘도 노트에 연필로 수를 더하거나 빼거나 곱하거나 나눠보면서 시간을 보내고 있다. 그러다가 18이라는 수는 신기한 성질을 가진다는 것을 알아냈다. 18을 이루는 각 자릿수인 1과 8을 합한 9는 18의 약수가 된다. 민철이는 18과 같이 모든 자릿수의 합으로 나누어지는 수를 여러 개 더 찾아냈는데, 12, 21도 그런 신기한 수였다. 민철이는 이렇게 모든 자릿수의 합으로 나누어지는 수를 “신기한 수”라고 부

www.acmicpc.net

 

 

 

#include<bits/stdc++.h>
using namespace std;

int sum; 
void Div_sum(int num)
{
    if(num == 0)
    {
        return;
    }

    sum+=(num%10);
    Div_sum(num/10);
}

int main(void)
{
    int n;
    int cnt=0;
    scanf("%d", &n);

    for(int i=1; i<=n; i++)
    {
        Div_sum(i);
        if((i%sum) == 0)
        {
            cnt++;
        }
        sum = 0;
    }

    printf("%d", cnt);

    return 0;
}

 

 

#include <bits/stdc++.h>
using namespace std;

int main() {
  int a;
  cin >> a;
  int cnt = 0;
  for(int i=1; i <=a; i ++)
  {
    int sum = 0;
    int temp = i;
    while(temp){
      sum = sum + temp%10;
      temp = temp / 10;
    }
    //cout << "== " << sum << "\n";
    if( i % sum == 0) cnt ++;
  }

  cout << cnt;
  
}

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

 

17619번: 개구리 점프

첫 번째 줄에 통나무 개수 N과 질문의 개수 Q가 주어진다. 다음 N개의 줄에 각 통나무에 x1, x2, y의 세 정수 좌표가 주어진다. 주어진 통나무는 두 점 (x1, y)와 (x2, y)를 잇는 형태이다. (x1 < x2) 모든 좌표는 0이상 109이하이다. 통나무들은 주어진 순서대로 1번부터 번호가 붙어 있다. 서로 다른 두 통나무는 (끝점에서도) 만나지 않는다. 다음 Q개의 줄에 서로 다른 두 통나무의 번호가 주어진다. (1 ≤ N ≤ 100,00

www.acmicpc.net

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
//2019 정올 2차 2번 문제 (중등)
struct s{
    int a,b,pos;
};
bool compare(struct s x,struct s y)
{
    //return x.a<y.a;

    if(x.a<y.a)
        return true;
    return false;
}
int main()
{
    int m,n,i,j,y,r1[1000000]={0,},r2[1000000]={0,},max1,k=0,t=0,z=0,flag=0;
    int g2[1000000];
    struct s log[1000000];
    scanf("%d %d",&m,&n);
    for(i=0;i<m;i++){
        scanf("%d %d %d",&log[i].a,&log[i].b,&y);
        log[i].pos=i+1;
        g2[log[i].pos] = log[i].pos;
    }

    for(i=0;i<n;i++)
        scanf("%d %d",&r1[i],&r2[i]);
    sort(log,log+m,compare);
    while(1)
    {
        max1=log[t].b;
        
        int group = g2[log[t].pos];
        for(i=t;i<m-1;i++)
        {
            if(log[i+1].a<=max1)
            {
                
                g2[log[i+1].pos] = group;
                if(log[i+1].b>max1)
                    max1=log[i+1].b;
            }
            else
                break;
        }
        t=i+1;
        k++;
        z=0;
        if(t>=m)
            break;
    }


    for(t=0;t<n;t++)
    {
        if(g2[r1[t]] == g2[r2[t]]) puts("1");
        else puts("0");
    }
    return 0;
}

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

 

1182번: 부분수열의 합

첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.

www.acmicpc.net

 

 

#include 
#include <bits/stdc++.h>
using namespace std;
/*
부분수열의 합
*/
int a[10000]={0,};
int main()
{
    int n,s,i,k,sum=0,cnt=0;
    scanf("%d %d",&n,&s);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(i=1;i<(1<<n);i++){
        sum=0;
        for(k=0;k<n;k++)
        {
            if(i&(1<<k))
            {
                sum+=a[k+1];
            }
        }
        if(sum==s)
            cnt++;
    }
    printf("%d",cnt);
    return 0;
}

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

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그 후 K줄에 걸쳐 이미 가지고 있는 각 랜선의 길이가 센티미터 단위의 정수로 입력된다. 랜선의 길이는 231-1보다 작거나 같은 자연수이다.

www.acmicpc.net

 

 

#include<stdio.h>

long long k;
long long Lan[20000];   //원소는 초기화 됨. 

long long div(long long len)   //len로 자르기. 
{
   long long sum = 0;
   
   for(int i=0; i<k; i++)
   {
      sum += (Lan[i]/len);
   }
   
   return sum;
}

int main(void)
{   
   long long n;
   long long max = 0;
   scanf("%lld %lld", &k, &n);
   
   for(int i=0; i<k; i++)
   {
      scanf("%lld", &Lan[i]);
      
      if(max<Lan[i])
      {
         max = Lan[i];   //최대 원소값 찾기 
      }
   }
   
   long long s = 1;
   long long e = max;   //mid의 범위를 1~최대 원소값까지로 고정. 
   long long mid;
   long long res; 
   long long res2 = -1; 

   
   while(s<=e)
   {
      mid = (s+e)/2;
      
      res = div(mid);   //res는 조각의 개수. 
      //
      if(res >= n)
      {
        if(res2 < mid) {
          res2 = mid;
        }
         s=mid+1;
      }
      
      else
      {
         e=mid-1;
      }
   }
   
   printf("%lld\n", res2);
   
   return 0;
}

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

 

10816번: 숫자 카드 2

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이가 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이수도 -10,00

www.acmicpc.net

upper bound와 lower bound을 구해서, "upper bound - lower bound" 하면 해당 검색 값의 개수를 구할 수 있다.

 

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,m,a[1000000]={0,},b[1000000]={0,},i,j,l,r,mid,cnt1=0,cnt2=0;
    scanf("%d",&m);

    for(i=0;i<m;i++)
        scanf("%d",&a[i]);
    scanf("%d",&n);
    for(j=0;j<n;j++)
        scanf("%d",&b[j]);

    //printf("222\n");
    sort(a,a+m);

    //printf("3333\n");
    l=0,r=m-1;
    for(j=0;j<n;j++)
    {
        //lower bound
        int lans = 0;
        while(l<=r)
        {
            mid=(l+r)/2;
            if(a[mid]==b[j])
            {
                lans = mid;
                r = mid-1;
            }
            else if(a[mid]>b[j])
                r=mid-1;
            else l=mid+1;

        }
        l=0,r=m-1;
        int uans = 0;
        while(l<=r)
        {
            mid=(l+r)/2;
            if(a[mid]==b[j])
            {
                uans = mid+1;
                l = mid+1;
            }
            else if(a[mid]>b[j])
                r=mid-1;
            else l=mid+1;

        }

        //if(l>r) printf("0 ");
        l=0,r=m-1;
        printf("%d ", uans-lans);
    }

    return 0;
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

부분수열의 합 - 1182  (0) 2020.03.01
랜선 자르기 1654번  (0) 2020.03.01
백준 - 숫자카드 : 10815번  (0) 2020.02.10
백준 : 1로 만들기 1463번  (0) 2020.02.09
백준 - 차이를 최대로 : 10819번  (0) 2020.02.09

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

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이가 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자 카드에 같은 수가 적혀있는 경우는 없다. 셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M개의 정수가 주어지며, 이

www.acmicpc.net

 

 

 

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,m,a[1000000]={0,},b[1000000]={0,},i,j,l,r,mid;
    scanf("%d",&m);

    for(i=0;i<m;i++)
        scanf("%d",&a[i]);
    
    scanf("%d",&n);
    for(j=0;j<n;j++)
        scanf("%d",&b[j]);

    //printf("222\n");
    sort(a,a+m);

    //printf("3333\n");
    l=0,r=m-1;
    for(j=0;j<n;j++)
    {
        while(l<=r)
        {
            mid=(l+r)/2;
            if(a[mid]==b[j])
            {
                printf("1 ");
                break;
            }
            else if(a[mid]>b[j])
                r=mid-1;
            else l=mid+1;

        }
        if(l>r) printf("0 ");
        l=0,r=m-1;
    }

    return 0;
}

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

 

1463번: 1로 만들기

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net

 

 

#include <bits/stdc++.h>
using namespace std;

int main()
{
    long long int n,a[1000001]={0,},i;
    scanf("%lld",&n);

    for(i=2;i<=n;i++)
    {
        a[i]=a[i-1]+1;
        if(i%2==0 && a[i] > a[i/2] + 1)
            a[i] = a[i/2] + 1;
        if(i%3==0 && a[i] > a[i/3] + 1)
            a[i] = a[i/3] + 1;
    }

    /*
    for(i=1; i<=n; i++)
        printf("%lld : %lld  \n",i, a[i]);
        */
    printf("%d", a[n]);
    return 0;
}

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

 

10819번: 차이를 최대로

첫째 줄에 N (3 ≤ N ≤ 8)이 주어진다. 둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 배열에 들어있는 정수는 -100보다 크거나 같고, 100보다 작거나 같다.

www.acmicpc.net

 

 

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,a[1000000]={0,},max1=0,i,tmp=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    do
    {
        for(i=1;i<=n-1;i++)
        {
            tmp+=abs(a[i]-a[i+1]);
            if(max1<tmp)
            {
                max1=tmp;
            }
        }
        tmp=0;
    }while(next_permutation(a+1,a+n+1));
    printf("%d",max1);
    return 0;
}

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

 

14002번: 가장 긴 증가하는 부분 수열 4

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.

www.acmicpc.net

아래 코드를 먼저 참고바랍니다.

https://coding-gongboo.tistory.com/38?category=829643

 

백준-가장 긴 증가하는 부분 수열 : 11053번 ( LIS)

https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50..

coding-gongboo.tistory.com

11053번 문제는 수열의 길이만 구하면 되지만, 14002문제는 수열을 표현해 주어야 한다.

 

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

int main()
{
    int n,i,a[1000]={0,},l[1000]={0,},j,ma=-1,k[1000]={0,},m;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=1;i<=n;i++)
    {
        l[i]=1;
        k[i]=i;
        for(j=1;j<i;j++)
        {
            if(a[j]<a[i])
            {
                //l[i]=l[i]>l[j]+1 ? l[i] : l[j]+1;
                if(l[i] < l[j]+1)
                {
                    l[i] = l[j]+1;
                    k[i]=j;
                }
            }
        }
       // ma=ma>l[i]?ma:l[i];
        if(ma<l[i]){
            ma=l[i];
            m=i;
        }
    }
    printf("%d\n",ma);
    l[1] = a[m];
    for(i=2;i<=ma;i++)
    {
        l[i]=a[k[m]];
        m = k[m];
    }
    for(i=ma;i>0;i--)
        printf("%d ",l[i]);
    return 0;
}

+ Recent posts