1. sw expert 사칙연산 유효성 검사

    그냥 dfs가 아니라 순회는 탈출 조건이 return이 아니라 지나치도록 해야함.

    아니면 방문처리.

    + stringstream ss로 문자열 분리하는 법 이해.

    #include<iostream>
    #include<vector>
    #include<string>
    #include<sstream>
    
    using namespace std;
    
    struct node {
    	int left = -1;
    	int right = -1;
    	string value;
    };
    
    vector<node> N;
    
    int is_ok = 1;
    int is_operator = 0;
    
    void DFS(node cur_node) {
    	if (is_ok == 0) {
    		return;
    	}
    
    	if (cur_node.left == -1) {
    	}
    	else {
    		DFS(N[cur_node.left]);
    	}
    
    
    	//cout << cur_node.value << " ";
    
    	if (cur_node.value == "+" || cur_node.value == "-" || cur_node.value == "*" || cur_node.value == "/") {
    		if (is_operator == 0) {
    			is_ok = 0;
    		}
    		is_operator = 0;
    	}
    	else {
    		is_operator = 1;
    	}
    
    	if (cur_node.right == -1) {
    	}
    	else {
    		DFS(N[cur_node.right]);
    	}
    }
    
    int main(int argc, char** argv)
    {
    	int test_case;
    	int T = 10;
    	
    	//총 테스트 케이스의 갯수는 입력으로 주어지지 않는다. 10개 고정
    	//cin >> T;
    	/*
    	   여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
    	*/
    	for (test_case = 1; test_case <= T; ++test_case)
    	{
    		int num;
    		cin >> num;
    		cin.ignore();
    		int answer;
    
    		//중위 순회 자체는 어렵지 않은데, 트리 구조와 함께 만들어야 함.
    		//1차원 벡터에 저장하고 이동할 때 두배로 이동하는 방법 사용하기.
    		//왼쪽 자식 = 현재 노드 * 2, 오른쪽 자식 = 현재 노드 * 2 + 1
    		//근데 여기는 괴상하게도 input data가 자식 노드까지 다 알려줌.
    
    		N = vector<node>(num + 1);
    
    		string temp;
    		for (int i = 1; i <= num; i++) {
    			node temp_N;
    			int index;
    
    			getline(cin, temp);
    			stringstream ss(temp);
    			string temp_str;
    			int cnt = 1;
    			
    			while (ss >> temp_str) {
    				if (cnt == 1) {
    					index = stoi(temp_str);
    				}
    				else if (cnt == 2) {
    					temp_N.value = temp_str;
    				}
    				else if (cnt == 3) {
    					temp_N.left = stoi(temp_str);
    				}
    				else if (cnt == 4) {
    					temp_N.right = stoi(temp_str);
    				}
    				cnt++;
    			}
    			//cout << index << ": " << temp_N.value << " " << temp_N.left << " " << temp_N.right << "\n";
    			N[index] = temp_N;
    		}
    
    		is_ok = 1;
    		is_operator = 0;
    		DFS(N[1]);
    
    		answer = is_ok;
    		
    		cout << "#" << test_case << " " << answer << "\n";
    	}
    	return 0;//정상종료시 반드시 0을 리턴해야합니다.
    }

     

    다른 기호로 나누는 법은 이렇다.

    while(getline(ss,subs1,' ')){
        v.push_back(subs1); // v = {"012" , "34567" , "89"}
    }

     

    2. 프로그래머스 입국심사

    풀이를 보고 푼 문제. 이분탐색으로 나누는게 시간이라는 발상이 되게 특이했다.

    마치 배낭 문제의 발상을 보는 느낌.

    long long 자료형을 중간에 쓰지 않은 변수 때문에 오류가 났었다.

    #include <string>
    #include <vector>
    #include <algorithm>
    #include <iostream>
    
    using namespace std;
    
    long long solution(int n, vector<int> times) {
        long long answer = 0;
        
        sort(times.begin(), times.end());
        
        int times_num = times.size();
        
        //한명이 최소, n 명이 최대
        long long min = times[0] * 1;
        //long long 변환?
        long long max = n * (long long)times[times_num - 1];
        
        //cout << min << " " << max << endl;
        
        //middle시간을 기준으로 가능한 최대 사람.
        long long total_num;
        long long middle;
            
        while(min <= max){
            middle = (min + max) / 2;
            total_num = 0;
            
            for(int i=0; i<times_num; i++){
                total_num = total_num + middle / times[i];
                //cout << total_num << endl;
            }
            
            //cout << min << " " << middle << " " << max << endl;
            
            //여유로우면
            if(total_num >= n){
                max = middle - 1;
                answer = middle;
            }
            else{
                min = middle + 1;
            }
        }
        
        return answer;
    }

     

     

    3. sw expert 괄호 짝짓기

    스택을 사용하여 품.

    #include<iostream>
    #include<string>
    #include<stack>
     
    using namespace std;
     
    int main(int argc, char** argv)
    {
        int test_case;
        int T = 10;
         
     
        /*
           여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
        */
     
        char open[] = { '(', '{', '[', '<'};
        char close[] = { ')', '}', ']', '>'};
         
        for (test_case = 1; test_case <= T; ++test_case)
        {
            int num;
            cin >> num;
     
            string arr;
            cin >> arr;
     
            stack<char> st;
     
            int is_ok = 1;
     
            for (int i = 0; i < arr.size(); i++) {
                if (is_ok == 0) {
                    break;
                }
     
                for (int j = 0; j < 4; j++) {
                    if (open[j] == arr[i]) {
                        st.push(arr[i]);
                        break;
                    }
                    else if (close[j] == arr[i]) {
                        //닫는 기호가 짝이 맞아야 하기 때문에
                        if (st.empty() || (st.top() != open[j])){
                            is_ok = 0;
                            break;
                        }
                        st.pop();
                        break;
                    }
                }
            }
     
            cout << "#" << test_case << " " << is_ok << "\n";
        }
        return 0;//정상종료시 반드시 0을 리턴해야합니다.
    }

     

    4. sw expert ladder1

    bfs인데 좌 또는 우로만 가도록해서 구했음

    #include<iostream>
    #include<vector>
    #include<queue>
    
    using namespace std;
    
    struct info {
    	int y;
    	int x;
    };
    
    vector<vector<int>> visited;
    
    //좌우 먼저 확인
    int dy[] = { 0, 0, 1 };
    int dx[] = { -1, 1, 0 };
    
    int BFS(vector<vector<int>> board,int y, int x) {
    	queue<info> q;
    	q.push({ y, x });
    	visited[y][x] = 1;
    
    	info position;
    
    	int ny;
    	int nx;
    
    	while (!q.empty()) {
    		position = q.front();
    		q.pop();
    
    		if (position.y == 99) {
    			return position.x;
    		}
    
    		for (int i = 0; i < 3; i++) {
    			int ny = position.y + dy[i];
    			int nx = position.x + dx[i];
    
    			if (ny < 0 || nx < 0 || ny >= 100 || nx >= 100 || board[ny][nx] == 0 || visited[ny][nx] == 1) {
    				continue;
    			}
    			else {
    				q.push({ ny, nx });
    				visited[ny][nx] = 1;
    				//하나만 넣어줘야 함.
    				break;
    			}
    		}
    	}
    
    	return -1;
    }
    
    int main(int argc, char** argv)
    {
    	int test_case;
    	int T = 10;
    
    	/*
    	   여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
    	*/
    	for (test_case = 1; test_case <= T; ++test_case)
    	{
    		int test;
    		cin >> test;
    
    		vector<vector<int>> board(100, vector<int>(100, 0));
    		for (int y = 99; y >= 0; y--) {
    			for (int x = 0; x < 100; x++) {
    				cin >> board[y][x];
    			}
    		}
    
    		info start;
    		for (int x = 0; x < 100; x++) {
    			if (board[0][x] == 2) {
    				start.y = 0;
    				start.x = x;
    				break;
    			}
    		}
    
    		visited = vector<vector<int>>(100, vector<int>(100, 0));
    		
    		int x;
    
    		x = BFS(board, start.y, start.x);
    
    		cout << "#" << test << " " << x << "\n";
    	}
    	return 0;//정상종료시 반드시 0을 리턴해야합니다.
    }

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

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