Leet Code - 58. Length of Last Word(C++)

포타토·2020년 1월 19일
0

알고리즘

목록 보기
27/76

예제: Length of Last Word

문제
Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the length of last word (last word means the last appearing word if we loop from left to right) in the string.

If the last word does not exist, return 0.

Note: A word is defined as a maximal substring consisting of non-space characters only.

Example:

Input: "Hello World"
Output: 5

풀이

언뜻 보면 굉장히 간단해 보이지만, 많은 예외 케이스가 숨어있는 문제이다.
대표적으로 필자가 틀렸던 케이스들과 해결법을 보자.

  1. ""
    빈 문자열이 오는 경우이다. 이는 간단히 s.size() == 0 일 때 return 0을 해주는 것으로 처리하였다.

  2. " "
    공백 문자열이 오는 경우이다.
    필자는 start = -1, end = -1 두 개의 index의 차를 통해 답을 구하는데, 이는 아래와 같다.

for (int i = s.size() - 1; i >= 0; i--) {
	if (end == -1 && s[i] != ' ') {
		end = i;
	}
	else if (end != -1 && s[i] == ' ') {
		start = i;
		break;
	}
}

위 for문을 보면, 공백이 아닌 부분에서 end가 처음 결정된 후, 다음 공백에서 start의 위치가 결정된다.
end 인덱스가 결정되지 않으면 start 또한 계속 -1이다. 따라서, 공백 문자열인 경우 end = -1, start = -1이 되어 둘의 차는 0이 된다.

  1. "a "
    단순 첫 번째 공백만 찾는다면 이 케이스에서 오답에 걸린다.
    필자는 위에서 설명햇듯이, 공백이 아닌 부분에서 처음 end의 위치가 결정되기 때문에 이 케이스에서 end의 위치는 0이 될 것이다.
    그 다음 공백이 없기 때문에 start는 -1이 될 것이고, 둘의 차는 1이 된다.

이 정도 예외만 잘 처리해 준다면, 정답에 도달할 수 있을 것이다.
풀이 방법이야 여러가지 기발하고 다양한 풀이 방법이 있을 것이다.

다음은 전체적인 소스코드이다.

소스 코드

class Solution {
public:
	int lengthOfLastWord(string s) {
		if (s.size() == 0) return 0;

		int start = -1, end = -1;
		for (int i = s.size() - 1; i >= 0; i--) {
			if (end == -1 && s[i] != ' ') {
				end = i;
			}
			else if (end != -1 && s[i] == ' ') {
				start = i;
				break;
			}
		}

		return end - start;
	}
};

풀이 후기

이번 문제는 예외처리의 중요성이 강조되는 문제라고 생각한다.
틀린 테스트 케이스를 보며 코드를 수정하는 것이 아닌, 여러 예외 처리를 생각하며 처음부터 코딩을 해야 실력 향상에 훨씬 많은 도움이 되겠지.. 필자가 앞으로 해 나가야 할 방향이다.

profile
개발자 성장일기

0개의 댓글