요약 vector 정렬 Priority Queue 적용 및 구조체 내부 연산자 오버로딩을 통한 정렬 컨트롤러 내부 로직 풀이과정 우선 예제에서 나왔듯이, 평균 대기시간이 가장 짧은 스케줄러는 최단작업 우선 스케줄링(Shortest Job Controller)이다. 평균 대기시간을 최소화하는데에 중점을 두었으나, 지속적으로 양보하는 상태인 '기아 상태'가 발생할 수 있다. 아무튼.. 요구 조건에 따라 SJF를 구현하는 문제이다. 1. Vector 정렬 일단, input으로 주어지는 jobs가 들어온 시간순으로 정렬되어있으리란 보장이 없었다. 그리고 들어온 시간이 같은 경우, 소요 시간이 짧은 순으로도 초기 정렬을 해주었다. bool cmp(vector a, vector b) { return a[0]==b[..
요약 Bottom-Top 방식의 DP 적용 풀이과정 1. DP 배열 셋팅하기 표시를 쉽게 하기 위해 index 0은 사용하지 않고, 크기가 n+1,m+1인 배열을 선언한다. 그리고 0으로 초기화한다음, (1,1) 값만 1로 초기화한다. int DP[n+1][m+1]; memset(DP,0,sizeof(DP)); DP[1][1] = 1; 2. 점화식 짜기 굉장히 직관적으로, DP[i][j] = DP[i-1][j] + DP[i][j-1] 이라는 것을 알 수 있다. 물론 i,j의 범위를 고려해줘야 함. 3. puddle과 예제의 경우 0 0 0 0 0 0 1(집) 0 0 0 0 0 0 0 0 0 0 0 0 학교 이러한 상황인데, 만약, DP[i][j]가 puddle이라면 무조건 0으로 한다. 그렇게 하면, 나..
요약 분할 정복을 위한 점화식 만들기 풀이과정 문제 풀이 방법은 금방 떠올린데 반해, 코드를 깔끔하게 다시 짜는데에 있어서 좀 많이 애먹었다. 시간도 오래 걸렸다. 1. 숫자와 연산자 분리하기 이렇게 안해도 되는데 직관적인 코딩을 위해 분리하였다. void init(vector arr, vector &nums, vector &ops) { // 숫자와 연산자로 나눠 저장 for(int i = 0; i < arr.size(); i++) { if(i%2 == 0) { nums.push_back(stoi(arr[i])); } else { ops.push_back(arr[i]); } } } 2. 풀 방법 정하기 나는 Bottom-Top 방식의 문제풀이 방법을 택했다. 가장 작은 단위의 연산은 최대값이 명백하게 정..
요약 stack을 이용한 조건 체크 풀이과정 괄호 체크 문제는 전형적인 stack 문제이다. string에서 모든 char에 대해 아래의 조건을 검사한다. 1. (, [ 일 때 - stack에 해당 char push 2. )일 때 - stack이 비어있지 않고, top 값이 ( 라면 PUSH - else : no 출력하고 break 3. ]일 때 - stack이 비어있지 않고, top 값이 [ 라면 PUSH - else : no 출력하고 break 모든 검사가 끝난 후 stack이 비어있지 않다면 - no 출력 여기서 주의할 점은 stack.top() 을 호출할 때 stack이 비어있다면 segmentation fault가 발생하니, top은 비어있지 않은지 앞쪽에 AND 조건으로 검사해준다. 코드 #d..
요약 맵을 통한 중복값 처리 풀이과정 1. 데이터 처리 시간초과가 나지 않고 중복값을 처리하기 위해 맵 구조를 사용한다. 정렬될 필요가 있고, 사전순 정렬이기 때문에 map을 그대로 쓴다. (혹은 unordred_map을 사용하고 추후에 sort해주는 방법도 있다.) int n, m; cin >> n >> m; cin.ignore(); map map; vector both_str; for(int i = 0 ; i < n+m; i++) { string str; getline(cin,str); map[str]++; } cin.ignore() 해주지 않으면 공백값이 처음으로 들어가서 그걸 무시하기 위해 넣었다. 이렇게 map에 예쁘게 저장되고, 중복된 값은 value가 2이다. 2. vector에 재처리 및 ..
요약 주어진 입출력 가공 queue를 이용한 BFS 구현 풀이과정 1. 데이터 가공 추후 BFS를 편하게 구현하기 위해서 주어진 wires vector를 unordered_map 형태로 변경하였다. unordered_map mp; for(int i = 0; i < wires.size(); i++) { mp[wires[i][0]].push_back(wires[i][1]); mp[wires[i][1]].push_back(wires[i][0]); } 첫번째 문제의 경우 이렇게 값을 재구성했다. 2. BFS 구현 이제 모든 wires의 element에 대해 BFS 탐색을 한다. 첫번째 테스트케이스를 예시로 들자면, [4,7]을 끊었다 가정하였을 경우 첫번째 요소인 4와 연결된 노드를 BFS를 통해 파악할 것이다..
요약 위 조건에 맞는 문자열 자르기 - 정규 표현식 사용 덧셈의 합이 최소가 되기 위한 괄호의 조건 파악하여 매커니즘 구현 풀이과정 1. 정규표현식으로 문자열 정제하기 정규표현식 문제는 55-50+40과 같은 형태를 띄고 있다. 추후 내가 생각한 방식으로 문제를 풀기 위해, 55-50+40과 같은 문자열이 주어지만 55, -50, 40 으로 문자열을 분리하길 원했다. 이를 위해 정규표현식을 사용했다. 내가 추출하고자 하는 패턴은 다음과 같다. -로 시작할수도 있다. 숫자로 구성되며 1~5자리이다. 이를 위한 정규표현식은 /[-]?\d{1,5}/g 이다. [-]? [-] - '하나' ? 해당 token이 1 또는 0 하나 나올수도(1) 안나올수도(0) \d{1,5} \d digit (0-9) {1,5} 해..
요약 sort를 이용한 vector 정렬 풀이과정 1. 값 입력 주어지는 값을 string으로 저장하여 한자리씩 vector에 넣는다. 이때 저장은 int로 다시 바꾸기 위해 '0'을 빼준다. string num = ""; getline(cin,num); vector vec; for(char c : num) { vec.push_back(c-'0'); } 2. 값 정렬 이후 벡터를 정렬하기 위해 sort를 사용한다. sort sort는 algorithm STL Header에 속해있다. sort(vec.begin(),vec.end(),greater()); 두 인자(시작과 끝)만 넣으면 default로 오름차순 정렬이 된다. 이 문제는 내림차순을 요구하기 때문에 세번째 parameter로 greater()를 ..
요약 비교 커스텀 함수를 짜서 주어지는 값을 담은 컨테이너를 요구조건에 맞게 정렬한다. 1) 길이 오름차순 2) 사전순 ✔️ 중복 제거 자료형 vector 을 사용했다. 풀이 순서 1. 값 입력 int n; cin >> n; cin.ignore(); // getline을 위한 첫 \n 무시 vector strvec; for(int i = 0; i < n; i++) { string str = ""; getline(cin,str); if(strvec.end() == find(strvec.begin(),strvec.end(),str)) { //중복 제거 strvec.push_back(str); } } if문에서 find를 이용해 중복일 경우 push_back을 하지 않게끔 한다. 2. 값 정렬 algorith..