단어 s의 가운데 글자를 반환하는 함수를 만든다.
단어의 길이가 짝수라면 가운데 두 글자를 반환한다.
| s | return |
|---|---|
| "abcde" | "c" |
| "qwer" | "we" |
import java.util.Arrays;
class Solution {
public String solution(String s) {
String answer = "";
boolean ntype = false;
char[] chr = s.toCharArray();
int len = chr.length - 1;
if (len % 2 == 0) {
answer = String.valueOf(chr[len / 2]);
} else {
answer = String.valueOf(chr[len / 2]) + String.valueOf(chr[len / 2 + 1]);
}
return answer;
}
}
len이라는 변수명을 썼는데, 실제로 담긴 값은 마지막 인덱스 (length - 1)였다.
이름은 "길이"인데 실제로는 "인덱스"를 담고 있으니, 나중에 읽으면 헷갈릴 수밖에 없다.
int len = chr.length - 1;
if (len % 2 == 0) // 이게 문자열 길이 홀짝 판별인가? 인덱스 홀짝 판별인가?
s.length()가 홀수면 → len은 짝수 → len % 2 == 0 진입 → 한 글자 반환 ✅s.length()가 짝수면 → len은 홀수 → else 진입 → 두 글자 반환 ✅결과는 우연히 맞았지만, 의도와 코드가 뒤바뀐 상태였다.
읽는 사람 입장에서는 왜 length - 1로 홀짝을 판별하는지 이해하기 어렵다.
import java.util.Arrays; // 사용 안 함
boolean ntype = false; // 사용 안 함
int idx = chr.length - 1; // "마지막 인덱스"임을 이름으로 드러냄
인덱스 계산은 idx로, 홀짝 판별은 s.length() 직접 사용
if (chr.length % 2 == 0) { // 짝수 길이 → 두 글자
answer = String.valueOf(chr[idx / 2]) + String.valueOf(chr[idx / 2 + 1]);
} else { // 홀수 길이 → 한 글자
answer = String.valueOf(chr[idx / 2]);
}
toCharArray() 없이 substring으로 리팩토링char[]로 변환하지 않아도 String.substring(beginIndex, endIndex)으로 바로 추출 가능하다.
substring(beginIndex, endIndex)→ beginIndex 포함, endIndex 미포함
int idx = (s.length() - 1) / 2;
if (s.length() % 2 == 0) {
answer = s.substring(idx, idx + 2); // 두 글자
} else {
answer = s.substring(idx, idx + 1); // 한 글자
}
class Solution {
public String solution(String s) {
String answer = "";
int idx = (s.length() - 1) / 2;
if (s.length() % 2 == 0) {
answer = s.substring(idx, idx + 2);
} else {
answer = s.substring(idx, idx + 1);
}
return answer;
}
}
| 항목 | 내용 |
|---|---|
substring(a, b) | a 포함, b 미포함. Java String 기본 메서드 |
java.lang 패키지 | 자동 임포트 → import java.lang.String 불필요 |
| 변수명 원칙 | 담긴 값의 의미를 이름으로 드러내야 한다 |
| 홀짝 판별 | 인덱스(length-1)가 아닌 length 직접 사용 |
동작하는 코드도 읽는 사람이 의도를 바로 파악할 수 없으면 좋은 코드가 아니다.
len % 2 == 0이 우연히 맞았던 것처럼, 결과만 보고 넘어가면 나중에 비슷한 실수를 반복한다.
판별 기준과 계산 기준을 역할별로 분리하는 습관을 들이자.