beepbeep

LeetCode 58번 - Length of Last Word 본문

코딩테스트 연습/기타

LeetCode 58번 - Length of Last Word

삑삑도요 2023. 1. 20. 11:26

문제 살펴보기

이번 문제는 주어진 문자열에서 가장 마지막에 위치한 단어의 길이를 계산하는 문제이다.

 

예를 들어 주어진 문자열이 "Hello World"이면, 마지막에 사용한 단어가 World이므로 그 길이인 5를 반환하면 된다.

 


생각의 흐름

처음에는 문자열을 뒤에서부터 검사해 공백을 찾은 후, 공백 다음 문자부터 문자열이 끝날때까지의 길이를 세면 된다고 생각했으나 예시로 주어진 문자열 중 끝부분에 공백이 있는 문자열이 있었다. 

 

예를 들면 " Hello World    " 같은 문자열이다. 문자열의 끝 부분에 공백이 있으므로, 앞서 생각했던 방법을 적용하면 단어를 찾을 수 없다... 

 

그래서 문자열에서 마지막으로 사용된 단어의 시작 인덱스끝 인덱스를 찾은 후, 길이를 계산하기로 했다.

 


풀어보기

 // 단어의 길이를 저장할 변수이다.
int count = 0;

// 문자열에서 '마지막으로 사용된 단어'가 끝나는 부분의 '인덱스'를 저장할 변수이다.
// 문자열의 끝부터 검사할 때 반복자로 사용하기 위해서 문자열의 길이를 대입했다.
int end = s.length();


// 공백이 아닌 글자, 즉 '마지막으로 사용된 단어의 끝 글자'를 만날 때까지
// end에서 1씩 차감하는 반복문이다.

// 마지막으로 사용된 단어의 끝 글자를 만나면 반복문이 종료되고,
// end에는 단어의 끝 글자의 인덱스 번호가 저장된다.

// end<0이면 단어가 없는 것이므로 즉시 0을 반환한다.

while(s.charAt(end-1)==' '){
    end--;
    if(end<0) return 0;
}

// 단어의 끝부터 해당 단어가 끝날 때까지, 즉 공백을 만나기 전까지 단어의 길이를 센다.

// 공백을 만나거나(s.charAt(end-1)==' ') 
// end가 0이면 더 이상 셀 필요가 없으므로 반복문을 종료한다.
while(s.charAt(end-1)!=' '){
    count++;
    end--;
    if(end==0) break;
}

return count;
// 주석 없는 전문
int count = 0;
int end = s.length();
if(end==0) return 0;

while(s.charAt(end-1)==' '){
    end--;
    if(end<0) return 0;
}

while(s.charAt(end-1)!=' '){
    count++;
    end--;
    if(end==0) break;
}

return count;

풀어보기2

제출한 후 다른 사람들의 풀이를 보니, 대부분 split을 사용해 해결한 것을 알 수 있었다.

그래서 split을 사용해서 한번 더 풀어보았다.

 

// 공백을 기준으로 문자열을 잘라 단어를 얻고, 자른 단어들로 배열을 만든다.
String[] arr = s.split(" "); 

// 배열의 마지막에 저장된 단어의 길이를 반환한다.
return arr[arr.length-1].length();

코드가 아주 짧고 깔끔해졌다!

하지만 속도나 메모리 사용량 등 성능 측면에서는 오히려 더 불리해졌다...

 

장단점이 있는 것 같다.