상세 컨텐츠

본문 제목

[CodeUp] C언어 기초 100제 풀이 (1089번 ~ 1092번)

C언어

by idea8590 2026. 2. 4. 22:04

본문

반응형

CodeUp 기초 100제 중 1089번부터 1092번까지는 수열(Sequence)의 규칙성을 구현하고, 반복문을 활용해 최소공배수(LCM)와 같은 수학적 문제를 해결하는 구간입니다.

이 단계에서는 단순히 반복하는 것을 넘어, 숫자가 변하는 규칙(등차, 등비)을 코드로 옮기고, 숫자가 급격히 커질 때 자료형(long long)을 선택하는 감각을 익혀야 합니다.


1089 : [기초-종합] 수 나열하기1 (등차수열)

시작 값(a), 등차(d), 몇 번째인지(n)가 주어질 때, n번째 수를 구하는 문제입니다. (예: 1, 4, 7, 10... 처럼 3씩 커지는 수열)

소스 코드

C
 
#include <stdio.h>

int main() {
    int a, d, n;
    int result;

    scanf("%d %d %d", &a, &d, &n);

    // 공식 활용: 시작값 + (등차 * (n-1번))
    result = a + d * (n - 1); 

    printf("%d", result);

    return 0;
}

예시 입력 / 출력

[입력]
1 3 5

[출력]
13

문제 해설 두 가지 방법으로 풀 수 있습니다.

  1. 반복문 사용: for문을 n-1번 돌면서 계속 d를 더해주는 방법.
  2. 수학 공식 사용(권장): 등차수열의 일반항 공식을 사용하면 반복문 없이 한 번에 계산할 수 있어 훨씬 효율적입니다.
    • 공식: 시작값 + 등차 * (횟수 - 1)
    • n-1을 곱하는 이유는 첫 번째 숫자는 이미 정해져 있고, 두 번째 숫자부터 d가 더해지기 때문입니다.

1090 : [기초-종합] 수 나열하기2 (등비수열)

시작 값(a), 등비(r), 몇 번째인지(n)가 주어질 때, n번째 수를 구하는 문제입니다. (예: 2, 4, 8, 16... 처럼 2배씩 커지는 수열)

소스 코드

C
 
#include <stdio.h>

int main() {
    long long a, r, n; // 등비수열은 값이 기하급수적으로 커지므로 long long 필수
    int i;

    scanf("%lld %lld %lld", &a, &r, &n);

    for(i = 1; i < n; i++) { // n-1번 반복
        a = a * r; // 계속해서 r을 곱해나감
    }

    printf("%lld", a);

    return 0;
}

예시 입력 / 출력


 
[입력]
2 3 7

[출력]
1458

문제 해설 이 문제의 핵심은 자료형의 선택입니다.

  • 등비수열은 숫자가 아주 빠르게 커집니다. 예를 들어 2를 30번만 곱해도 10억이 넘고, 조금만 더 커지면 int형 범위(약 21억)를 가볍게 초과합니다.
  • 따라서 반드시 long long 자료형을 사용해야 오버플로우(Overflow) 오류 없이 정답을 맞힐 수 있습니다.
  • n-1번 반복하며 값을 계속 곱해줍니다.

1091 : [기초-종합] 수 나열하기3 (혼합 수열)

이전 수에 m을 곱하고 d를 더하는 규칙을 가진 수열의 n번째 수를 구하는 문제입니다. (예: 값 = 값 * m + d)

소스 코드

C
 
#include <stdio.h>

int main() {
    long long a, m, d, n; // 계산 결과가 커질 수 있으므로 long long 사용
    int i;

    scanf("%lld %lld %lld %lld", &a, &m, &d, &n);

    for(i = 1; i < n; i++) {
        a = a * m + d; // 문제에서 제시한 공식 그대로 적용
    }

    printf("%lld", a);

    return 0;
}

예시 입력 / 출력

[입력]
1 -2 1 8

[출력]
-85

문제 해설 1090번의 심화 버전입니다. 곱하기와 더하기가 섞여 있어 수학 공식으로 한 번에 풀기는 까다롭습니다.

  • 이럴 때는 반복문을 사용하는 것이 가장 확실합니다.
  • 시작 값 a에 대해 m을 곱하고 d를 더하는 과정을 n-1번 반복해서 갱신하면 됩니다.
  • 이 문제 역시 값이 매우 커질 수 있으므로 long long 사용이 필수입니다.

1092 : [기초-종합] 함께 문제 푸는 날

세 명의 학생이 각각 3일마다, 7일마다, 9일마다 방문한다고 할 때, 세 명이 동시에 방문하는 날은 며칠 뒤인지 구하는 문제입니다. (최소공배수 문제)

소스 코드

C
 
#include <stdio.h>

int main() {
    int a, b, c;
    int day = 1; // 1일차부터 시작해서 하루씩 증가시킬 예정

    scanf("%d %d %d", &a, &b, &c);

    // 세 명 모두의 주기로 나누어 떨어질 때까지 반복 (하나라도 안 나누어 떨어지면 계속)
    while(day % a != 0 || day % b != 0 || day % c != 0) {
        day++; // 날짜를 하루 증가
    }

    printf("%d", day);

    return 0;
}

예시 입력 / 출력

[입력]
3 7 9

[출력]
63

문제 해설 수학적으로는 최소공배수(LCM)를 구하는 문제입니다. 하지만 코딩에서는 브루트 포스(Brute Force, 무식하게 다 해보기) 방식으로 아주 쉽게 풀 수 있습니다.

  1. day를 1부터 시작합니다.
  2. while문의 조건: "셋 중 한 명이라도 방문하지 않는 날이면 계속해라"
    • || (OR 연산자)를 사용합니다.
    • day % a != 0: a가 안 오는 날 또는
    • day % b != 0: b가 안 오는 날 또는
    • day % c != 0: c가 안 오는 날
  3. 이 반복문이 깨지는(false) 순간은 셋 다 나머지가 0인 날(모두 오는 날) 뿐입니다. 그때의 day가 정답입니다.

핵심 요약

  1. 등차수열 (1089): 일정한 수를 더하는 규칙. **공식(a + (n-1)*d)**을 쓰면 빠릅니다.
  2. 등비수열 (1090): 일정한 수를 곱하는 규칙. 값이 폭발적으로 커지므로 long long 자료형이 필수입니다.
  3. 수열의 구현: 복잡한 규칙이 있다면, for문을 이용해 변수 값을 차근차근 갱신(update)해 나가는 시뮬레이션 방식이 좋습니다.
  4. 최소공배수 (1092): 1부터 1씩 증가시키며 모든 수로 나누어떨어지는지 확인하는 while 반복문으로 해결할 수 있습니다.
반응형

관련글 더보기