기록하지 않았다면 잃어버릴 시간들
Home
  • 분류 전체보기 (184)
    • Lang (6)
      • c++ (2)
      • Java (2)
      • python (2)
    • 프레임워크 (18)
      • Spring (16)
      • JPA (2)
    • 알고리즘 (141)
      • 이론 (4)
      • 백준 (59)
      • Codility (13)
      • 프로그래머스 (65)
    • CS (4)
      • 운영체제 (0)
      • 자료구조 (0)
      • DB (4)
      • 네트워크 (0)
      • 보안 (0)
    • 기타 (7)
    • 프로젝트 (4)
      • 게시판 만들기로 배우는 Spring Data JP.. (4)
Home
  • 분류 전체보기 (184)
    • Lang (6)
      • c++ (2)
      • Java (2)
      • python (2)
    • 프레임워크 (18)
      • Spring (16)
      • JPA (2)
    • 알고리즘 (141)
      • 이론 (4)
      • 백준 (59)
      • Codility (13)
      • 프로그래머스 (65)
    • CS (4)
      • 운영체제 (0)
      • 자료구조 (0)
      • DB (4)
      • 네트워크 (0)
      • 보안 (0)
    • 기타 (7)
    • 프로젝트 (4)
      • 게시판 만들기로 배우는 Spring Data JP.. (4)
블로그 내 검색

기록하지 않았다면 잃어버릴 시간들

새로운 것을 배우는게 즐거운 개발자입니다.

  • 알고리즘/백준

    BOJ2637/ C++

    2022. 1. 3.

    by. 내이름은 킹햄찌

    https://www.acmicpc.net/problem/2637

     

    2637번: 장난감 조립

    첫째 줄에는 자연수 N(3 ≤ N ≤ 100)이 주어지는데, 1부터 N-1까지는 기본 부품이나 중간 부품의 번호를 나타내고, N은 완제품의 번호를 나타낸다. 그리고 그 다음 줄에는 자연수 M(3 ≤ M ≤ 100)이 주

    www.acmicpc.net

    백준 온라인저지 2637번 문제입니다. 

    위상정렬을 이용해서 풀었습니다.

    #include<iostream>
    #include<queue>
    #include<vector>
    #include<algorithm>
    #define MAX 101
    
    using namespace std;
    
    
    int require_parts[MAX];
    int degree[MAX];
    vector <pair<int, int>>v[MAX];
    vector <int> nomal_parts;
    
    int N,M;
    int X, Y, K;
    
    void Input() {
    	cin >> N >> M;
    	for (int i = 0; i < M; i++) {
    		cin >> X >> Y >> K;
    		v[X].push_back({ Y,K });
    		degree[Y]++;
    	}
    }
    
    void solution() {
    	queue<int>q;
    	q.push(N);
    	require_parts[N] = 1;
    	while (!q.empty()) {
    		int current = q.front();
    		q.pop();
    
    		if (v[current].empty())
    			nomal_parts.push_back(current);
    
    		for (int i = 0; i < v[current].size(); i++) {
    			int parts_idx = v[current][i].first;
    			int parts_cnt = v[current][i].second;
    			require_parts[parts_idx] += require_parts[current] * parts_cnt; // 필요한 부품수를 부품 번호에 저장
    			if (--degree[parts_idx] == 0)
    				q.push(parts_idx);
    		}
    	}
    
    	sort(nomal_parts.begin(), nomal_parts.end());
    
    	for (int i = 0; i < nomal_parts.size(); i++) {
    		cout << nomal_parts[i] << " " << require_parts[nomal_parts[i]]<<"\n";
    	}
    }
    
    int main(void) {
    	Input();
    	solution();
    }

    아이디어

    완제품을 조립하기 위해 필요한 부품의 개수를 구하는 문제인데 부품은 기본부품과 중간 부품으로 나뉘고 기본부품만 출력 해야함

    기본 부품으로 조합된 중간 부품의 개수를 체크하여 기본부품의 개수를 변화시키는 방법을 생각하기 힘들었음

    위상정렬 기본식인 진입차수가 0인 노드부터 공략하는게 아닌 완제품부터 기본부품까지 위상정렬을 해나가는게 포인트

    조립시 필요한 부품개수 x 현재 필요한 부품의 필요한 개수 다음 부품의 개수에 넣어주면 됨

    '알고리즘 > 백준' 카테고리의 다른 글

    BOJ2623/ C++  (0) 2022.01.10
    BOJ2637/ C++  (0) 2022.01.10
    BOJ1516/ C++  (0) 2022.01.03
    BOJ14567/ C++  (0) 2022.01.03
    BOJ_2252 / C++  (0) 2022.01.03

    댓글

    관련글

    • BOJ2623/ C++ 2022.01.10
    • BOJ2637/ C++ 2022.01.10
    • BOJ1516/ C++ 2022.01.03
    • BOJ14567/ C++ 2022.01.03
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

Designed by Nana
블로그 이미지
내이름은 킹햄찌

티스토리툴바