[백준/파이썬] 2741번 N 찍기 풀이

업데이트:



문제 정보


풀이

문제

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

코드

a = int(input())

for i in range(a):
    print(i+1)

설명

반복문을 사용하는 문제입니다.

파이썬은 c스타일과 다르게, for문에서 i를 카운트로 사용하지 않습니다.

좀 더 정확히 표현하면, 오리지널 c스타일은

for(초기화; 조건검사; 증감식)으로 구성되어 제일 처음 초기화 식이 호출되고, 조건검사 부분이 true인 경우 계속 실행되고, 한번의 루프가 끝나면 증감식이 실행되는 방식이죠.

반면, 파이썬에서는 for loop를 for each루프만을 지원합니다.

for each loop란 Iterable한 객체의 아이템을 하나씩 반복한다는 뜻입니다.

… Iterable은 또 무엇일까요? 직역하자면 ‘반복 가능’ 이라는 뜻입니다. Array, List 등의 객체가 일반적으로 ‘반복 가능’한 객체입니다.

파이썬에는 여러가지 반복 가능한 객체가 있는데, 그중 대표적으로 range객체가 있습니다. range 객체는 다음과 같이 생성합니다

range(b) -> (0, 1, 2, ..., b-1)으로 구성된 range 객체 생성

range(a, b) -> (a, a+1, a+2, ..., b-2, b-1)로 구성된 range 객체 생성

range(a, b, c) -> (a, a+c, a+2*c, ..., b-2*c, b-c)로 구성된 range 객체 생성

즉, range(a, b, c)에서 a는 초기값, b는 끝값, c는 증감할 값을 넣어주면 됩니다.

여기서, 위와같이 a와 c는 생략가능합니다.

그런데 한가지가 의문입니다. b는 끝값인데 왜 생성된 range 객체에는 b가 포함되어 있지 않을까요?

그 이유는 전통과 편의성입니다.

다시 c스타일의 예를 들어볼까요?

for(int i=0; i<10; i++) {
  ...
}

위와 같은 방식이 일반적으로 작성했을 반복문 입니다. 이경우 시작값 0, 끝값 10일때 i는 0~9의 값을 갖는다는걸 알 수 있죠.

객체 및 메모리 주소 관리 등 여러 분야에서 0부터 시작하며 끝값은 포함하지 않는 전통이 있습니다.

시작이 0부터인건 많은 언어, 하드웨어에서 이러한 방식을 채택했기 때문으로, 범용적으로 사용되고 있습니다.

그렇다면 끝값은 왜 포함하지 않을까요? 바로 편의성때문입니다.

range(10)을 이용해 for 반복문을 짰는데, 11번 반복한다면 이상하겠죠? 그렇다면 range(9)로 써야하는데 이런 표현은 자연스럽지 못하잖아요?

0부터 시작한다는 조건을 가지면서 자연스럽게 작성하려면 이런 모양이 될 수 밖에 없었던 것입니다.

실제로도, 이렇게 사용하는 편이 가독성도 좋고 변수관리도 매우 쉽습니다.



자, 그럼 다시 본론으로 돌아가보죠.

for i in range(n)의 문장이 가지는 뜻은 무엇일까요?

range(n)객체를 생성해서, 그 아이템을 i에 배정하며 반복한다는 뜻입니다!

덧붙여서, 파이썬에서는 문자열도 Iterable 객체입니다.

즉,

for c in "반복문출력":
    print(c)

위문장의 결과값은

반
복
문
출
력

이렇게 나오게 됩니다.



댓글남기기