본문 바로가기

Problem Solving

(24)
[LeetCode] SQL I Study Plan - Day 1. Select ( 리트코드 SQL 1 - 1일차 ) 리트코드 study plan 중 SQL I 을 시작했다. study plan의 무서운 점은 매일 문제가 열리는데, 하루라도 건너뛰면 이전에 풀었던 날들이 다 리셋 되어서 잠겨버린다는 점,,, (그러면 처음부터 다시 시작해야 한다. ^^) 그렇기에 한번 시작하면 꾸준하게 한다는 마음가짐을 가지고 해야한다. 1일차 후기 - 간단한 SELECT 만 쓰는 쿼리들이어서 어렵지 않았다. 그렇지만 다음의 개념을 몰랐다면 시간이 걸렸을 것 같다. - 테이블 조인하기 - 결과값으로 기존 컬럼 이름이 아닌 새로운 컬럼 이름을 부여하기 - null 값도 검색 조건에 포함하고 싶다면 is null로 조건 주기 - join 시 테이블의 컬럼이 합쳐질 때 빈 값은 null 로 들어감 여기서부터는 내가 제출한 답 595. Big ..
[Kotlin] 코틀린 중복된 횟수 구하기 기존에는 C++ 만 사용했는데 컬렉션을 잘만 활용한다면 코틀린이 정말 편한것 같다. 그러나 여전히 모든걸 스트링으로 읽어와야한다는것,,, 아직 불편하다. 입력받거나 배열 생성해주는건 아직까지 C++ 이 더 익숙하다. 코틀린으로 할때마다 매번 찾아봐서 안까먹기 위해 정리한다. 코틀린 컬렉션 활용하기 GropuBy IntArray.groupBy를 살펴보면 다음과 같다. public inline fun IntArray.groupBy(keySelector: (Int) -> K): Map { return groupByTo(LinkedHashMap(), keySelector) } 주어진 keySelector function이 돌려주는 값들을 key값으로 하고 key값과 매칭되는 원소들을 list로 가지는 맵을 돌려..
modular 연산 이용 a / b 형식에서 몫과 나머지를 이용하는 계산의 경우 3으로 나눈다고 가정했을 때 이 식을 int ans = n * m / 3; if( n * m % 3) ans++; 이렇게 사용할 수 있다. int ans = (n * m + 2) / 3​ // ( 나누는 수 - 1 ) 만큼의 값을 더해서 나누면 원하는 값을 한번의 나눗셈 연산으로 구할 수 있다. 탐색 문제에 자주 나오는 4방향 direction의 경우 상하좌우 방향을 사용해야하는 경우 이렇게 사용할 수 있다. int dir = 0; // 방향 dir = ( dir + 1 ) % 4; // 0, 1, 2, 3, 0, 1, 2, 3... 이 반복된다 3, 2, 1, 0 의 순서로 돌려면 다음과 같이 하면 된다. int dir = 0; // 방향 dir ..
modular 연산 특징 백준 문제를 풀다보면 값이 커질 경우 모듈러 연산을 하여 작아진 값을 답으로 제출해야 하는 경우가 있다. 덧셈, 뺄셈, 곱셈이 모듈러와 섞였을 때 이전까지는 감만 알고 썼는데 한번 짚어보고 가는것도 좋을 것 같다. 1. (a + b) % M = ((a % M) + (b % M)) % M 2. (a - b) % M = ((a % M) - (b % M)) % M 3. (a * b) % M = ((a % M) * (b % M)) % M 같이 풀어볼 만한 문제 https://www.acmicpc.net/problem/15829 15829번: Hashing APC에 온 것을 환영한다. 만약 여러분이 학교에서 자료구조를 수강했다면 해시 함수에 대해 배웠을 것이다. 해시 함수란 임의의 길이의 입력을 받아서 고정된 길..
[분할정복][이진검색] Binary Search 이진 검색 (Binary Search) 정렬된 리스트에서 빠른 시간 안에 찾을 수 있는 방법. 시간복잡도 : O(logN) 정렬된 Arr 길이 : N 찾고자 하는 원소 : Target * 실수한 부분 : start, end 값을 갱신할 경우 mid + 1 혹은 mid - 1 을 해야한다. 그렇지 않으면 무한루프를 돌게 된다. start = 0; end = N-1; while(start target) end = mid - 1; else start = mid + 1; }
[백준] 1966: 프린터큐 프린터큐가 날 눈물짓게 해... 생각보다 구현이 사나워서 해답을 찾아보니 priority queue를 사용한 풀이가 나왔다. 그런데 생각보다 priority queue로 해결하는 것이 아닌, queue, priority queue를 2개 다 쓰길래 그냥 queue, vector로 구현했다. 원래는 priority queue에서 pair로 받아서 compare하는 부분을 정의해서 queue하나로 다 완성하고 싶었는데 우선 compare부분을 내가 정의하려고 하는것에서 실패했고, 출력순서를 신경써야 하기 때문에 한 큐에 해결이 불가능하긴 했다. priority_queue 쓰는거랑, vector에 저장해서 sort 하는거랑 큰 차이가 있는지는 모르겠다. (둘 중에 뭐가 더 빠를까?) 내가 짠 코드 #inclu..
[c++] using namespace std;를 쓰는게 왜 나쁜 습관인가요? using namespace std; 보다 std::cout, std::cin 사용을 권장한다. > 설명 당신이 foo와 bar이라는 이름을 가지 두개의 라이브러리를 사용한다 하자. foo에서는 blah()를 bar에서는 quux()를 사용한다고 하자. 그런데 어느날 bar 라이브러리가 업데이트 되어 blah()가 추가 되었다고 하자. 당신이 만약 bar의 blah()를 사용하려 한다면 수정에 꽤 많은 시간을 들여야 할 것이다. 아래와 같이 사용하였다면 수정할 필요가 없었을 것이다. using namespace foo; using namespace bar; foo:blah(); bar:blah(); bar:quux(); 출처 : stackoverflow.com/questions/1452721/why-is..
[백준] 1406번: 에디터 백준 문제는 시간초과나 메모리초과에 신경을 써야하는게 많은 것 같다. 이번 문제도 string과 cursor위치를 int로 체크해주면서 했더니, 시간초과가 떠서 list로 구현. 데이터의 삭제나 추가가 번번히 일어나는 경우는 string 보다는 list가 효과적이라는 사실을 깨달음. C++에서 list는 많이 안써봐서 낯설다. 내가 짠 코드 #include #include #include #include using namespace std; int main(void){ int N,i; char op[4]={'L','D','B','P'}; list data; list::iterator cursor = data.end(); string input,operand; getline(cin,input); for(i..