기록하지 않았다면 잃어버릴 시간들
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)
블로그 내 검색

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

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

  • 알고리즘/백준

    BOJ 2632 피자판매 / C++

    2022. 12. 3.

    by. 내이름은 킹햄찌

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

     

    2632번: 피자판매

    첫 번째 줄에는 손님이 구매하고자 하는 피자크기를 나타내는 2,000,000 이하의 자연수가 주어진다. 두 번째 줄에는 A, B 피자의 피자조각의 개수를 나타내 는 정수 m, n 이 차례로 주어진다 (3 ≤ m, n

    www.acmicpc.net

    아이디어

     

    vector<int> pizzaA;
    vector<int> pizzaB;
    //A에서 나올 수 있는 합
    vector<int> cntA;
    //B에서 나올 수 있는 합
    vector<int> cntB;
    
    int n;
    void input() {
    	cin >> n;
    	cin >> a >> b;
    	pizzaA.resize(a+1);
    	pizzaB.resize(b+1);
    	for (int i = 0; i < a; i++) {
    		cin >> pizzaA[i];
    	}
    	for (int i = 0; i < b; i++) {
    		cin >> pizzaB[i];
    	}
    	cntA.resize(2000001);
    	cntB.resize(2000001);
    }
    
    void func(int p, vector<int> &arr, vector<int> &arrCnt) {
    	//뒤로 늘려감
    	for (int i = 1; i <= p; i++) {
    		int sum = 0;
    		for (int j = 0; j < i; j++) {
    			sum += arr[j];
    		}
    		arrCnt[sum]++;
    
    		//피자 하나에서만 가져오는 케이스
    		if (sum == n) cnt++;
    
    		if (i == p) break;
    		//앞에서 줄여감
    		for (int j = 1; j < p; j++) {
    			sum -= arr[j - 1];
    			sum += arr[(j + i - 1) % p];
    			arrCnt[sum]++;
    			//피자 하나에서만 가져오는 케이스 
    			if (sum == n) cnt++;
    		}
    	}
    }
    
    
    void solution() {
    	// a에서의 연속된 피자의 합
    	func(a, pizzaA, cntA); 
    	// b에서의 연속된 피자의 합
    	func(b, pizzaB, cntB); 
    	for (int i = 1; i < n; i++) {
    		int j = n - i;
    		cnt += cntA[i] * cntB[j];
    	}
    	cout << cnt;
    }
    
    int main(void) {
    	input();
    	solution();
    }

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

    BOJ 1939 중량제한 / C++  (0) 2022.12.03
    BOJ 18428 감시 피하기 / C++  (0) 2022.12.03
    BOJ 3109 빵집 / C++  (2) 2022.09.15
    BOJ 1322 X와 K / C++  (0) 2022.09.15
    BOJ 2096 내려가기 / C++  (0) 2022.09.11

    댓글

    관련글

    • BOJ 1939 중량제한 / C++ 2022.12.03
    • BOJ 18428 감시 피하기 / C++ 2022.12.03
    • BOJ 3109 빵집 / C++ 2022.09.15
    • BOJ 1322 X와 K / C++ 2022.09.15
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

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

티스토리툴바