-
JUNGOL...172일지 2021. 12. 29. 17:42
Intermediate_Coder/그래프탐색-DFS/Tutorial: for문의 두번째 문법(range_based_for)
문제
쉬어가는 시간!
오늘은 엄청 쉬운 것을 배운다. 거저 먹기식 설명을 이해하고, 거저 먹기식 문제를 풀어보자!
크기 10의 배열이 있다고 하자.
그 배열의 내용을 출력하는 프로그램을 작성하고자 한다면 여러분들은 보통 아래와 같은 프로그램을 작성할 것이다.
#include <stdio.h> int main() { int arr[10] = {1,9,9,3,0,2,2,7,2,1}; ///예시 배열 int n; 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)를 쓰고 있다면, 무언가 잘못하고 있는 것이다.
출력 형식
문제를 읽고, 문제에서 요구하는 방식으로 출력을 한다.
입력 예
(없음)
출력 예
A B C D ....(복사-붙여넣기방지).... Y Z
Hint!
for-each문으로 배열의 원소값을 직접 변경할 필요가 있는 경우는 참조형 변수(&으로 선언)를 사용한다.
///int형 배열의 예시에서... for( int& x : arr)x=1; ///arr의 모든 원소 x를 1로 초기화.
참고로 range based for문은 C++11 이상의 버전에서만 작동한다.
RangeBasedFor.h
#include <iostream>
RangeBasedFor.cpp
void RangeBasedFor::Code() { char arr[26]; for (int i = 0; i < 26; i++) { arr[i] = 'A' + i; } for (char c : arr) { std::cout << c << ' '; } }
실행 결과 Success(100)
NadanKim/CodingTest_JUNGOL: JUNGOL 코딩 테스트를 위한 저장소 (github.com)