>문제 > 핵심 큐 >풀이과정 문제를 읽어보니,, 스택이나 큐를 사용해야 할 것 같다는 느낌이 왔다. 제일 위에 있는 값을 뽑아 제일 아래로 넣는 과정을 봤을때 큐가 더 적합하다는 생각에 큐로 풀었다. 선입선출! 근데 문제를 풀면서 두개의 난관이 있었다. 1. 50만칸이나 되는 배열 선언? 처음에는 main() 부분에 Queue를 만들어 사용하려 했다. 그런데 그 경우에는 다음과 같은 에러메세지가 뜬다. - 이 경고는 미리 설정된 임계값을 초과하는 스택 사용량이 함수에서 검색되었음을 나타냅니다. ~~ 문제를 해결하려면 일부 데이터를 힙 또는 다른 동적메모리로 이동할 수 있습니다. 그럼 우리는 50만칸짜리 배열을 결국 만들 수 없는것일까?? 아니다. 지역변수가 아니라 전역변수에서 배열을 선언하면 50만칸짜..
>문제 > 핵심 최빈값 출력 시간복잡도 O(n^2) 사용 X -> (이중반복문 X) 반올림 >풀이과정 쉬울줄 알았는데.. 최빈값 출력때문에 골탕먹었다. 1. 산술평균 N개의 수들의 합을 N개로 나는 값. 그냥 우리가 평소에 나누기 하는 방식이 산술평균이다. 이거 보니까 이 문제랑 관련은 없는데 고딩때 배운 산술기하 평균이 생각나서 다시 한번 찾아봤다. · 산술평균 (Arithmetic mean) -> 합의 평균, 우리가 평소에 평균내는 일상적인 방식 · 기하평균 (Geometric Mean)-> 곱의 평균, 비율평균, 각 요소를 곱한 후 n 제곱근을 씌운 값. 물가상승률이나 투자 수익률 계산에 쓰인다. 비트코인에 100만원을 투자하고 20% 수익을 낸 이후에 다른 코인에 투자했다가 20% 손실을 봤다고 ..
>문제 > 핵심 반복문 돌기. 효율적인 알고리즘을 강구해보자. >풀이과정 [소수 : 1과 자기 자신만으로 나누어 떨어지는 1보다 큰 양의 정수. ] 소수 찾기 알고리즘 기본서에 꼭 나오는 내용으로 기억한다. 물론 나는 다 까먹었지만. 소수를 찾는데는 여러 전략이 있다. 제일 쉬운건 역시 2부터 n-1까지 일일히 나머지를 해보는것. 코드는 간단하지만 만약 수가 커진다면 시간적으로 그닥 효율적이지 못하다. 나도 기억이 가물가물해서 구글링으로 찾아봤다. 1. 절반까지만 반복문 돌기 소수는 1과 자기자신만으로 나누어 떨어지는 수이므로, 약수가 1과 자기자신 밖에 없다. 24는 약수로 1, 2, 3, 4, 6, 8, 12, 24 를 갖는다. 그리고 1과 24, 2와 12, 3과 8, 4와 6은 하나의 짝을 이루어..
>문제 > 핵심 이진탐색 알고리즘! >풀이과정 어떻게 풀까 고민하다가.. 문제에서 정수의 범위를 -2^31 ~ 2^31 로 정해놓은 걸 보고 [+] 정수를 보관하는 배열이랑 [-] 정수를 보관하는 배열 두개를 만들어서 따로 저장한 다음, 반복문을 돌리면서 값을 찾으면 시간이 절반만 걸리지 않을까 싶어서 구현해봤는데 다행히 맞았다고 떴다. 근데 이런식으로 짜면 아무래도 낭비되는 공간이 많아서 좋은 알고리즘이라고 하기는 어려울 것 같다. 그래서 예전에 배웠던 이진탐색트리를 구현해 탐색하는 코드를 짜기로 했다. 예전에 수업시간때 배웠던 코드를 다 기록으로 남겨놨더니 복습하는데 정말 큰 도움이 된다. 그래서 이 블로그를 쓰는거기도 하고.. 기록을 남겨놓으면 언젠가는 도움이 되겠지. 이진탐색트리의 성능은, 최선의..
>문제 > 핵심 정렬을 잘하자 >풀이과정 오늘 정렬문제만 주구장창 푸는 것 같다. 풀다보니 비슷한 유형의 반복이라는 느낌이 든다. 역시 문제를 많이 접해봐야 어떻게 해결해야 할지에 대한 느낌도 빨리빨리 오는 것 같다. 이것도 qsort 함수를 이용해 바로 풀었다. 다른 문제와 같이 크게 어렵지 않았다. 11650번 문제랑 11651번 문제랑 조건만 살짝 달라서 그냥 한 페이지에 같이 묶었다. >깨달은점 문제를 많이 풀어봐야 유형파악도 빨리 되고 감이 잘 잡힌다. 앞으로도 열심히 풀어보자. >코드 #define _CRT_SECURE_NO_WARNINGS #include #include typedef struct { int x; int y; }coord; int compare(const void* first..
>문제 > 핵심 - 모든 값을 배열에 저장할 필요가 없다. - "이 수는 10,000보다 작거나 같은 자연수이다" >풀이과정 지금껏 qsort나 합병정렬, 버블정렬같은 학교에서 배운 정렬만 쓰던 나에게 엄청난 깨달음을 주게하는 문제다.. 평소에 하던대로 값을 배열에 모두 입력받은 후에 통으로 정렬을 하게되면 시간초과 혹은 메모리초과가 필연적으로 발생하게 된다. 힌트는 "이 수는 10,000보다 작거나 같은 자연수이다" 에 있다. 10,000보다 작은 자연수. 10,000칸 짜리 int 배열을 만든 후(0으로 모두 초기화), [입력받은 값 - 1]의 인덱스를 찾아 해당 값을 +1 해주는 방식을 떠올렸다. 솔직히 풀긴 풀었지만 힌트 안봤으면 나도 이런 생각을 전혀 못했을 것 같다. 틀에박힌 사고방식을 벗어나..
>문제 > 핵심 구조체 정렬 >풀이과정 구조체로 나이, 이름, 인덱스(가입순번)을 묶어 입력받은 다음, qsort를 이용해 정렬했다. 삽입정렬이나 선택정렬으로 짰으면 이중반복문을 돌면서 두가지 조건을 만족하는지 고려하면서 짜야해서 조금 생각이 많이 필요했을 텐데 qsort 함수는 그런게 필요없으니까 너무 쉽고 편하다. 그래도 내장함수만 쓰면 그러니까 선택정렬로 짜봤는데 시간초과가 떴다. 선택정렬은 O(n^2) 의 시간이 걸려서 그런 것 같다. 답은 맞게 나오니 뭐 공부한 셈 치자 >깨달은점 qsort는 빛이다 >코드 #define _CRT_SECURE_NO_WARNINGS #include #include typedef struct { int age; int idx; char name[101]; }memb..
>문제 > 핵심 반복문 돌면서 일일히 비교하기 >풀이과정 구조체로 몸무게, 키, 등수를 묶어서 값을 입력받고, 이중반복문을 돌면서 나보다 덩치가 큰 사람이 있으면 등수를 +1 한다. 크게 어렵지 않은 문제였다. >깨달은점 이 문제가 초등부 문제라는데에 충격받았다. 초등학생도 푸는걸 대학생이 못풀면 진짜 망신 망신 개망신당할 것 같다.. 공부 열심히하자.. >코드 #define _CRT_SECURE_NO_WARNINGS #include typedef struct { int weight; int height; int rank; }student; int main() { int i, j, n; student list[50]; scanf("%d", &n); for (i = 0; i < n; i++) { scanf..