[C++] 15721 - 번데기 (실버5)

2023. 1. 31. 18:02·Coding Test/Solution

1. 문제 설명

 

 

15721번: 번데기

예를 들어 7명이 있고, 16번째 등장하는 “뻔”을 부른 사람의 번호를 알고 싶다면 입력은 7 16 0이다. 4명이 있고 6번째 등장하는 “데기”를 부른 사람의 번호를 알고 싶다면 입력은 4 6 1이며, 이

www.acmicpc.net


2. 아이디어

 

심심해서 구글링 하면서 놀다가 우연히 발견한 문제였는데

문제 유형은 브루트 포스라고 되어 있고 실제로 그렇게 해도 상관 없지만,

수학적으로 최적화가 가능할 것 같아서 풀어봤다. (꽂히면 해봐야 하는 타입)

근데 문제가 워낙 간단해서 별다른 성과를 얻지는 못했다.

 

잘 생각해보면 이 문제는 T번 째 0 혹은 1의 위치만 알면 인원수의 나머지를 구하면 답이 나온다.

result = T_index % A

그럼 이 문제는 "T번 째 0 혹은 1의 인덱스를 구하는 방법"을 묻는 문제로 바뀐다.

그런데 패턴이 너무 적나라하지 않은가.

 

몇 번째 회차던 간에 처음 4번은 '0 - 1 - 0 - 1'이 반복된다.

그 다음은 N(몇 번째 돌고 있는가?)만 안다면 0과 1의 개수는 2+N개로 위치를 금방 구할 수 있다. 

 

그럼 "A가 몇 번째 회차에 해당하는가"를 구해야 하는데, 조금만 생각해보면 금방 구할 수 있다.

대충 설명하고 치우려다가 글로 설명하기 너무 힘들어서 포기

빨간색은 Index 값이고, 주황색은 0("번"), 보라색이 1("데기") 번호라고 치고 숫자를 잘 지켜보면 답이 나온다.

Index는 4 + 2*N만큼 증가한다.

각 N에서 존재할 수 있는 최대 "번", "데기"의 최대 번호는 이전 값의 (4 + N)을 더한 값이다.

이걸 이용해서 조건식을 잘 걸어주면 N이 나올 것이고, 인덱스 구해서 인원수로 나머지 구한 다음 출력시키면 끝난다.

 

물론 처음에도 말했 듯이 무식하게 긁으면서 해도 상관 없는 문제고,

제출하고 다른 블로그 좀 훑어봤더니 다들 그렇게 풀고 계시더라.


3. 코드

#include <iostream>

#define endl "\n"

using namespace std;

int main(void) {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int a, t, flag; cin >> a >> t >> flag;
    int round=1, total=7;
    int tmp = 4;
    int now;

    while (t > tmp) {
        tmp += 4 + round++;
        total += 4 + 2*(round+1);
    }
    tmp -= (4 + round-1);
    total -= (4 + 2*(round+1));

    if (t - tmp <= 2)
        now = (!flag) ? total + 2*(t-tmp)-1 : total + 2*(t-tmp);
    else
        now = (!flag) ? total + 4 + (t-tmp-2) : total + 4 + (round+1) + (t-tmp-2);

    cout << now % a << endl;

    return 0;
}
저작자표시 비영리 (새창열림)
'Coding Test/Solution' 카테고리의 다른 글
  • [C++] 10265 - MT (플래티넘4)
  • [C++] 2533 - 사회망 서비스(SNS) (골드3)
  • [C++] 6549 - 히스토그램에서 가장 큰 직사각형 (플래티넘5)
  • [C++] 16234 - 인구 이동 (골드5)
나죽못고나강뿐
나죽못고나강뿐
싱클레어, 대부분의 사람들이 가는 길은 쉽고, 우리가 가는 길은 어려워요. 우리 함께 이 길을 가봅시다.
  • 나죽못고나강뿐
    코드를 찢다
    나죽못고나강뿐
  • 전체
    오늘
    어제
    • 분류 전체보기 (457)
      • Computer Science (60)
        • Git & Github (4)
        • Network (17)
        • Computer Structure & OS (13)
        • Software Engineering (5)
        • Database (9)
        • Security (5)
        • Concept (7)
      • Frontend (21)
        • React (13)
        • Android (4)
        • iOS (4)
      • Backend (77)
        • Spring Boot & JPA (50)
        • Django REST Framework (14)
        • MySQL (8)
        • Nginx (1)
        • FastAPI (4)
      • DevOps (24)
        • Docker & Kubernetes (11)
        • Naver Cloud Platform (1)
        • AWS (2)
        • Linux (6)
        • Jenkins (0)
        • GoCD (3)
      • Coding Test (112)
        • Solution (104)
        • Algorithm (7)
        • Data structure (0)
      • Reference (134)
        • Effective-Java (90)
        • Pragmatic Programmer (0)
        • CleanCode (11)
        • Clean Architecture (2)
        • Test-Driven Development (4)
        • Relational Data Modeling No.. (0)
        • Microservice Architecture (2)
        • 알고리즘 문제 해결 전략 (9)
        • Modern Java in Action (0)
        • Spring in Action (0)
        • DDD start (0)
        • Design Pattern (6)
        • 대규모 시스템 설계 (6)
        • JVM 밑바닥까지 파헤치기 (4)
      • Service Planning (2)
      • Side Project (5)
      • AI (0)
      • MATLAB & Math Concept & Pro.. (1)
      • Review (17)
      • Interview (2)
      • IT News (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃
  • 공지사항

    • 한동안 포스팅은 어려울 것 같습니다. 🥲
    • N Tech Service 풀스택 신입 개발자가 되었습니다⋯
    • 취업 전 계획 재조정
    • 취업 전까지 공부 계획
    • 앞으로의 일정에 대하여..
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
나죽못고나강뿐
[C++] 15721 - 번데기 (실버5)

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.