220v
젝무의 개발새발
220v
전체 방문자
오늘
어제
  • 분류 전체보기 (255)
    • AI (35)
      • ML, DL 학습 (30)
      • 논문 리뷰 (4)
      • 실습 및 프로젝트 (1)
    • Algorithm (145)
      • LeetCode (13)
      • 프로그래머스 (35)
      • 백준 (96)
      • 알고리즘, 문법 정리 (1)
    • Mobile, Application (17)
      • Flutter (10)
      • iOS, MacOS (7)
    • BackEnd (7)
      • Flask (1)
      • Node.js (5)
      • Spring, JSP..etc (1)
    • Web - FrontEnd (18)
      • JavaScript, JQuery, HTML, C.. (12)
      • React (6)
    • DataBase (1)
      • MySQL (1)
      • Firebase Firestore (0)
      • Supabase (0)
    • Git (1)
    • 기타 툴 및 오류 해결 (3)
    • 강의 (5)
      • Database (3)
      • 암호학 (2)
      • 알고리즘 (0)
    • 후기와 회고 (2)
    • 블로그 꾸미기 (1)
    • 일상과 이것저것 (20)
      • 맛집 (12)
      • 세상사는일 (4)
      • 도서리뷰 (1)
      • 이런저런 생각들 (잡글) (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 오블완
  • BFS
  • Greedy
  • dfs
  • IMPLEMENT
  • Lis
  • Backtracking
  • 프로그래머스
  • Minimum Spanning Tree
  • binary search
  • 티스토리챌린지
  • top-down
  • union-find
  • dp
  • Prefix Sum
  • Priority Queue
  • brute-Force
  • disjoint set
  • REACT
  • 구현
  • implementation
  • 백준
  • Mathematics
  • 다익스트라
  • 위상 정렬
  • bitmasking
  • Dynamic Programming
  • two pointer
  • topological sort
  • simulation

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
220v

젝무의 개발새발

Algorithm/백준

[백준] 28257. 알록달록 초콜릿 만들기 - C++

2023. 6. 27. 02:03

[Gold III]

 

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

 

12899번: 데이터 구조

첫째 줄에 사전에 있는 쿼리의 수 N 이 주어집니다. (1 ≤ N ≤ 2,000,000) 둘째 줄부터 N개의 줄에 걸쳐 각 쿼리를 나타내는 2개의 정수 T X가 주어집니다. T가 1이라면 S에 추가할 X가 주어지는 것입니

www.acmicpc.net

 

 

백준 제 2회 초콜릿컵 C번 문제

대회 당일 런타임 에러로 애를 먹었던 문제다.

이분탐색할 때 vector를 사용했었는데, 큰 숫자 범위 때문에 메모리 제한을 벗어난 듯 했음.

 

풀이

조금의 규칙성(?)과, 이분 탐색을 이용해야 하는 문제.

 

우선, 첫 번째 규칙은, 각 줄에 존재하는 민트초코의 개수.

1개 0개 1개 / 2개 1개 2개 / 3개 2개 3개 / 4 3 4 / 5 4 5 / ... 처럼 반복된다.

각 3개의 줄을 묶어서, 1섹션(1~3줄), 2섹션(4~6줄), 3섹션(7~9줄)이라고 해도 되지만,

나는 1섹션(1~2줄), 2섹션(3~5줄), 3섹션(6~8줄), 4섹션(9~11줄).. 이라고 편의상 정했다.

이렇게 되면, 1 0 / 1 2 1 / 2 3 2 / 3 4 3 / 4 5 4 / 5 6 5 / .... 와 같이 반복된다고 생각하면 된다.

 

두 번째 규칙은, 각 섹션에서 민트초코가 시작하는 칸이 몇 번째 칸인지.

각 섹션에서, 첫번째 줄은 첫 번째 칸부터, 두번째 줄은 3번째 칸부터, 세번째 줄은 2번째 칸부터 민트초코가 나오기 시작한다.

 


 

그렇다면 이제 n번째 민트초코가 몇번째 칸에 존재하는 지 구해 보자.

우선, 각 섹션에 존재하는 민트초코의 개수를 일반화할 수 있다.

(k번째 Section에 존재하는 민트초코의 개수) = (3k-2) 라고 할 수 있으므로,

(k번째 Section까지 존재하는 총 민트초코의 개수) 는 아래와 같다.

따라서 이를 이용하여, 이분 탐색으로 n번째 민트초코가 몇 번째 Section에 포함되어 있는 지 알아낼 수 있다.

(line 32~43)

 

그 이후는 간단하다.

k줄까지의 초콜릿 개수는 k(k+1)/2 이므로, 직전 Section까지의 초콜릿 개수를 제외해준 다음,

Section 내에서 첫번째 줄인지, 두번째 줄인지, 세번째 줄인지에 따라 알맞게 처리해주면 된다.

(line 45~58)

 

#include <algorithm>
#include <iostream>
#include <vector>
#define init cin.tie(0)->ios_base::sync_with_stdio(0);

typedef long long ll;
const ll MAX = 1e16 + 10;

using namespace std;

vector<ll> result;

int main() {
    init;

    ll a = 1;
    ll d = 3;

    int T;
    ll n;
    cin >> T;
    for (int k = 0; k < T; k++) {
        cin >> n;

        if (n == 1) {
            result.push_back(1);
            continue;
        }

        ll section = 0;

        ll lo = 0, hi = ll(1e9);
        while (lo <= hi) {
            ll mid = (lo + hi) / 2;
            ll S = mid * (3 * mid - 1) / 2;

            if (S >= n) {
                section = mid;
                hi = mid - 1;
            } else {
                lo = mid + 1;
            }
        }

        ll p = section - 1;
        n -= p * (3 * p - 1) / 2;

        ll line = 2 + (section - 2) * 3;

        ll total = (1 + line) * line / 2;

        if (n <= section - 1) {
            total = total + 2 + (n - 1) * 3;
        } else if (n <= section * 2 - 1) {
            total = total + (line + 1) + 1 + (n - (section - 1) - 1) * 3;
        } else {
            total = total + (line + 1) + (line + 2) + 3 + (n - (section * 2 - 1) - 1) * 3;
        }

        result.push_back(total);
    }

    for (int k = 0; k < result.size(); k++) {
        cout << result[k] << "\n";
    }
}

 

    'Algorithm/백준' 카테고리의 다른 글
    • [백준] 2169. 로봇 조종하기 - C++
    • [백준] 1520. 내리막 길 - C++
    • [백준] 12899. 데이터 구조 - C++
    • [백준] 16118. 달빛 여우 - C++
    220v
    220v
    DGU CSE 20 / Apple Developer Academy @ POSTECH 2nd Jr.Learner.

    티스토리툴바