1. BFS 문제풀이

     

    2. sw expert academy D3 문제 : flatten 평탄화

    투포인터를 사용해서 풀었음

    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    int main(int argc, char** argv)
    {
    	int test_case;
    	int T;
    	
    	cin >> T;
    	/*
    	   여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
    	*/
    	for (test_case = 1; test_case <= T; ++test_case)
    	{
    		int num;
    		vector<int> height(100);
    
    		cin >> num;
    		for (int i = 0; i < 100; i++) {
    			cin >> height[i];
    		}
    
    		int cnt;
    		vector<int> each_height(101);
    		for (int h = 1; h <= 100; h++) {
    			cnt = 0;
    			for (int i = 0; i < 100; i++) {
    				if (height[i] >= h) {
    					cnt++;
    				}
    			}
    			each_height[h] = cnt;
    		}
    
    
    		int start = 1;
    		int end = 100;
    
    		while (num > 0) {
    			if (each_height[start] == 100) {
    				start++;
    				continue;
    			}
    			else if (each_height[end] == 0) {
    				end--;
    				continue;
    			}
    			else {
    				each_height[start]++;
    				each_height[end]--;
    				num--;
    			}
    		}
    
    		if (each_height[start] == 100) {
    			start++;
    		}
    		else if (each_height[end] == 0) {
    			end--;
    		}
    		cout << "#" << test_case << " " << end - start+1<< "\n";
    	}
    	return 0;//정상종료시 반드시 0을 리턴해야합니다.
    }

     

    3. 프로그래머스 동적 계획법 - N으로 표현

     

    너무나 어려웠던 동적 계획법.

    DP 는 배열을 그냥 인덱스와 순서가 같도록 설정해야 그나마 내 머리가 따라가준다는 걸 먼저 알 수 있었다.

    인터넷에서 찾을 때, 2= 1+1, 3=1+2 or 2+1 이라는 비유가 어느정도 도움이 되었다.

     

    또한 DP의 조합을 찾을 때,

    DP[4] = DP[1] + DP[3] , DP[2] + DP[2], DP[3] + DP[1] 이런 식으로 조합을 찾아내는 걸 어떻게 할까 고민했는데,

    이중 for문에서

    if(y+x != 4){
    	continue;
    }

    그냥 이런 식으로 짜서 조합을 찾아내는 구현도 쓸모 있다는 것을 배웠다.

     

    #include <string>
    #include <vector>
    #include <unordered_set>
    #include <iostream>
    
    using namespace std;
    
    int calNN(int N, int cnt){
        int num = 0;
        for(int i=0; i<cnt; i++){
            num = num * 10 + N;
        }
        return num;
    }
    
    int solution(int N, int number) {
        vector<unordered_set<int>> DP(9);
        
        DP[1].insert(N);
        //첫번째 바로 맞으면
        if(DP[1].find(number) != DP[1].end()){
            return 1;
        }
        
        for(int i=2; i<=8; i++){
            //NN... 과 N 사칙연산 저장
            DP[i].insert(calNN(N, i));
            
            //계산 가능한 모든 값 저장 DP[1] =  DP[0] (사칙연산) NN
            //|| DP[0] (사칙연산) DP[0]
            
            for(int y=1; y<i; y++){
                for(int x=1; x<i; x++){
                    if(y+x != i){
                        continue;
                    }
                    //갯수 조합에 해당하면
                    for(int num1 : DP[y]){
                        for(int num2 : DP[x]){
                            DP[i].insert(num1+num2);
                            DP[i].insert(num1*num2);
                            DP[i].insert(num1-num2);
                            if(num2 != 0){
                                DP[i].insert(num1/num2);
                            }
                        }
                    }
                }
            }
    
            //다음 DP로 가기전에 답이 있는지 확인
            if(DP[i].find(number) != DP[i].end()){
                return i;
            }
        }
        return -1;
    }

     

     

    4. 최빈수

    알고리즘이 아닌 점수별 백터 나열로 해결함

    이 때, 항상 추가 조건을 주의할 것. 최빈값이 같다면 더 큰 값으로 취급한다는.

    #include<iostream>
    #include<vector>
    #include<algorithm>
    
    using namespace std;
    
    int main(int argc, char** argv)
    {
    	int test_case;
    	int T;
    
    	cin >> T;
    	/*
    	   여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
    	*/
    	for (test_case = 1; test_case <= T; ++test_case)
    	{
    		int case_num;
    		cin >> case_num;
    		
    		vector<int> score(101);
    		int temp;
    		for (int i = 0; i < 1000; i++) {
    			cin >> temp;
    			score[temp]++;
    		}
    		
    		int max_num = 0;
    		int max_index;
    		for (int i = 0; i <= 100; i++) {
    			if (score[i] > max_num) {
    				max_index = i;
    				max_num = score[i];
    			}
    			else if (score[i] == max_num) {
    				max_index = max(max_index, i);
    			}
    
    		}
    
    		//최대값의 주소 반환.따라서 *을 통해 값을 반환해줘야 함. 현재는 index == score임
    		cout << "#" << case_num<< " "<< max_index << "\n";
    	}
    	return 0;//정상종료시 반드시 0을 리턴해야합니다.
    }

     

     

    5. 타겟 넘버

    전역 백터를 썼더니 프로그래머스에서는 세그멘테이션 오류를 뱉어서 이리저리 바꿨다.

     

    아래 코드는 고치기 전 전역 백터 코드.

    #include <string>
    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    int answer = 0;
    vector<int> c_numbers;
    
    int DFS(int current_v, int index, int target) {
        if (index >= c_numbers.size()) {
            //비교
            if (target == current_v) {
                answer++;
            }
            return 0;
        }
        //더하거나
        DFS(current_v + c_numbers[index], index + 1, target);
    
        //빼거나
        DFS(current_v - c_numbers[index], index + 1, target);
    
    }
    
    int solution(vector<int> numbers, int target) {
        c_numbers = numbers;
    
        //숫자를 더하거나, 뻬거나
        DFS(0, 0, target);
    
        cout << answer;
        return 0;
    }
    
    int main() {
        solution({4, 1, 2, 1}, 2);
        return 0;
    }

     

     

    6. sw expert 점프 놀이

    다시 나온 동적 계획법. 아직 동적 계획법은 코드가 안 떠오른다.

     

    요약하자면 최단 거리를 저장하는 이중 백터를 하나 더 만든 후, 1을 쭉 돌면서 0에서부터 오는 최소값을(없으니까 0),

    2를 쭉 돌면서 1에서부터 오는 최소값을( 거리 + shortest 백터 1의 값 ) 을 저장하면서 진행하는 것.

     

    다음날 해결

    '알고리즘 문제풀이' 카테고리의 다른 글

    D-1  (0) 2024.05.18
    백트래킹이란? 최대 상금 문제  (0) 2024.05.15
    JS의 sort  (0) 2024.03.27
    JS로 알고리즘  (0) 2024.02.02
    프로그래머스 [주식가격] 문제 스택으로 풀기  (0) 2024.01.19
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기