상세 컨텐츠

본문 제목

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

C언어

by idea8590 2026. 2. 3. 23:42

본문

반응형

CodeUp 기초 100제 중 1081번부터 1084번까지는 중첩 반복문(Nested Loop)을 집중적으로 다루는 구간입니다. 이전 단계에서 변수 하나를 반복시키는 법을 배웠다면, 이번에는 '반복문 안에 또 다른 반복문'을 넣어 마치 시계 톱니바퀴처럼 여러 변수를 제어하는 기술을 익히게 됩니다.


1081 : [기초-종합] 주사위를 2개 던지면? 1부터 n까지, 1부터 m까지 숫자가 적힌 서로 다른 주사위 2개를 던졌을 때, 나올 수 있는 모든 경우의 수를 출력해보자.

소스 코드

 
#include <stdio.h>

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

    for(i = 1; i <= n; i++) {       // 첫 번째 주사위 (바깥쪽 반복문)
        for(j = 1; j <= m; j++) {   // 두 번째 주사위 (안쪽 반복문)
            printf("%d %d\n", i, j);
        }
    }

    return 0;
}

 

예시 입력 / 출력

[입력]
2 3

[출력]
1 1
1 2
1 3
2 1
2 2
2 3

문제 해설 이 문제는 중첩 반복문의 작동 원리를 이해하는 가장 기초적인 예제입니다. 바깥쪽 반복문의 변수 i가 1일 때, 안쪽 반복문의 변수 j는 1부터 m까지 모든 숫자를 순회합니다. j의 반복이 끝나면 비로소 i가 2가 되고, 다시 j는 1부터 시작합니다. 이렇게 서로 다른 두 개의 주기가 맞물려 돌아가며 모든 경우의 수(n * m가지)를 빠짐없이 출력하게 됩니다.


1082 : [기초-종합] 16진수 구구단? 16진수(0, 1, 2... 9, A, B, C, D, E, F)를 배운 뒤, 16진수 구구단 B단을 출력해보자. 입력은 16진수로 한 글자(A~F)가 입력된다.

소스 코드

#include <stdio.h>

int main() {
    int n, i;
    scanf("%X", &n); // 16진수 대문자 형태로 입력 받기

    for(i = 1; i < 16; i++) { // 16진수는 1부터 F(15)까지 곱함
        printf("%X*%X=%X\n", n, i, n * i); // 결과도 16진수 대문자로 출력
    }

    return 0;
}

예시 입력 / 출력

[입력]
B

[출력]
B*1=B
B*2=16
B*3=21
...
B*C=84
B*D=8F
B*E=9A
B*F=A5

문제 해설 16진수(Hexadecimal) 연산을 다룰 때 서식 지정자의 역할을 이해하는 것이 핵심입니다. 정수를 입력받을 때 %d 대신 %X를 사용하면 입력된 알파벳(A~F)을 자동으로 해당 정수 값(10~15)으로 변환하여 저장합니다. 출력할 때도 마찬가지로 %X를 사용하면 연산된 정수 값을 다시 16진수 대문자 형태로 보여줍니다. 반복문은 16진수의 끝인 15(F)까지 수행하면 됩니다.


1083 : [기초-종합] 3 6 9 게임의 왕이 되자 3 6 9 게임을 하던 영일이는 3 6 9 게임에서 잦은 실수로 계속해서 벌칙을 받게 되었다. 3 6 9 게임의 왕이 되기 위해 369 게임을 자동으로 해주는 프로그램을 작성해보자. (단, 10보다 작은 정수 1개가 입력된다.)

소스 코드

#include <stdio.h>

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

    for(i = 1; i <= n; i++) {
        if(i == 3 || i == 6 || i == 9) // 3 또는 6 또는 9인 경우
            printf("X ");
        else
            printf("%d ", i); // 그 외의 숫자는 그대로 출력
    }

    return 0;
}

예시 입력 / 출력

[입력]
9

[출력]
1 2 X 4 5 X 7 8 X

문제 해설 반복문 내에서 특정 조건에 따라 출력을 다르게 하는 분기 처리 문제입니다. 1부터 입력받은 n까지 숫자를 증가시키며 반복하되, if 조건문을 사용하여 현재 숫자 i가 3, 6, 9 중 하나라도 해당되는지 검사합니다. 이때 '또는'을 의미하는 논리 연산자 || (OR)를 사용하여 조건을 연결하는 것이 중요합니다. 조건이 참이면 "X"를, 거짓이면 숫자를 출력합니다.


1084 : [기초-종합] 빛 섞어 색 만들기 빨강(r), 초록(g), 파랑(b) 각 빛의 강약에 따른 가짓수(0 ~ n-1)가 주어질 때, 주어진 rgb 빛들을 다르게 섞어 만들 수 있는 모든 경우의 조합(r g b)과 총 가짓수를 계산해보자.

소스 코드

#include <stdio.h>

int main() {
    int r, g, b;
    int i, j, k;
    int count = 0; // 경우의 수를 세기 위한 변수 (초기화 필수)
    
    scanf("%d %d %d", &r, &g, &b);

    for(i = 0; i < r; i++) {          // 빨강(r) 루프
        for(j = 0; j < g; j++) {      // 초록(g) 루프
            for(k = 0; k < b; k++) {  // 파랑(b) 루프
                printf("%d %d %d\n", i, j, k);
                count++; // 출력이 일어날 때마다 카운트 증가
            }
        }
    }
    
    printf("%d", count); // 누적된 총 가짓수 출력

    return 0;
}

예시 입력 / 출력

[입력]
2 2 2

[출력]
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
8

문제 해설 반복문이 세 번 겹쳐 있는 '3중 for문' 문제입니다. 가장 안쪽에 있는 k 반복문이 가장 빠르게 회전하고, 그 다음 j, 가장 바깥쪽인 i 순서로 값이 변합니다. 이는 디지털 시계가 초, 분, 시 순서로 올라가는 원리와 완벽하게 동일합니다. 모든 색상의 조합을 출력할 때마다 count 변수를 1씩 증가시켜서, 반복문이 모두 끝난 뒤에 전체 경우의 수를 출력하면 됩니다.


핵심 요약

  • 중첩 반복문의 흐름: 바깥쪽 루프가 1번 실행될 때, 안쪽 루프는 자신의 조건만큼 전체를 반복합니다.
  • 서식 지정자의 활용: 16진수 입출력 시 %X를 사용하면 복잡한 변환 과정 없이 알파벳과 숫자를 매핑할 수 있습니다.
  • 논리 연산자: 여러 조건 중 하나만 만족해도 될 때는 || (OR 연산자)를 사용하여 조건을 묶어줍니다.
  • 카운팅(Counting): 반복문 안에서 특정 사건(출력 등)이 발생할 때마다 변수를 증가(count++)시키면 전체 횟수를 쉽게 구할 수 있습니다.
반응형

관련글 더보기