전체 글 139

1107_리모컨

이 문제에서 key는 모든 채널을 체크해보는 브루트포스 방식을 사용하는 것이다. 나는 시험칠 때 모든 채널을 체크해볼 것을 생각해보지 못했다. 모든 채널을 체크하고 그 채널이 가능하면 몇 번 클릭하는지 계산하고 최솟값을 찾아내면 되는 것이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 #include using namespace std; bool broken[10]; // 나올 수 있는 채널인지 확인하는 함수. // 만약 나올 수 없는 채널이면 0을 반환, // 나올 수 있는 채널이면 그 채널의 길이를 반환한다. int ch..

개발/알고리즘 2020.11.29

11724_연결요소의 개수

연결요소의 정의는 다음과 같다. A graph that is itself connected has exactly one component, consisting of the whole graph. Components are also sometimes called connected components. 한 요소로 연결된 그래프는 전체 그래프를 구성하기 위한 요소로 있는데, 이 요소는 연결요소라고 불린다. 쉽게 말해 연결된 그래프는 각각 하나의 연결 요소이다. 즉 이 그림에서는 3개의 연결 요소가 있다. 중요한 것은 점 한 개도 하나의 연결 요소라고 할 수 있다. 나는 그 점들을 처리를 안해줘서 많은 실패를 하였다. 저 연결요소를 찾는 것은 BFS를 이용해서 찾을 수 있다. 시작점에 대해 고민이 있었는데, 처..

개발/알고리즘 2020.11.27

11576_Base Conversion

A진법을 10진법으로 바꾸고, 10진법을 B진법으로 바꾸어 해결하는 문제이다. 나같은 경우 조건이 A진법의 자릿수가 25이하라는 것을 보고 당연히 10진법으로 바꾸지 않고 해결하는 방법이 있는 줄 알았으나 문제 말미에 "A진법으로 나타낸 수를 10진법으로 변환하였을 때의 값은 양의 정수이며 220보다 작다." 이라는 말이 있었다. 그래서 그냥 일반적인 진법 변환 코드를 만들어 해결해주었다. 1 2 3 4 5 6 void convertDecToB(int n, int base){ if(n == 0) return; convertDecToB(n / base, base); cout b >> len; num = 0; for(int i = 0; i > val; num = num * a + val; } convertD..

개발/알고리즘 2020.11.27

6588_골드바흐의 추측

소수 구하기 살짝 응용이 된 문제로, N^2의 방법으로는 이 문제를 풀 수 없다. 문제를 간단히 설명하자면, 4보다 큰 짝수는 모두 소수의 합으로 표현 될 수 있다는 골드바흐의 추측을 근거로 짝수를 소수의 값으로 표현해보는 것이이다. 이 때 짝수 n의 범위는 6 ≤ n ≤ 1000000 이다. 그러므로 시간초과를 피하기 위해서는 O(n)으로 해결해야 한다. 우선, 에라토스테네스를 통해 1000000까지의 소수값을 한 번에 구한다. 나는 모르고 n을 할 때마다 소수값을 구해서 굉장히 오랜 시간이 걸렸는데 미리 소수값을 구해놓으면 시간이 더 이상 들지 않는다. 그럼 이제 에라토스테네스의 시간복잡도를 고려했야 하는데 에라토스테네스의 시간 복잡도는 O(n log log n) 이라고 한다. (https://en...

개발/알고리즘 2020.11.26

1373_이진수팔진수

이 문제는 2진법에서 10진법으로 10진법에서 8진법으로 변환하는 문제가 아니라, 2진법에서 8진법으로 바로 바꾸는 방법이다. 왜냐하면 이진법의 길이가 1,000,000이기 될 수 있기 때문에 10진법으로 변환하면 큰일난다. 바로 바꾸는 방법은 진법 만큼 2^n 진법 만큼의 개수로 이동해주면 된다. 1234567891011121314151617181920212223242526272829#include#include#include#include using namespace std; int main(void){ vector nums; vector res; string n; int ans, i; cin >> n; for(char c : n) nums.push_back(c); reverse(nums.begin(..

개발/알고리즘 2020.11.21

2745_진법변환

www.acmicpc.net/problem/2745 2745번: 진법 변환 B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 www.acmicpc.net 진법 변환 된 것을 10진법 수로 바꾸는 것이다. 정말 간단한 문제이지만 (기존 진법)^n으로 바꾸지 못해서 어려움을 겪었다. 123456789101112131415161718192021#include#include using namespace std; int main(void){ string s; int b, ans, len, i; cin >> s >> b; ans = 0; i = 0;len = 0; for(c..

개발/알고리즘 2020.11.18

10799_쇠막대기

www.acmicpc.net/problem/10799 10799번: 쇠막대기 여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저 www.acmicpc.net '(', ')' 를 이용하여 스택을 쌓는 문제이다. 정석은 스택을 이용하는 것이기에 스택을 이용하여 해주었다. 나는 스택 라이브러리를 사용하였는데 사람들이 해놓은 것을 보니 배열로 count 만 해주면 되기에 배열로 해줘도 되어보였다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include #include #include using namesp..

개발/알고리즘 2020.11.16

10866_덱

www.acmicpc.net/problem/10866 10866번: 덱 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 www.acmicpc.net 자료구조 중 하나인 덱을 구현하는 문제이다. 덱 라이브러리를 사용해서 풀어도 되고 직접 풀어도 된다. 나는 라이브러리를 사용했다. 라이브러리를 사용하면 쉽게 풀 수 있다. 더보기 데크는 벡터( vector) 에서 제공하는 많은 기능을 제공해준다. 하지만, 데크의 경우 벡터와는 다르게 양쪽 끝 모두에서 원소의 효율적인 추가와 삭제가 가능하다. 하지만, 벡터와는 달리 데크는 모든 원소가 메모리 상에..

개발/알고리즘 2020.11.16

1158_요세푸스문제

www.acmicpc.net/problem/1158 1158번: 요세푸스 문제 첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000) www.acmicpc.net 요세푸스 문제이다. n명 중 k번째 있는 사람을 탈락시키면서 탈락 된 순서대로 큐에 넣는 형태이다. 생각보다 꼬여서 다시 한 번 생각했다. 1) n이랑 k가 같을 때 2) n이 k보다 작을 때 를 고려해야 한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #include #include using namespace std; vector yp; int cnt[5001]; ..

개발/알고리즘 2020.11.15

11656_접미사배열

www.acmicpc.net/problem/11656 11656번: 접미사 배열 첫째 줄에 문자열 S가 주어진다. S는 알파벳 소문자로만 이루어져 있고, 길이는 1,000보다 작거나 같다. www.acmicpc.net 문자열에 대한 함수를 활용하면 쉽게 풀 수 있다. substr로 시작점을 다르게 해서 문자열 그룹에 넣고 문자열 그룹을 정렬해주면 된다. 전체코드 12345678910111213141516171819202122232425#include#include#include#include#include using namespace std; string s; int main(void){ int len; vector sgroup; cin >> s; len = 0; for(char c : s) len++;..

개발/알고리즘 2020.11.15