-- 예전 기록/BOJ

[ BOJ ] 11944 : NN ( BRONZE 2 ) / C, Python

rejo 2023. 11. 17. 10:50

문제

문제는 매우 간단하다. N을 N번 출력하는 프로그램을 작성하여라. 다만, 답이 길어지는 경우 답의 앞 M자리만 출력한다.

입력

첫 번째 줄에는 N, M이 주어진다. (1 ≤ N, M ≤ 2016)

출력

N을 N번 출력한다. 만약 답이 길어지면 답의 앞 M자리를 출력한다.

풀이 과정

출력대로 진행한다. N을 N번 출력하는 도중 답이 길어지면 답의 앞 M자리를 출력한다.

N을 출력하던 도중에 중간에 잘릴 수도 있으므로, 잘림 현상을 처리하기 위해 N을 한 글자씩 출력하면서 M을 넘지 않는지 체크한다.

 

재귀를 이용하여 제곱 함수와 숫자에서 특정 자리수를 가져오는 함수를 만들어 한 글자씩 M을 넘지 않도록 출력하였다.

C

#include <stdio.h>
#include <string.h>

int power(int n, int k) {
    if (k == 0) return 1;
    else return n * power(n, k - 1);
}

int getIdx(int n, int idx) {
    if (idx == 0) return n % 10;
    else return getIdx(n / 10, idx - 1);
}

int main(void) {
    int n, m;
    scanf("%d %d", &n, &m);

    int n_size = 0;
    while ((power(10, n_size)) <= n) n_size += 1;

    int count = 0;
    for (int i = 0; i < n; i++) {
        for (int j = n_size - 1; j >= 0; j--) {
            printf("%d", getIdx(n, j));
            count += 1;
            if (count == m) break;
        }
        if (count == m) break;
    }

    return 0;
}

Python

import sys
input = sys.stdin.readline

n, m = map(int, input().rstrip().split())
n = str(n)
now = 0
if len(n) * int(n) > m:
    for i in range(m):
        print(n[now], end='')
        now = (now + 1) % (len(n))
else:
    for i in range(int(n)):
        print(n, end='')