가운데 글자 반환

나의 기록·2026년 6월 18일

코딩테스트

목록 보기
15/35

문제 설명

단어 s의 가운데 글자를 반환하는 함수를 만든다.
단어의 길이가 짝수라면 가운데 두 글자를 반환한다.

sreturn
"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;
    }
}

문제점 분석

1. 변수명이 의도를 숨기고 있었다

len이라는 변수명을 썼는데, 실제로 담긴 값은 마지막 인덱스 (length - 1)였다.

이름은 "길이"인데 실제로는 "인덱스"를 담고 있으니, 나중에 읽으면 헷갈릴 수밖에 없다.

2. 홀짝 판별 기준이 뒤섞여 있었다

int len = chr.length - 1;
if (len % 2 == 0) // 이게 문자열 길이 홀짝 판별인가? 인덱스 홀짝 판별인가?
  • s.length()홀수면 → len짝수len % 2 == 0 진입 → 한 글자 반환 ✅
  • s.length()짝수면 → len홀수 → else 진입 → 두 글자 반환 ✅

결과는 우연히 맞았지만, 의도와 코드가 뒤바뀐 상태였다.
읽는 사람 입장에서는 왜 length - 1로 홀짝을 판별하는지 이해하기 어렵다.

3. 쓰지 않는 코드가 남아 있었다

import java.util.Arrays; // 사용 안 함
boolean ntype = false;   // 사용 안 함

개선 과정

Step 1. 변수명 명확화

int idx = chr.length - 1; // "마지막 인덱스"임을 이름으로 드러냄

Step 2. 홀짝 판별 기준 분리

인덱스 계산은 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]);
}

Step 3. 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이 우연히 맞았던 것처럼, 결과만 보고 넘어가면 나중에 비슷한 실수를 반복한다.
판별 기준과 계산 기준을 역할별로 분리하는 습관을 들이자.

profile
뭐든 남겨본다

0개의 댓글