일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Computer science
- 문제풀이
- 알고리즘
- 정석학술정보관
- 스택
- 코딩
- 오퍼레이팅시스템
- 코테
- cs
- 정석
- 그래프
- Stack
- 컴퓨터공학과
- 너비우선탐색
- 오에스
- 백준
- 자료구조
- c++
- Operating System
- coding
- 구현
- 컴공
- 개발
- bfs
- vector
- OS
- DP
- 브루트포스
- 컴공과
- 북리뷰
- Today
- Total
목록백준 (160)
Little Jay
괄호의 쌍을 검사하는 것이다 앞에서 비슷한 문제가 있긴 했었는데, 이번 문제는 소괄호와 대괄호 두 개의 서로 다른 괄호들을 사용했다. 각각의 괄호의 쌍이 맞는지 스택을 사용해서 검사하는 문제. #include #include #include using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); string s; while (getline(cin, s)) { if (s[0] == '.' && s.length() == 1) break; stack braces; bool flag = true; for (int i = 0; i < s.size(); i++) { if (s[i] == '(') { braces.push('('); } ..
algorithm 헤더에는 sort라는 기능이 있는데 그 기능에 약간 손을 봐주면 되는 문제 sort 기능에 마지막 세 번째에 함수를 넣어 주어서 그 함수의 return값대로 정렬을 하면 되는 문제이다 이번 문제에서는 compare이라는 함수를 사용해서 단어의 길이를 비교해주어 sort하도록 유도했다 #include #include #include #include using namespace std; bool compare(string a, string b) { if (a.size() == b.size()) { return a > n; string s, temp; vector v..
#include #include #include using namespace std; int main() { int n, money; cin >> n >> money; int temp = 0; int x; vector v; for (int i = 0; i > x; v.push_back(x); } sort(v.begin(), v.end()); while (n--) { int coin = v[n]; if (money - coin >= 0) { while (money - coin >= 0) { money -= coin; temp++; } } } cout
이 문제는 문제 자체를 이해하는데 많이 시간이 소요되었다 결론부터 말하자면 pop()으로 나오는 숫자들이 처음의 배열과 똑같이 되는 경우를 찾고, 아닌경우는 NO를 출력하면 되는 것이다 문제를 조금 친절히 설명해주면 좋겠지만 문제를 분석하는 것도 결국 능력이기에...... #include #include #include using namespace std; int main() { stack st; int n, x; cin >> n; vector v; int max = 0; while (n--) { cin >> x; if (x > max) { for (int i = max + 1; i
이렇게 푸는 것이 맞는지는 모르겠지만 풀이를 설명하자면 먼저 ( 가 들어올 때 스택에다가 push를 해준다 만약 ( 가 들어오고 다음게 ) 면 레이저를 쏴주야 하기 때문에 스택의 사이즈만큼 계속 더해준다 만약 그것도 아니고 ) 만 들어온다면 마지막에는 하나씩 남는 막대가 생기기 때문에 하나씩 total 개수에 더해준다 #include #include #include using namespace std; int main() { string s; cin >> s; stack st; int total_bar = 0; for (int i = 0; i < s.size(); i++) { if (s[i] == '(' && s[i + 1] == ')') { total_bar += st.size(); i++; conti..
stack 자료구조를 사용하면 쉽게 풀 수 있는 문제 문제를 풀다가 utility 헤더에 있는 make_pair을 처음에 이용했는데 이게 segmentation error를 발생시켰다 구글링을 해보니까 이게 허용되지 않은 메모리 영역에 접근을 시도하거나, 허용되지 않은 방법으로 메모리 영역에 접근을 시도할 경우 발생한다고 한다. 왜 발생하는지는 모르겠지만,make_pair을 사용하는 것을 포기하고 대괄호로 묶에서 push하는 방법으로 하니까 맞았다.고수님들 계시면 이게 왜 발생하는지 알려주시면 너무 감사하겠습니다...... #include #include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.t..
조금만 입체적으로 생각하면 되는 문제이다. stack의 선입선출의 구조를 생각하면 되는 문제인데, 단순히 마지막에 있는 막대기보다 큰 막대기를 세는 것이 아니라 막대기의 앞뒤를 비교하면 쉽게 풀 수 있다. #include #include using namespace std; int main() { int n; cin >> n; stack st; for (int i = 0; i > x; st.push(x); } int temp = st.top(); int count = 1; while (!st.empty()) { if (st.top() > temp) { temp = st.top(); count++; } st.pop(); } cout
왜인지는 모르겠지만 이걸 푸는데 좀 오래 걸렸다 종말의 숫자란 666 1666 2666 3666 4666 5666 6660 6661 6662 .... 7666 이렇게 666이 연속으로 들어가 있는 숫자를 말한다 문제 자체도 Brute Force 알고리즘으로서 처음 시작인 666부터 올라가야 한다 여기에 대해서 패턴이 없으므로 1을 더해주면서 값을 찾아야 한다 string의 to_string이랑 find 기능을 쓰면 생각보다 편한 문제 #include #include using namespace std; int main() { int n; int count = 0, end_num = 666; cin >> n; string s; while (true) { s = to_string(end_num); if (s..
앞의 글을 참조해야 한다 피사노 주기를 통해서 어떤 피보나치 수를 1000000으로 나눈 주기는 1500000이다. 따라서 n에 어떤 수가 들어오더라도 n mod 1500000의 값만 찾으면 된다. 또한 미리 피보나치 배열을 하나 만들어 놓으면 메모리 누수가 적을 것이다. #include #include using namespace std; long long a[1500010]; void fibo() { a[0] = 0; a[1] = 1; for (int i = 0; i > n; fibo(); cout
백준 2749번 피보나치3을 풀기 전에 이 문제를 풀고가야 한다는 것을 알게 되었다 피사노 주기라는 것은 피보나치 수열을 m으로 나눈 나머지가 주기를 이룬다는 것을 의미한다. 주기를 생각할 때 다시 돌아오는 것은 1, 그 전의 것은 0이 되면 된다. 그리고 list에 넣을 때 피보나치 수를 직접 넣는 것이 아니라 나머지 연산이 된 값을 집어넣어야 하는 것을 주의하면 될 것 같다. #include #include using namespace std; int main() { int t; int n, m; cin >> t; for (int i = 0; i > n >> m; vector fibo_list; fibo_list.push_back(0); fibo_list.push_bac..