본문 바로가기
Algorithm

백준 baekjoon 단계별로 풀어보기 - 3. for문 사용해보기

by 리코더@typing4life 2018. 4. 26.

안녕하세요! 꼬부기입니다.

백준 단계별로 풀어보기 for문


이번에는 백준 단계별로 풀어보기 중에 3번째 문제집인 'for문 사용해보기'에 대한 포스팅을 하려고 합니다. 단계 별로 풀어보기 문제집에서 7번까지는 사용하는 언어의 기본을 익히는 내용이고, 8번 '규칙 찾기'부터 슬슬 머리를 써야하는 문제들로 이루어져 있습니다. 따라서 7번에 대한 포스팅까지는 간단한 설명과 함께 제가 짠 C언어 코드가 어떤식으로 이루어져 있는지 참고하면서 공부하는게 도움이 될 것이라고 생각됩니다.

1. 백준 2741번 - N 찍기

백준 2741번

이 문제는 말그대로 반복문을 연습해보는 기본 문제입니다. 프로그래밍을 처음 접하는 사람들에게는 모든 것이 익숙치않아 어렵게 느껴질 수 있지만, 연습만 조금 하고나면 가장 많이 사용하게 될 for문입니다. 문제에서 주어지는 자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하라고 그랬으니 반복문이 돌 때마다 출력과 개행문자를 같이 써주어야 정답을 받으실 수 있습니다. 다음 문제인 '2742번 - 기찍 N'은 이 문제를 반대 순서로 출력하면 되는 문제입니다. 따라서 for문을 작성하실 때 초기값을 0부터가 아니라 N부터 1까지 1씩 감소하게끔 설정하면 간단하게 해결할 수 있습니다.

2. 백준 2739번 - 구구단

백준 2739번

구구단 문제는 정수 N을 입력 받고, 구구단 N단을 예제와 같이 출력하면 되는 문제입니다. for문을 작성할 때 초기값을 1부터 9까지 돌리고, 그 값에 N값을 곱해서 출력하면 됩니다. 코드는 다음과 같습니다.

3. 백준 2438번 - 별찍기 1

백준 2438번

별찍기 문제는 for문을 연습할 때 결과가 눈으로 보이기 때문에 참 좋은 연습 예제라고 생각합니다. 이 문제는 입력되는 정수 N에 대해서 1~N번 줄까지 출력을 하되 해당 줄에 별을 줄 번호만큼 출력하면 되는 문제입니다. 예제에서는 입력이 5가 들어왔을 때 총 5줄에 별을 출력하는 결과를 볼 수 있습니다. 이 문제의 답은 다음과 같습니다.

이어지는 문제인 별찍기 2 문제는 이를 오른쪽 정렬로 출력하는 문제입니다. 따라서 왼쪽에 공백을 적절한 개수만큼 넣어주어야 끝나는 지점이 모두 일치하게 됩니다. 방법은 현재 출력하고자 하는 줄 번호 - 1개 만큼 공백을 출력하면 됩니다. 코드는 다음과 같습니다.

이 문제집에 별찍기 문제는 총 4개입니다. 나머지 2개는 위의 두 문제를 아주 조금만 변형시키면 해결할 수 있습니다. 따라서 다음 문제 종류로 바로 넘어가겠습니다.

4. 백준 1924번 - 2007년

백준 1924번

2007년 문제는 2007년 1월 1일이 월요일일 때, x월 y일이 무슨 요일인지 찾아내서 영어 약자로 출력하는 문제입니다. 저는 접근 방법을 각 달별로 일수가 다르기 때문에, 해당 월의 일수에 맞추어 1월 1일로부터 찾고자 하는 날짜가 며칠 차이가 나는지 계산을 했습니다. 그 후에 이 계산한 일수를 7로 나누어 나머지를 구한 다음 해당 요일을 출력하도록 했습니다. 단, 나머지가 0으로 딱 떨어지는 경우는 '월요일'이 아니라 '일요일'인 것을 주의해야 합니다. 코드는 다음과 같습니다.

5. 백준 8393번 - 합

백준 8393번

이 문제는 입력으로 들어오는 정수 N에 대해서 1부터 N까지의 합을 출력하는 문제입니다. 이 문제는 문제집의 용도에 맞게 for문을 사용해서 해결할 수도 있지만, 더 간단한 공식으로도 풀 수 있는 문제입니다.

for문으로 해결하고자 한다면 초기값=1 부터 N까지 1씩 증가하면서 ans += i 이런식으로 0으로 초기화된 변수에 더하는 작업을 반복한 뒤 출력하면 됩니다.
하지만 고등학교 때 배웠던 공식을 사용하면 N*(N+1) / 2 로도 구할 수 있습니다.

6. 백준 11720번 - 숫자의 합

백준 11720번

11720번 예제

이 문제는 입력이 두 가지가 들어온다. 첫번째는 뒤에 입력으로 들어올 정수의 개수를 의미하는 N과, 그리고 둘째 줄에는 한 자리 숫자 N개가 공백없이 들어온다. 따라서 예제 입력 3과 같이 입력 개수가 클 경우 int자료형 하나로 전체를 받아서 해결할 수 없고, 문자열을 이용하거나 한 자리의 정수를 반복해서 입력받는 방법을 이용해야 한다. 여기서는 for문을 연습하는 부분이므로 반복문을 사용해서 한개의 정수를 이용해 답을 출력하는 코드를 작성해보았다. scanf를 사용할 때 "%1d"를 쓸 경우 1자리의 정수 단위로 입력을 받을 수 있다.

7. 백준 11721번 - 열 개씩 끊어 출력하기

백준 11721번

11721번 예제

이 문제는 문자열과 반복문을 동시에 다룰 수 있는 문제이다. 입력으로 주어진 단어를 열 개 문자 단위로 끊어서 한 줄에 하나씩 출력하는 문제이다. 만약 단어의 글자 수가 10의 배수가 아닐 경우에는 마지막 줄에 나머지 글자를 출력하면 된다. 한 단어의 길이는 100개를 넘지 않기 때문에 크기가 100인 char 배열을 생성해서 문자열 입력을 받고, for문 혹은 while문을 이용해서 문자열의 출력해야할 위치가 NULL이 아닐 경우 출력하면서 10개를 출력했을 경우 개행하도록 코드를 짜면 된다. 다음 코드는 while을 이용해서 작성하였다.

8. 백준 15552번 - 빠른 A+B

이 문제는 C++의 iostream을 이용해서 cin/cout을 쓰거나 다른 언어의 경우 시간이 조금 더 걸리는 입출력 방식을 사용해서는 안되는 문제이다. 다행히도 C언어의 scanf와 printf는 예외 사항이므로, 입력으로 주어지는 테스트 케이스 T만큼 반복하면서 입력을 받으며 A+B의 결과를 출력하면 된다. 코드는 다음과 같다.

여기까지 따라오시느라 고생하셨습니다!
다음 포스팅에서는 단계별로 풀어보기의 4번째 단계인 if문 사용해보기에 대해서 포스팅하겠습니다!

반응형

댓글