본문 바로가기

Python 배우기

[외계어 배우기] 반복문(문제#6 Occupied Spaces)

iteration 반복문을 계속 공부하며 다음 문제를 해결해 보자. 

 

CCC '18 J2 - Occupy parking - DMOJ: Modern Online Judge

You supervise a small parking lot which has N parking spaces.

dmoj.ca

 

도전 과제: n개의 주차 공간을 관리 중인데, 어제 점유된 주차 공간을 기록하였고, 오늘도 기록하였다.
어제와 오늘 모두 점유된 주차 공간의 수를 표시하라.

 

입력: 입력은 세 줄이다.
1. 중차 공간의 수를 나타내는 n(정수, 1 <= n <= 100)
2. 어제 점유된 주차 공간 기록
3. 오늘 점유된 주차 공간 기록
2와 3은 각 주차 공간별로 한 문자씩 총 n개의 문자로 이루어진 문자열이다.
차가 있을 때는 C, 비어 있을 때는 .으로 나타낸다.

 

출력은 문제에서 이야기했듯이 어제와 오늘, 이틀 모두 점유된 주차 공간의 수이다. 

 

그럼 이 문제에서 루프가 존재하는 곳은 어디일까? 아마도 어제 주차 공간을 전제 하에 오늘 주차 공간을 조사하는 형식이 되어야 할 것이다. 그런데 여기에서 단순히 한 문자열의 문자들을 반복하는 것은 다른 문자열의 동일한 위치의 문자를 찾는 데 도움이 되지 않기 때문에 인텍싱을 사용하는 새로운 형태의 for 루프를 사용한다.(고 책에 셜명되어 있다.)

 

인덱싱이란 문자열의 문자 위치를 나타내며 대괄호 [ ]로 표기한다. 프로그래밍 언어는 대부분 0부터 시작한다.

 

예를 들면 더욱 빨리 이해할 수 있을 것이다.  

word = 'splore'라고 하자.

 

여기에서 주의할 점은, 빈 문자열에는 유효한 인덱스가 존재하지 않는다는 점이다. 또한 인덱스의 -1은 제일 오른쪽 문자이고 -2는 오른쪽에서 두 번째 문자... 이런 식으로 표기된다.

 

이 예제를 한번 풀어보자.

s = 'abcde'

t = s[0] + s[-5] + s[len(s) - 5]

print(t)

여기에서 s[0] 은 a 이고 s[-5] 역시 a, 그리고 len(s)는 5이므로 s[len(s) - 5]은 s[0]이므로 a이다. 즉, aaa 이다.

 

문제에서도 알 수 있듯, len(문자열의 길이)보다 큰 인덱스는 존재하지 않는다. 

 

그렇다면 이제 범위 range 루프를 알아보자. range 루프는 다음과 같이 예를 들 수 있다.

range(5)     0 1 2 3 4

range(3, 7)     3 4 5 6

range(0, 10, 2)     0 2 4 6 8

range(6, 2, -1)     6 5 4 3

규칙이 보이는가? 하나씩 풀어 설명해 보겠다. 

 

range(5)     0 1 2 3 4             --> 5까지 범위의 정수를 의미한다. 5는 표기하지 않는다.

range(3, 7)     3 4 5 6            --> 3에서 시작해서 7까지 범위의 정수를 의미한다. 7은 표기하지 않는다.

range(0, 10, 2)     0 2 4 6 8  --> 0에서 시작해서 10까지 범위의 정수를 나타내는데, 2는 증가 단위를 나타낸다. 

range(6, 2, -1)     6 5 4 3      --> 6에서 시작해서 2까지 범위의 정수를 나타내는데, -1은 감수 단위를 나타낸다.

 

덧, 실제로 range() 값을 반환하려면 list()라는 함수를 사용해야 한다. 즉, list(range()).

 

문제를 풀기 위해 범위 기반 for 루프에서 범위 내 정수들을 인덱스토 사용하여 해당 인덱스의 문자를 처리할 수 있다. 즉, 다음과 같다. 

 

물론 range 함수를 이용해서 이 문제를 풀 수 있지만, 선생님이 for char in yesterday:를 이용해서 풀어보라고 하셔서 숙제를 해 보았다.

 

반응형