240403-TIL

2024. 4. 3. 22:21내일배움캠프

4월 3일

 

오늘은 옹알이를 해보겠다

 

옹알이(2)

더보기

두번째 옹알이 시간이다

 

처음 옹알이는 나름 쉽게 풀었던 기억이 있는데 두번째 옹알이는 왜 이렇게 어렵던지

 

사실 문제를 못풀어서 다른 사람의 코드를 가지고 이해하는 시간을 가져보려고한다

 

문제의 설명은 이렇다 애기는 아직 aya, ye, woo, ma 발음만 가능하고 연속해서 같은 발음을 내는건 어렵다고 한다.

 

문자열 배열 babbling이 주어졌을때? 이 babbling안에 있는 단어를 애기가 발음이 가능하다면 발음이 가능한

 

단어의 개수를 리턴하라고 한다

 

 

사실 여기까지는 손쉽게 작성을 했다. 애기가 발음할 수 있는걸 speak 문자열 배열에 다 집어두고

 

첫 반복문은 babbling의 길이만큼 안쪽의 반복문은 speak의 길이만큼 돌아준다

 

그 다음 애기가 발음할 수 있는 단어를 찾는 조건을 만들어줘야한다.

 

사실 난 처음에 Contains를 통해 speak에 들어있는 단어가 babbling에도 포함이 되어있다면?

 

answer을 1씩 올려주려고 했다. 하지만 이 방법에서는 몇가지 문제점이 있었는데

 

 Contains는 speak에 있는 단어들을 포함하고 있다면? true를 리턴하기 때문에 실제로 같은 발음을 두번해도

 

answer이 올라가는 문제가 있었고

 

두번째로는 위 그림의 입출력예 2번째를 보면 ayaayaa같이 발음이 불가능한 단어도

 

aya가 포함되어있기 때문에 카운트 되어 answer을 올려주게 되었다 그외 여러 문제도 존재했다.

 

그러한 문제 덕분에 Contains를 사용하여 문제를 푸는건 불가능 하다고 판단.

 

다른 방법을 찾아보려고 했지만 짧은 지식 덕분에 방법을 찾지 못했다.

 

그래서 해당 코드를 뜯어보면서 분석해보도록 하자

 

일단 애기는 발음을 연속해서 두번 발음하는게 불가능하다고 한다

 

그렇기에 안쪽의 반복문에서 str 변수를 만들어줘 그곳에는 두번 연속되는 발음을 넣어준다

 

그리고 babbling[i]의 문자열을 replace를 통해 바꿔주도록하자

 

이 코드를 통해 Replace와 Trim을 배우게 되었는데

 

Rplace 메서드는 현재 문자열에서 발견되는 지정된 문자열을 새로운 문자열로 바꿔주는 메서드이고

 

 

Trim은 문자열에 지정된 문자를 제거해주는 메서드인데

 

해당 코드에서 Replace와 Trim이 어떻게 활용되는지 확인해보자.

 

다시 해당 코드를 보자

 

babbling[i]를 replace하는데 초기 babbling 문자열에서 str 즉 두번 연속 발음되는 부분을 X로 바꿔주고

 

남은 문자열에서 speak[j]가 있다면 그 부분은 공백으로 바꿔주어 babbling[i] 문자를 다시 만들어 주도록하자

 

문자열이 어떻게 바뀌는지 비주얼 스튜디오를 켜서 확인해보았다

 

Test 코드에서 babbling에는 "ayaayafatherMother"을 대입해주었고

 

speak는 "aya" str은 speak+speak를 해서 "ayaaya"가 들어가게 만들어주었다

 

babbling을 Replace해서 str부분이 있다면 해당 부분을 X로 바꿔주니 결과로 "Xfathermother"이란 문자열이 나오는걸 확인할 수 있다.

 

 너무 신기한 나머지 이번엔 babbling문자열을 살짝 바꿔주었다

 

과연 중간에 있어도 replace가 정상적으로 작동을 하는지 궁금했었는데 ayaaya 부분이 father과 mother 사이에 있어도

 

해당 문자열을 기가막히게 찾아내 X로 변환해 주는 모습이다

 

이번엔 정답과 같은 방법으로 replace를 해준다음 다시 한번 replace를 해주었다 공백이면 알아보기 힘들기 때문에

 

2로 대체하여 변환하도록 시켜보았는데 father과 Mother사이에 X가 나오고 Mother뒤에 있는 aya는 2로 변환되어 

 

잘 출력되는 모습이다.

 

비주얼 스튜디오를 통해 해당 코드에서 babbling[i]가 어떻게 변환되는지 이해를 끝내니 안쪽 for문에서 babbling[i]가

 

어떻게 변환되는지 눈에 들어오기 시작했다 

 

안쪽 반복문이 끝나면 바깥에서 if문을 만나게 되는데 조건으로는 안쪽 반복문을 돌며 변환된 babbling[i].Trim()을

해주고 있다.

 

Trim 메서드는 여러 오버로드가 되어있는 모습을 확인할 수 있는데 매개변수를 아무것도 입력하지 않았다면

 

공백만을 찾아서 제거한다

 

 다시 비주얼 스튜디오를 통해 확인해보자 처음에 babbling에 replace를 통해 새로운 babbling을 만들어주고

 

babbling.Trim()을 통해 뒤에있던 공백을 제거해주니 "Babyaya" -> "Baby"로 변환된 모습이다

 

해당 if문에서는 trim을 해준 babbling[i]의 길이가 1보다 작다면 answer을 올려주는데

 

정상적으로 아기가 발음을 할 수 있는 단어라면 Replace한 babbling에는 공백만이 남아있을꺼고

 

공백만이남은 babbling[i]를 Trim()해주면 해당 babbling[i]에는 아무것도 들어있지 않으니 당연히 길이가 1보다 작을수 밖에 없을것이다 그러니 해당 babbling[i]는 발음을 할 수 있다는 것이고 그때 answer을 1 올려주면 된다

 

휴! 정말 이해하는데 어려웠다.

 

 

당연히 정답~

 

오늘은 다른 사람의 코드를 해부해 보는 시간을 가졌다.

 

덕분에 Replace와 Trim이 어떻게 동작하는지 확실히 이해했다.

 

문자열을 컨트롤 하는건 아무래도 알고리즘 문제로 자주 나오는듯 싶으니

 

풀이 방법을 잘 기억해두도록 하자

 

4월 3일 TIL은 여기서 마치도록 하겠다.

'내일배움캠프' 카테고리의 다른 글

240409-TIL  (0) 2024.04.09
240404-TIL  (0) 2024.04.04
240402-TIL  (0) 2024.04.02
240401-TIL  (0) 2024.04.01
240329-TIL  (0) 2024.03.29