본문 바로가기
Ocaml

[99 Problems in OCaml] 16번, 18번 문제

by seungh2 2021. 9. 24.

99 Problems in OCaml

https://ocaml.org/learn/tutorials/99problems.html

 

99 problems – OCaml

Your Help is Needed Many of the solutions below have been written by Victor Nicollet. Please contribute more solutions or improve the existing ones. 99 Problems (solved) in OCaml This section is inspired by Ninety-Nine Lisp Problems which in turn was based

ocaml.org

 

16번 문제

  • drop
    • drop list idx
    • list에서 idx번째 원소를 버린다. (index는 1부터 시작한다.)

 

내가 구현한 코드

idx 전의 원소를 누적해두는 ans를 사용하여 문제를 해결하였다.

idx 전의 원소들은 ans에 누적하고 ans의 크기가 idx -1과 같다면 ans와 l을 반환한다.

 

정답이라고 나와있던 코드

List.rev를 사용하지 않고 재귀호출한 값과 ::를 사용하여 해결하였다.

코드를 살펴보다가 이상한 점이 있어서 input을 [1; 2; 3; 4; 5; 6; 7]으로 number를 3으로 넣어봤더니 역시 이상하게 결과가 나왔다.

3번째 인덱스의 원소만 지워진 것이 아니라 6번째 인덱스의 원소도 지워졌다.

코드를 보면 i == number 일 때 aux 1 t 로 i를 다시 1로 만들어주기 때문에 3의 배수 인덱스의 원소를 모두 지워준다.

 

고친 정답 코드

i == number 부분에서 t를 그냥 반환해주면 된다.

 

test 결과

 

18번 문제

  • slice
    • slice list start end
    • list의 start번째 원소부터 end번째 원소까지를 담은 리스트를 반환한다.
    • 이때 index는 0부터 시작한다.

 

내가 구현한 코드

answer는 n이 start보다 작으면 무시하고 start와 finish 사이면 누적한다. 그리고 finish와 n이 같다면 [e]를 반환하며 재귀를 끝낸다.

 

정답 코드

정답 코드는 drop을 이용해서 input의 i번째 전의 원소를 모두 버린다. 그리고 그렇게 구한 list에서 take를 이용하여 k-i+1개의 원소를 가져온다.

 

test 결과

 

 

728x90

댓글