D - 5!

톺아보기 1

톺아보기 2

 

이전 톺아보기 글에서 C언어로 이뤄진 재귀함수 문제를 제대로 못 풀었다.

이 때 나는 C언어를 아예 몰랐으니..

 

하지만 현재의 나?


"CS50을 통해 Havard의 C언어를 배운사람."

 

다시 풀어보자.

밑에 나올 함수들의 파라미터에 5를 넣은 값을 찾아야한다.

-draw1의 의사코드-

 

1. 정수형 파라미터를 받는 draw1을 설정한다.

 

2. h가 0이라면

2-1 void를 리턴한다.

2-2. 그게 아니라면 draw1(h-1)을 실행한다. - 재귀

 

3.정수형 i는 0인데(초기 값) i가 h와 같아질 때까지 i에 1을 더하면서 반복한다.

ㄴ> 같아질 때 까지인 이유는 i와 h의 차이가 1일 때, 그것을 판별하고 i++(i += 1)가 실행되기 때문이다.

그래서 i = 5가 될 때 까지 *은 0~0, 0~1, 0~2, 0~3, 0~4번의 반복으로 별을 찍는다.

 

3-1. h만큼 별을 찍는다.

ㄴ> 여기서 포인트는 h에 5를 넣었을 때, void(값 없음)을 찍고, draw(1)부터 시작해서 기존의 draw(h)까지 순차대로 온다는 점이다. 그 이유 때문에 별(*) 하나부터 시작한다.

 

3-2. h만큼 찍었다면 개행해주고 for문으로 돌아간다.

 

따라서, draw(1)은 * ** *** **** *****가 된다.

 

사실 지금 풀이는 정확하지 않다.

밑에서 계속!


이 녀석이 왜 * ** *** ****인지 알아내야한다

얘는 의사코드말고, h가 5라고 생각하고 그냥 추적해보자.

o = 0, o < 5 이므로 o += 1이 되고,

i = 0, i < 1 이므로 i += 1이 되고,

별을 한번 찍고,

1 < 1이 아니므로,

개행한다.

 

o = 1, o < 5 이므로, o += 1이 되고,

i = 0(새로 시작한다), i < 2 이므로 i가 2가 될때까지

별을 두번 찍고,

2 < 2가 아니므로,

개행한다.

 

... 얼레리?

동일한 것 아닌가..?


진짜로 드디어 해결했다. 마참내 답을 찾았다.

C언어와 파이썬의 차이였다. (아닐 수도 있는데 아무튼 맞음)

 

파이썬에서 생각한 것
o++을 더하고 시작하는 것이 아니었다.

그래서 위의 draw1은 단순히 h==0일때까지 해주므로  draw1(5,4,3,2,1,0)이어서 5개까지 찍힌거였고,

draw2는 o가 (0,1,2,3,4)이고, i는 o가 (1,2,3,4)일 때 (0,1,2,3)으로 동작하므로 4개까지 찍히는 것이었다.

 

즉, 0일 때 o++라고 o에 1 더하고 시작하는게 아니었다!

 

하하하.. 드디어 알아냈네.. 휴...


 

함수 구현에 대한 해석이 올라왔다.

출제의도에 알맞게 잘 만들었는지 확인해보자.

 

파이썬 해설은 아쉽게도 없지만!

 

지금 보니까 list를 sort해줘야 answer에서 오름차순에 따라 틀리지 않게 중복횟수를 나타낼 수 있을 것 같다.

1. 함수선언 했는가? 

Yes

 

2. 함수 내부에서 배열을 탐색했는가?

Ye..s? - 카운트해서 중복인 것을 '직접' 찾는 걸 원한 것 같다.

 

3. 배열의 앞뒤 값을 비교하고, 중복되는 횟수를 카운트 했는가?

Ye...s - 파이썬이 해줬다..

 

4. 배열과 다른 Set나 Map 혹은 Dict을 이용했는가?

No

 

출제의도에 맞게 직접 짜보자.


주석을 많이 달기도 했고, 코드가 많이 번잡해졌다.

1. 함수선언 했는가?

Yes

 

2. 함수 내부에서 배열을 탐색했는가?

Yes

 

3. 배열의 앞뒤 값을 비교하고, 중복되는 횟수를 카운트 했는가?

Yes

 

4. 배열과 다른 Set나 Map 혹은 Dict을 이용했는가?

Yes

 

일단은 의도한 대로 답을 도출해내는 데에는 성공한 것 같다!

복사했습니다!