TIL17_코드카타 5

이동하·2021년 1월 4일
0

CodeKata

목록 보기
5/5
post-thumbnail

Week2_Day1

문제

1~3999 사이의 로마자 s를 인자로 주면 그에 해당하는 숫자를 반환해주세요.

  • 로마자를 숫자로 읽는 방법은 로마자를 왼쪽부터 차례대로 더하면 됩니다.

    • III = 3
      XII = 12
      XXVII = 27
      입니다.
  • 그런데 4를 표현할 때는 IIII가 아니라 IV 입니다.
    뒤의 숫자에서 앞의 숫자를 빼주면 됩니다.
    9는 IX입니다.

  • I는 V와 X앞에 와서 4, 9
    X는 L, C앞에 와서 40, 90
    C는 D, M앞에 와서 400, 900

문제 접근 방식

  • 로마자를 객체로 만든다
  • 숫자 4와 9, 40, 90, 400, 900이 만들어지는 과정을 식으로 풀어준다

해결 코드

코드 해설

  • 결과값을 담을 result를 생성해줬습니다.
  • 인자값을 split() 함수를 사용해서 ''로 나눠줬습니다.
  • 로마 숫자 표기법을 객체로 담아줬습니다.
  • 배열이 된 인자값을 for문을 사용해서 반복해주고 그 안에 if문을 사용해서 로마자를 숫자로 변환하기 위한 조건문을 작성해줬습니다.
  • 로마자 IV가 4가 되는 식은 앞에 있는 로마자 I가 뒤에 있는 라마자 V보다 작아서 뒤에 있는 로마자 V에서 앞에 있는 로마자 I자를 빼줬습니다. 9, 40, 90, 400, 900이 만들어지는 원리도 동일합니다.
  • 이 식을 기본으로 for문과 if문을 사용해서 인자값에서 앞에 있는 로마자와 뒤에 있는 로마자를 비교하는 식을 만들어 줍니다.
  • 식을 만드는 과정에서 인자 길이의 -1만큼 반복하는 이유는 두 로마자를 비교할 때 앞, 뒤의 로마자를 비교하는 것이기에 i 번째와 i+1 번째의 로마자를 비교하고 i번째 로마자가 나타내는 숫자를 result에서 빼하는 것인지 더하는 것인지 결정하게 되는 것인데 그렇다면 s.length만큼 돌면 마지막 로마자는 비교할 i+1 로마자가 게 됩니다. 그러므로 for문에서 s.length에서 -1을 해줘서 마지막 로마자는 for문과 if문에서 제외하고 마지막에 결과값을 반환할 때 더해줬습니다.

모델 솔루션

후기

  • 모델 솔루션에 나와있는 것처럼 map() 함수를 사용할 수 있습니다. 코드가 깔끔해졌습니다.
  • 하지만 모델 솔루션보다 map() 함수를 사용하지 않은 해켤 코드가 더 재미있어 보입니다.
  • map() 함수의 다양한 형태를 공부해야겠습니다.
profile
개발자를 꿈꾸며 오늘을 채워 내일을 그리고 있습니다 :)

0개의 댓글