페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#4698

Tutorial: for문의 두번째 문법(range_based_for) 1초 4MB

문제

쉬어가는 시간!

오늘은 엄청 쉬운 것을 배운다. 거저 먹기식 설명을 이해하고, 거저 먹기식 문제를 풀어보자!

 

크기 10의 배열이 있다고 하자.

그 배열의 내용을 출력하는 프로그램을 작성하고자 한다면 여러분들은 보통 아래와 같은 프로그램을 작성할 것이다.​

#include <stdio.h>

int main()
{
    int arr[10] = {1,9,9,3,0,2,2,7,2,1}; ///예시 배열

    for(int i=0; i<10; i++)
        printf("%d ", arr[i]); ///고전적인 방법
    return 0;
}

arr[i]라는 표현은 사실 2차적인 해석을 요구하는 표현이다.

우리말로 읽으면 arr배열의 i번째 원소가 된다.

여기서 잠깐 생각해 보자.

''''''

"i번째"라는 말이 그렇게 큰 의미가 있을까?

예를 들어 주어진 문제가 홀수 번째만 출력하는 것이거나, 역순으로 출력하는 것 이라면 위와 같이 인덱스 i를 이용하여 "몇 번째 원소"인지를 알 필요가 있다.

그러나, 위 프로그램에서 우리는 인덱스 i 자체에는 관심이 없다! i가 아닌 arr[i], 즉 arr배열의 i번째 원소에만 관심이 있는 것이다.

''''''

이런 경우에는 배열의 각 원소에 대해서 순회하는 방법이 조금 더 적합하다. 아래 코드는 위 코드와 같은 일을 하는 코드이지만, 반복 변수 i를 사용하지 않는 방법을 보여준다.

​#include <stdio.h>

int main()
{
    int arr[10] = {1,9,9,3,0,2,2,7,2,1}; ///예시 배열
    int n;
    
    for(int element: arr)
        printf("%d " , element); ///arr 배열의 각 원소 element에 대하여

    return 0;
}

위 for문을 보면, 우리가 아는 for문과 구조가 조금 다르다는것을 알 수 있다.

우리에게 익숙한 for문은 다음과 같은 구조이다.

for(① ; ② ; ③)

{

}

여기서 ①은 반복 시작 시 딱 한번 실행되는 문장,

②는 반복문의 중괄호 안(body)로 들어가기 위한 조건

③은 반복문이 돌아올 때마다 다시 실행되는 문장이다.

이번에 새로 배우는 for문은 다음과 같은 구조이다.

for( ①:② )

{

}

②에는 배열 이름이 들어가고,

①에는 배열을 구성하는 원소들과 같은 자료형으로 된 변수를 하나 선언하는 방식이다.

매 반복마다 ①에서 선언한 변수가 맨 앞의 원소부터 뒤의 원소의 순서로 차례대로 대입이 된다.​

 

문장을 영어(를 직역한 우리말)로 읽으면 더 직관적이다. 

for(int element : arr)

"For each element in arr..." (배열(arr)안의 모든 원소(element)에 대하여 ...)

i를 생략하면서 오는 직관성 때문에, 그리고 무엇보다도 "i번째"라는 의미없는 인덱스를 생략할 수 있기 때문에,

for-each문 또는 range-based for문으로 불리는 이 문법은 코드의 가독성을 향상시키는데 상당한 도움을 준다.

이제 Intermediate Coder에서 가장 쉬울 것으로 추정되는 문제를 풀어보고 다음 문제로 넘어갈 수 있도록 하자.

[ 문제 ]

크기 26의 문자형(char) 배열을 선언하고,

for문의 고전적인 문법( for(①;②;③) )을 이용하여 각 원소들을 앞에서부터 'A'부터 'Z'까지로 채운 후에,

오늘 새로 배운 for-each문( for( ①:② ) )을 통해서 각 원소들을 출력하라.​ 


입력

입력은 없다. 습관성 행동으로 scanf(또는 cin)를 쓰고 있다면, 무언가 잘못하고 있는 것이다.


출력

문제를 읽고, 문제에서 요구하는 방식으로 출력을 한다.


예제1

입력
()
출력
ABCD....(-)....YZ


출처

ohjtgood

역링크