
백준 14238번을 풀면서 깨달은 점에 대해 정리.https://www.acmicpc.net/problem/14238 보통 DP를 쓸 때에는 dfs 재귀함수와 조합하는 편이고,그리고 (나의 경우에만 국한되는지는 모르나) dfs 재귀는 보통 top-down 방식을 단순하게 짜기 위해 사용한다.아주 대표적인 예로 피보나치 수열을 dfs로 구현할 때의 dp 사용이 여기에 해당하겠다.그런데 꼭 재귀방식의 dfs가 top-down으로만 사용되지는 않고 bottom-top 방식으로도 충분히 사용 가능하다백준 14238번 문제의 경우 bottom-top으로 구현할때 dp가 해야하는 역할은 아래와 같다 그냥 개념적으로는 당연히 반대로 적용하면 되는데 코드 적용 시 직관적으로 이해가 가지 않았던 부분이었는데이게 이제야 ..

I. 데이터 모델링의 이해1. 데이터 모델링의 이해3. 데이터 모델링 유의점 헷갈리는 거비유연성 : 프로세스와 데이터의 정의를 분리비일관성 : 데이터와 데이터 간 상호 연관 관계 명확히 정의 - 프로세스와 테이블의 연계성을 낮춰야 함5-6. 데이터베이스 스키마 구조 헷갈리는 거외부 스키마 : 여러 사용자 관점, View (외뷰..로 외우자)개념 스키마 : 통합 사용자 관점, 모든 사용자 관점12. 발생시점 기준의 엔티티 분류 : 기본 > 중심 > 행위 (기중행)30. 비식별자 관계, 식별자 관계식별자 관계비식별자 관계강한 연결관계약한 연결관계자식 주식별자에 포함자식 일반속성에 포함실선점선반드시 부모 엔터티에 자식이 종속됨자식 주식별자 구성에 부모 주식별자 포함 필요상속받은 주식별자 속성을 타 엔터티에 이..
요약재귀 + dp풀이과정시간복잡도를 보기위해 최악의 경우를 본다면 숫자 2000, 질문 100만이며 0.5초를 요구한다.숫자 2000 기준으로 본다면 O(n^2)는 가능한 범위에 들어온다.즉 2중 반복문으로 모든 숫자에 대해 팰린드롬인지 아닌지를 확인하고 이를 저장한다면이후 무슨 질문이 나오던지간에 O(1)으로 팰린드롬 여부를 확인할 수 있기 때문에 위배되지 않을 것이다. 모든 숫자의 조합에 접근하는 순간 O(n^2)를 충족하기 때문에범위에 대한 펠린드롬 파악 방법은 무조건 O(1)이어야 함.이는 팰린드롬의 특성을 고려하면 쉽게 해결가능하다. 일단 dp[n+1][n+1](1부터 시작하니까..)에 저장한다고 치고 질문에서 요구하는 답의 형식(1:팰린드롬임, 0:팰린드롬아님)으로 보면숫자가 1개일때 -> 1..
요약bottom-up 방식이면 O(n)으로 가능하고, top-down이면 O(n^2)풀이과정일단 시간복잡도를 가늠해보면 n은 150만이다.O(n^2) 불가능하고, O(nlongn), O(n)정도 가능해 보인다. 수익의 최대는 일단 고려하지 않는다면, 아래와 같이 생각할 수 있다.내가 오늘 상담을 한다면? : 이 상담이 끝나는 날 : 오늘 수익 + 오늘 상담 수익내가 오늘 상담을 하지 않는다면? : 아무것도 변하지 않음 i번째 날 수익을 버는 경우의 수는 다양하며, 이 경우의 수 중에서 최대의 수익을 버는 경우를 고려하려면...최대 수익을 저장하는 행렬(이든 벡터든) dp에 접근할때마다 max값으로 갱신한다.내가 오늘 상담을 한다면? : dp[상담끝나는날] = max(기존수익, 오늘수익+오늘상담수익) 문제..
요약처음에 문제 이해가 안갔는데, 앞뒤앞뒤 이렇게 제거한다는 얘기였다stack 2개를 사용하여 문자열 그대로 / 리버스 문자열 2개를 대상으로 앞 뒤 제거를 진행하였다.서로 제거 범위가 겹치지 않도록 index를 저장해서 관리해줘야 한다!풀이과정첫시도 - 스택 활용(시간초과)1. 검열 문자열과, 신문 문자열을 뒤집어서도 저장 - right stack을 위해서2. left stack point + right stack point의 합이 신문 문자열의 크기보다 작은 동안만 stack에 넣으며 검사를 진행3. 앞뒤로 문자열을 나누었기 때문에, 마지막에 이 문자열을 합치면서 나오는 검열 문자열이 있는지 한 번 검사 - 겸사겸사 문자열을 합치기 위해 right stack에 있는 것들을 left stack에 넣으면..
띄어쓰기로 string 분리 저장하기 std::string sentence = "Hello world! This is a sentence."; std::vector words; // stringstream을 사용하여 string을 띄어쓰기로 분리 std::stringstream ss(sentence); std::string word; while (ss >> word) { words.push_back(word); } 특정 구분자로 string 분리 저장하기 string str = "apple,banana,orange"; vector vec; stringstream ss(str); string token; while(getline(ss,token,',')) vec.push_back(token)..
풀이과정 1차 시도(실패) 먼저, times를 오름차순 정렬한 뒤, etimes라는 벡터를 만든다. times의 index에 대응하는 심사관에게 지금 대기할 경우, 대기자의 업무가 끝나는 시간이다. for(int index = 0; index < n; index++) { int min_index = min_element(etimes.begin(),etimes.end())-etimes.begin(); etimes[min_index] += times[min_index]; } 들어가는 사람마다 etimes이 최소값인 index를 찾고, etimes를 업데이트해준다(검사시간만큼 더함) [사람][etimes] [1][14,10] [2][14,20] [3][21,20] [4][21,30] [5][28,30] [6]..

