[C Programming] For문 활용해보기.

Baekjoon 단계별 풀어보기

3단계 for문 활용해보기를 하나씩 정리해서 올려보고자 합니다.

다소 간단한 문제가 있을 수 있으나 본인이 조금씩 헷갈리거나 복잡한 문제 또한 있었습니다.

2741번 문제.

문제

자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.

출력

첫째 줄부터 N번째 줄까지 차례대로 출력한다.

예제 입력

5

예제 출력

1
2
3
4
5

코드

#include<stdio.h>
int main() {
int n, i;
scanf("%d", &n);
for(i=1; i<=n; i++)
  printf("%d\n", i);
}


다소 간단한 문제입니다. 입력 값으로 n을 받고 n의 크기만큼 1부터 n까지 줄넘김으로

출력받을수 있게끔 하는 문제입니다.


2742번 문제

문제

자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.

출력

첫째 줄부터 N번째 줄까지 차례대로 출력한다.

예제 입력

5

예제 출력

5
4
3
2
1

코드

#include<stdio.h>
int main() {
int i,n;
scanf("%d", &n);
for(i=0; i<n; i++)
  printf("%d\n", n-i);
}

아까 문제와 비슷한 문제로 조금만 응용해주면 해결되는 문제입니다. n-i부터 줄바꿈으로 출력해주면 n부터 1까지 출력이 가능합니다.


2739번 문제

문제

N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하십시오. 출력 형식에 맞춰서 출력하면 된다.

입력

첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 9보다 작거나 같다.

출력

출력 형식과 같게 N*1부터 N*9까지 출력한다.

예제 입력

2

예제 출력

2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18

코드

