BOJ 25180 - 썸 팰린드롬 (C++)

G1FTED_13·2025년 5월 22일

BOJ

목록 보기
12/20
post-thumbnail

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

문제를 푼 날짜: 25. 05. 22.

#math #greedy

아이디어

팰린드롬을 만들 때 가장 큰 숫자 9를 최대한 활용하면 자릿수를 최소화할 수 있다.

  • 앞뒤로 9를 한 번씩 추가하면(총 2자리 추가) 자리 합이 1818만큼 올라감.
  • 따라서 우선 N18\frac{N}{18}번 만큼 앞뒤에 9를 붙여준다.

세부 풀이 과정

  1. p=N18p = \displaystyle\left\lfloor \frac{N}{18} \right\rfloor

    • 이때까지 추가된 자리 수는 2p2p
  2. 나머지 r=Nmod18r = N \bmod 18 에 따라 추가 자리 수를 더함

    • r=0r=0

      • 더할 필요 없음 → +0+0
    • 0<r90 < r \le 9

      • 가운데 한 자리만 추가 → +1+1
    • 10r<1810 \le r < 18

      • rr 짝수 → 앞뒤에 한 번씩 추가 → +2+2
      • rr 홀수 → 앞뒤 + 가운데 한 자리 → +3+3

최종 답은

2p9로 채운기본 자리 수  +  {0,r=0,1,0<r9,2,10r<18,  r 짝수,3,10r<18,  r 홀수.\underbrace{2p}_{\substack{\text{9로 채운}\\\text{기본 자리 수}}} \;+\; \begin{cases} 0, & r=0,\\ 1, & 0<r\le9,\\ 2, & 10\le r<18,\;r\text{ 짝수},\\ 3, & 10\le r<18,\;r\text{ 홀수}. \end{cases}

내 코드

#include <iostream>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int N;
    cin >> N;

    int ans = (N / 18) * 2;

    if(N % 18 == 0) cout << ans;
    else if(N % 18 <= 9) cout << ans + 1;
    else if((N % 18) % 2 == 0) cout << ans + 2;
    else cout << ans + 3;

    return 0;
}
profile
어제보다, 더

0개의 댓글