
이전 톺아보기 글에서 C언어로 이뤄진 재귀함수 문제를 제대로 못 풀었다.
이 때 나는 C언어를 아예 몰랐으니..
하지만 현재의 나?
"CS50을 통해 Havard의 C언어를 배운사람."
다시 풀어보자.
-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언어와 파이썬의 차이였다. (아닐 수도 있는데 아무튼 맞음)
그래서 위의 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 더하고 시작하는게 아니었다!
하하하.. 드디어 알아냈네.. 휴...
함수 구현에 대한 해석이 올라왔다.
출제의도에 알맞게 잘 만들었는지 확인해보자.
1. 함수선언 했는가?
Yes
2. 함수 내부에서 배열을 탐색했는가?
Ye..s? - 카운트해서 중복인 것을 '직접' 찾는 걸 원한 것 같다.
3. 배열의 앞뒤 값을 비교하고, 중복되는 횟수를 카운트 했는가?
Ye...s - 파이썬이 해줬다..
4. 배열과 다른 Set나 Map 혹은 Dict을 이용했는가?
No
출제의도에 맞게 직접 짜보자.
1. 함수선언 했는가?
Yes
2. 함수 내부에서 배열을 탐색했는가?
Yes
3. 배열의 앞뒤 값을 비교하고, 중복되는 횟수를 카운트 했는가?
Yes
4. 배열과 다른 Set나 Map 혹은 Dict을 이용했는가?
Yes
일단은 의도한 대로 답을 도출해내는 데에는 성공한 것 같다!
'Daily > 일기' 카테고리의 다른 글
침 대작전과 Piscine (2) | 2022.07.14 |
---|---|
네이버 부스트캠프 1차 코딩테스트 후기 (0) | 2022.06.27 |
CS 50, SQL, JS 찍먹 (2) | 2022.06.15 |
학교 알고리즘 소모임에 가입했다. (0) | 2022.06.14 |
네이버 부스트캠프 자가진단 톺아보기 - 2 (0) | 2022.06.13 |