본문 바로가기
C#/프로그래머스

[프로그래머스] C# : 가운데 글자 가져오기

by TODAYCODE 2021. 8. 1.
반응형

프로그래머스 코딩테스트 연습 Level 1 - 가운데 글자 가져오기

 

코딩테스트 연습 - 가운데 글자 가져오기

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다. 재한사항 s는 길이가 1 이상, 100이하인 스트링입니다. 입출력 예 s ret

programmers.co.kr

 

문제의 핵심

1. 문자열 잘라서 가져오기

2. Substring메소드 사용하기

 


나는 그냥 가장 단순하게 해결했다.

문자열의 길이가 짝수인지 홀수인지 구분해서 각 조건에 맞게 answer에 더하는 방식으로 풀었다.

문제 해결 후 다른사람들의 코드를 보다가 좋은 코드가 보이길래 그것을 리뷰해보고자 한다.

 

우선, 내가 처음 풀었던 방식은 매우 원초적이라서 설명할 게 없다.

그래도 일단 정답 코드로 하단에 올려두었다.

이제 Substring 메소드를 사용한 방식을 알아보도록 하자.


 

Substring 메소드는 문자열을 잘라주는 기능을 한다.

나는 Substring 메소드를 몰랐고, [A..B] 이런 방식으로 자르는 방식만 알고 있었다.

그런데 프로그래머스는 내가 아는 방식이 지원이 안된다...

그래서 골치아팠는데 Substring메소드를 사용하면 되는 것이었다.

그럼 Substring메소드의 사용법을 알아보자.

 

Substring 메소드 사용법

이 메소드는 문자열에 .을 찍고나서 사용할 수 있다.

str.Substring( 매개변수1, 매개변수2 ) 이런 식이다.

 

여기서 매개변수1은 문자열을 자르기 시작할 index값을 의미한다.

당연히 0부터 시작하고 문자열 범위를 벗어나면 안된다.

 

매개변수2는 어느길이만큼 자를 것인지를 의미한다.

1이면 한글자, 5라면 5글자이다. index값을 뜻하는게 아님을 주의하자.

매개변수2를 생략한다면 문자열의 끝까지라는 뜻이다.

 

 

문제 풀이 노하우

Substirng 메소드를 알았다고 해서 문제를 풀 수 있는 것은 아니다.

이걸 응용해서 풀 수 있는 아이디어를 떠올릴 수 있느냐가 중요한 것이다.

 

문제를 잘 살펴보면,

홀수인 경우는 가운데의 한글자만 출력하면 되고 짝수는 가운데 두글자를 출력해야한다.

 

첫번째 목표

즉 Substring의 매개변수2(몇글자 출력할것인지)의 값이 홀수는 1, 짝수는 2가 되어야한다.

 

두번째 목표

매개변수1의 값은

홀수인 경우는 문자열길이의 절반이고, 짝수는 문자열길이의 절반에서 -1 값이 된다.

 

이제 조건문을 사용해주면 간단하겠지만, 조건문조차 사용하지 않는 방법이 있다.

이 2가지의 매개변수를 교묘하게 잘 이용하는 것이다.

 


첫번째로 매개변수2가 홀수일때는 1, 짝수일때는 2가 나올수밖에 없도록 계산식을 구현한다.

홀짝 구분은 %2 로 구현하므로 여기에 연동해보자.

 

매개변수2 = s.Length % 2

이렇게 하면 홀수는 1, 짝수는 0이된다.

이렇게 하지말고 약간 변형이 필요하다.

문자열길이에 +1을 해서 계산을 하면 결과가 역으로 나온다.

 

매개변수2 = (s.Length+1) % 2

홀수는 0, 짝수는 1이 된다.

이제 매개변수2를 넣어줄 때 그냥 넣지 말고 +1을 해서 넣자.

그러면 무조건 홀수는 1, 짝수는 2가 된다.

이러면 첫번째 목표가 달성되었다.

 

두번째 목표는 홀수는 문자열길이의 절반 값, 짝수는 절반 -1 의 값이었다.

이번에도 조건문 없이 구현해야한다. 일단 절반값을 써주자.

매개변수1 = s.Length/2

이러면 홀수나 짝수나 둘다 절반값이된다.

짝수일때만 -1이 되어야한다.

 

그런데 아까 매개변수2를 구할때를 다시 돌아보자.

매개변수2는 홀수일때 0, 짝수일때는 1이었다.

즉, 매개변수 1 = (s.Length/2) - 매개변수2 를 해준다

홀수는 - 0 이라서 절반값이고

짝수는 -1이라서 절반-1이 된다.

 

즉, 모든 목표가 달성되었고

이를 토대로 그대로 코드를 작성하면 된다.

 

 

홀수와 짝수를 뒤집어서 사용해야하는 아이디어를 떠올려야해서

굉장히 낯설 수 있지만,

조건문을 전혀 사용하지 않는다는 점에서 굉장히 메리트가 있는 아이디어라고 생각한다.

익숙해지도록 반복해서 본인의 것으로 만들자.

 

 

 

 

 

정답 코드 : 직접 찾아서 자르기

public class Solution {
    public string solution(string s) {
        string answer = "";
        
        // 짝수인경우 - 문자열 길이의 절반과 -1까지, 2개가 중간글자
        if(s.Length %2 == 0){
        // 각 글자를 더해줌
            answer += s[s.Length / 2  - 1];
            answer += s[s.Length / 2];
        }
        else{ // 홀수는 문자열길이의 절반이 중간글자
            answer += s[s.Length / 2];
        }

        return answer;
    }
}

정답코드 : Substring 메소드 사용

public class Solution {
    public string solution(string s) {
    // 문자열길이 + 1에서 2로 나눈 나머지를 구한다 => 홀수면 0 / 짝수면 1
        int num2 = (s.Length + 1) % 2;
        
        // 문자열길이의 절반에서 n을 뺀다. -> 홀수면 절반 / 짝수면 절반-1
        int num1 = (s.Length / 2) - num2;
        
        return s.Substring(num1, num2 + 1);
    }
}
반응형

댓글