목록백준 (159)
피너클의 it공부방
https://www.acmicpc.net/problem/15661 그냥 전부 만들어 보면 되는 문제였다. for (int i = 1; i > s[i][j];전부 입력받아준다. 이때 0부터가 아닌 1부터 입력을 받아줬다.vector start, link;start팀과 link팀을 벡터로 만들고 번호를 넣었다 뺐다 반복할 것이다.int cal(int b) { int sum = 0; if (b == 0) { if (start.size() == 0) return 987654321; for (int i = 0; i 각 팀의 총 능력치를 구하는 함수다.if (start.size() == 0) return 987654321;for (int i = 0; i 중요한건 어떻게 계산하냐는 건데 일단 만약 팀의 크기가..
https://www.acmicpc.net/problem/1094 수학문제다.우리가 만들수 있는 막대기의 길이는 64 32 16 8 4 2 1 즉 2의 제곱숫자들이다.이 숫자들로 x길이의 막대기를 만들어야한다. int s = 64; int ans = 0; while (x > 0) { if (x >= s) { x -= s; ans++; } s /= 2; } cout x를 계속해서 뺀다.64보다 크거나 같으면 64로 빼고 32보다 크거나 같으면 32로 빼고이를 반복하다보면 결국 x는 0이 되고 반복문은 종료된다.뺀 횟수를 ans에 넣고 마지막에 ans를 출력하면 된다. #include using namespace std;int x;int main(){ ios::sync_with_stdio(0)..
https://www.acmicpc.net/problem/11723비트 연산자를 사용하는 문제다. 문제를 보면 S에 1 ~ 20을 넣어야 한다. 중요한게 1~20 인 것이다. 0~ 19 가 아닌 1 ~ 20 이다.s = (1 그렇기에 1에서 21만틈 옆으로 shift해주었다. add x: S에 x를 추가한다. (1 ≤ x ≤ 20) S에 x가 이미 있는 경우에는 연산을 무시한다.shift 연산자 ( s가 0000 0001 이고 4만큼 shift해야 하면 4칸 옮긴 0001 0000이 되는 것이다.0110 0011 에서 4만큼 shift를 하면 1000 1100이 된다. | 는 두 정수중 비트가 하나라도 1 이면 1로 남겨둔다. 아래처럼 말이다.1110 01000000 0010 |--------------..
https://www.acmicpc.net/problem/2902 2902번: KMP는 왜 KMP일까? 입력은 한 줄로 이루어져 있고, 최대 100글자의 영어 알파벳 대문자, 소문자, 그리고 하이픈 ('-', 아스키코드 45)로만 이루어져 있다. 첫 번째 글자는 항상 대문자이다. 그리고, 하이픈 뒤에는 반드 www.acmicpc.net 간단한 구현 문제다. #include #include using namespace std; string str; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> str; cout
https://www.acmicpc.net/problem/10974 10974번: 모든 순열 N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오. www.acmicpc.net dfs로 풀었다. void solve(int idx, vector v) { if (idx == n) { for (int i = 0; i < n; i++) cout
https://www.acmicpc.net/problem/1707 1707번: 이분 그래프 입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V와 간선의 개수 E가 빈 칸을 사이에 www.acmicpc.net bfs를 이용해 풀었다. 이분 그래프란 무엇인가 위와 같은 그래프다. 이웃한 정점끼리는 색이 절대로 같지 않다. 위의 그래프는 1과 2가 이웃하지만 서로 색이 같으니 이분 그래프가 아니다. int v, e; int color[20001]; vector graph[20001]; 사용할 변수들이다. color[i]는 i번째 정점에 들어있는 색이고 graph[i]는 i에 이웃한 정점을을 저장한다. in..
https://www.acmicpc.net/problem/10819 10819번: 차이를 최대로 첫째 줄에 N (3 ≤ N ≤ 8)이 주어진다. 둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 배열에 들어있는 정수는 -100보다 크거나 같고, 100보다 작거나 같다. www.acmicpc.net 백트래킹 문제다. cin >> n; for (int i = 0; i > arr[i]; memset(visited, false, sizeof(visited)); int ans = solve(vector()); cout n; for (int i = 0; i > arr[i]; memset(visited, false, sizeof(visited)); int ans ..
https://www.acmicpc.net/problem/2003 2003번: 수들의 합 2 첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다. www.acmicpc.net 투 포인터 문제다. int n, m; int arr[10001]; 사용할 변수다. cin >> n >> m; for (int i = 0; i > arr[i]; int ans = 0, sum = 0; int start = 0, end = 0; 값들을 입력받는다. start와 end는 투 포인터에서 사용할것이다. while (end ..
https://www.acmicpc.net/problem/2644 2644번: 촌수계산 사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어 www.acmicpc.net 브루트포스를 이용해 풀었다. int n, m; int a, b; bool visited[101]; vector v[101]; 사용할 변수다. cin >> n; cin >> a >> b; cin >> m; memset(visited, false, sizeof(visited)); for (int i = 0; i > a >> b; v[..
https://www.acmicpc.net/problem/1717 1717번: 집합의 표현 첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는 www.acmicpc.net 유니온 파인드 문제다. int n, m; int parent[1000001]; 사용할 변수다. parent[5] = 10이라면 5의 조상이 10이라는 의미다. parent[i] = j이라면 i의 조상이 j이라는 의미다. int find(int u) { if (u == parent[u]) return u; return parent[u] = find(paren..