#include<stdio.h>
int main() {
int n;
scanf("%d", &n);
for(int i=1; i<=9: i++) {
    printf("%d * %d = %d", n, j, n*i);
}

비교적 간단한 문제입니다.


2438번 문제

문제

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

입력

첫째 줄에 N(1<=N<=100)이 주어진다.

출력

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

예제 입력

5

예제 출력

*
**
***
****
*****

코드

#include <stdio.h>
int main()
{
    int n,i,j;
    scanf("%d", &n);
    for(i=1; i<=n; i++){
       for(j=0; j<i; j++) {
             printf("*");
         }
             printf("\n");
         } 
}

조금 복잡한 문제입니다. i가 1이고 j가 0일때 j는 i보다 작을 떄까지 반복하니까, 이중 for문 형식을 갖추고 있습니다. 즉 j는 i+1만큼 반복합니다. i가 1번돌면 j도 1번돌지만 i가 2번 돌면 j는 3번 돕니다. 그 원리가 i는 1부터 시작하고 j는 0부터 시작하기 떄문입니다. 그럼으로써 2를 입력하면 전체 반복문은 2번 돌지만 안에 포함된 반복문은 3번 돕니다. 첫번째 반복에서 *를 하나 만들고 다음 줄로 넘기고 그 다음 반복에서 i가 2가 되면 j는 2번 돌면서 **를 생성하게 되는 원리입니다.

2439번 문제

문제

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제
하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

입력

첫째 줄에 N(1<=N<=100)이 주어진다.

출력

첫째 줄부터 N번쨰 줄 까지 차례대로 별을 출력한다.

에제 입력

5

예제 출력

    *

   **

  ***

 ****

*****

소스

#include <stdio.h>
int main()
{
    int n,i,j;
    scanf("%d", &n);
    for(i=1; i<=n; i++){
       for(j=n-i; j>0; j--)
           printf(" ");
    for(j=0; j<i; j++)
             printf("*");
             printf("\n");
         } 
}

for문을 반대로 적용하면서 공백을 만들어가면서 코드를 짜보면 됩니다.


2440번 문제

문제

첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ....., N번쨰 줄에는 별 1개를 찍는 문제

입력

첫째 줄에 N(1<=N<=100)이 주어진다.

출력

첫째 줄부터 N번째 줄 까지 차례대로 별을 출력한다.

예제 입력

5

예제 출력

*****

****

***

**

*

코드

#include <stdio.h>
int main()
{
    int n,i,j;
    scanf("%d", &n);
    for(i=n; i>0; i--){
     for(j=0; j<i; j++)
        printf("*");
        printf("\n");
 }
}

조금 헷갈리거나 복잡할 수 있지만 비교적 간단한 코드입니다.
원리를 파악하는게 가장 중요할 것 같습니다. 꼭 넌센스 퀴즈 같네요.

2441번 문제

문제

첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 찍는 문제
하지만, 오른쪽을 기준으로 정렬한 별 (예제 참고)을 출력하시오.

입력

첫째 줄에 N (1<=N<=100)이 주어진다.

출력

첫째 줄부터 N번째 줄 까지 차례대로 별을 출력한다.

예제 입력

5

예제 출력

*****
 ****
  ***
   **
    *

코드

#include <stdio.h>
int main()
{
int n,i,j;
    scanf("%d", &n);
    for(i=1; i<=n; i++){
     for(j=1; j<i; j++)
        printf(" ");
     for(j=n; j>=i; j--)
        printf("*");
        printf("\n");
 }
}

위에 코드와 정말 유사합니다. 잘 보시면 알겠지만 조금씩 변동을 주어서 오른쪽 정렬 왼쪽 정렬을 만들었습니다.

1924번 문제

문제

오늘은 2007년 1월 1일 월요일이다. 그렇다면 2007년 x월 y일은 무슨 요일일까? 이를 알아내는 프로그램을 작성하시오.

입력

첫째 줄에 빈 칸을 사이에 두고 x(1≤x≤12)와 y(1≤y≤31)이 주어진다. 참고로 2007년에는 1, 3, 5, 7, 8, 10, 12월은 31일까지, 4, 6, 9, 11월은 30일까지, 2월은 28일까지 있다.

출력

첫째 줄에 x월 y일이 무슨 요일인지에 따라 SUN, MON, TUE, WED, THU, FRI, SAT중 하나를 출력한다.

예제 입력

1 1

예제 출력

MON

코드

#include<stdio.h>
int main() {
 int month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 char day[7][4] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
 int count = 0;
 int x,y;
 scanf("%d %d", &x, &y);

 for(int i=0; i<x; i++) {
  if(i+1==x) {
   count += y;
  }
  else
  count += month[i];
 }
 printf("%s", day[count%7]);

 return 0;
}


전체 일수를 다 더한 다음에 7로 나누어 요일을 정하게 하는 방법입니다. day 배열의 인덱스 1이 월요일이라는 기점하에서만 적용됩니다.


8393번 문제

문제

N이 주어졌을 때, 1부터 N까지 합을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n (1 ≤ n ≤ 10,000)이 주어진다.

출력

1부터 n까지 합을 출력한다.

예제 입력

3

예제 출력

6

코드

#include<stdio.h>
int main() {
 int n, sum=0;
 scanf("%d", &n);

 for(int i=1; i<=n; i++) {
  sum += i;
 }
 printf("%d", sum);
}


비교적 간단한 코드입니다. n을 입력받을 변수를 만들고 i부터 n까지 횟수만큼 합을 저장할 변수 sum에 담고 그것을 출력합니다.


11720번 문제


문제

N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.

출력

입력으로 주어진 숫자 N개의 합을 출력한다.

예제 입력

5
54321

예제 출력

15

예제 입력2

11
10987654321

예제 출력2

46

코드

#include<stdio.h>
int main() {
 int n, sum=0;
 scanf("%d", &n);
 char s[100];
 scanf("%s", &s);
 for(int i=0; i<n; i++){
  sum += s[i] - 48;
    }
 printf("%d", sum);
}

간단한 줄 알았으나 생각보다 애먹기도 했고 복잡한 문제였습니다. 공백없이 숫자를 인식해야 해서 아스키 코드를 이용해야 하는 문제였습니다. 아스키모드에서 '0'을 빼주면, 즉 아스키코드 0의 값인 48을 빼주면 문자가 아닌 숫자의 값이 나옵니다. 문자 '1'의 아스키코드 값은 49입니다. 여기에다가 문자 '0'의 값을 빼준다면 남는 값은 1 입니다. 즉, 원래 숫자의 값이 남는 것입니다.


11721번 문제

문제

알파벳 소문자와 대문자로만 이루어진 길이가 N인 단어가 주어진다.
한 줄에 10글자씩 끊어서 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어가 주어진다. 단어는 알파벳 소문자와 대문자로만 이루어져 있으며, 길이는 100을 넘지 않는다. 길이가 0인 단어는 주어지지 않는다.

출력

입력으로 주어진 단어를 열 개씩 끊어서 한 줄에 하나씩 출력한다. 단어의 길이가 10의 배수가 아닌 경우에는 마지막 줄에는 10개 이하의 글자만 출력할 수도 있다.

예제 입력

BaekjoonOnlineJudge

예제 출력

BaekjoonOn
lineJudge

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

int main() {
 char s[101];
 int i,j;
 scanf("%s", s);
 j = strlen(s);

 for(i=0; i<j; i++) {
  printf("%c", s[i]);
  if((i+1)%10 == 0)
    printf("\n");
 }

}

솔직히 for문 활용해보기의 문제들 중에서 가장 복잡했다. 아직 실력이 많이 부족함을 여러모로 느낀다. strlen 함수를 사용했고 반복문을 돌릴 때 반복문 안에 if문으로 10으로 나눌 떄 나머지 값이 0으로 나오는 경우 즉, 문자열의 크기만큼 반복문이 돌아갈 때 i의 크기가 10으로 나눌 때 나머지 값이 0이 되면, 즉 10의 배수가 될 때 줄넘김이 발생하도록 조건을 넣어서 이 문제를 해결할 수 있다.

댓글

이 블로그의 인기 게시물

[Data Base] 2. E/R 관계성 모델에 대하여..

소소한 이야기, 잡담, 낙서, 기록을 하는 블로그입니다 ^^

[Spring Boot] 1.Spring Boot.. 개발환경 갖추기.