요약 routes 오름차순 정렬 카메라 범위 설정풀이과정순서대로 routes를 체크하기 위해 sort해준다. 예제[[-20,-15], [-14,-5], [-18,-13], [-5,-3]]의 경우 [[-20,-15], [-18,-13],[-14,-5],[-5,-3]] 으로 정렬한단 얘기 이후 각 자동차마다 camera 설치 가능 범위를 정한다. 맨 처음 자동차를 감시할 수 있는 범위 두번째의 경우 (-18,-15)로 줄어든다. 세 번째의 경우 더이상 하나의 카메라로 감시할 수 없게 됐다. 검사 조건은 camera 범위의 end값과 routes[i][0] 값을 비교하면 된다. 이런 식으로 구현하였다. 코드 #include #include #include #include using namespace std; ..
함수 오버로딩 같은 이름의 함수를 두 개 이상 정의하여 사용하는 것 함수명은 같으나, parameter list 부분이 달라야 함 함수 type(X), parameter 순서(O), type(O), 개수(O), 구성 etc... parameter list가 달라야 함. pointer의 const 여부도 다른 type으로 인식함! parameter type 자동형변환에 의한 호출이 가능함. 단, 대표타입에 한해서 Default Parameter 함수의 매개변수에 기본값을 정의할 수 있다. int Function(int, int, int = 1, int = 2); int main() { Function(1,2,3,4); //default parameter 사용 X Function(1,2,3); //(1,2,..

요약 경우의 수 파악 풀이과정 솔직히 이렇게 풀라고 낸 의도는 아닐텐데... 수학식을 세워서 풀었다. 자릿수마다 A,E,I,O,U가 가능하니 5를 그만큼 곱한다. A _ _ _ _ 의 경우의 수는 5자리인 경우 5*5*5*5 4자리인 경우 5*5*5 3자리인 경우 5*5 2자리인 경우 5 1자리인 경우 1(5^0) 인 것이다. 예를 들어, 맨 앞자리가 E이면 A _ _ _ _ 인 경우의 수만큼 앞에 존재하는 것이라 생각해서 식을 세웠다. AAAAE A (1-1)*(5^4+5^3+5^2+5^1) + 1 A (1-1)*(5^3+5^2+5^1) + 1 A (1-1)*(5^2+5^1) + 1 A (1-1)*(5^1) + 1 E 2 AAAE A (1-1)*(5^4+5^3+5^2+5^1) + 1 A (1-1)*(5..