본문 바로가기
Programming/Cos Pro 1급

Cos Pro 1급 - 샘플 문제 풀이 3차 4번 (substring() 활용)

by 우공80 2022. 10. 18.
728x90

문자열을 겹쳐서 연결하기

문제 지문 #4


두 문자열 s1과 s2를 붙여서 새 문자열을 만들려 합니다. 이때, 한 문자열의 끝과 다른 문자열의 시작이 겹친다면, 겹치는 부분은 한 번만 적습니다.

예를 들어 s1 = "ababc", s2 = "abcdab"일 때, 아래와 같이 s1 뒤에 s2를 붙이면 새 문자열의 길이는 9입니다.

string2.png

그러나 s2 뒤에 s1을 붙이면 새 문자열의 길이는 8로, 더 짧게 만들 수 있습니다.

string3.png

두 문자열 s1과 s2가 매개변수로 주어질 때, s1과 s2를 붙여서 만들 수 있는 문자열 중, 가장 짧은 문자열의 길이를 return 하도록 solution 메서드를 완성해주세요.


매개변수 설명

두 문자열 s1과 s2가 solution 메소드의 매개변수로 주어집니다.

  • s1과 s2의 길이는 1 이상 100 이하입니다.
  • s1과 s2는 알파벳 소문자로만 이루어져 있습니다.

return 값 설명

s1과 s2를 붙여서 만들 수 있는 문자열 중, 가장 짧은 문자열의 길이를 return 해주세요.


예시

s1 s2 return
"ababc" "abcdab" 8

 

예시 설명

문제에 주어진 예시와 같습니다.

728x90

 

혼자 풀이


메서드 전체를 작성하는 문제입니다.
두개의 문자열을 연결하되, 문자열에 중복이 있으면, 중복된 부분을 겹쳐서 연결해야 합니다.
저는 s1 뒤에 s2를 붙이는 경우와 s2 뒤에 s1을 붙이는 경우를 나누어서 코드를 짰습니다.

substring() 함수를 이용해서 문자열을 잘라서 비교했고, 
실제 문자열을 합치는 과정 없이, 겹치는(overlap) 가장 긴 길이를 구해서 반환했습니다.

자세한 설명은 아래에 주석으로 달았습니다.

/***************************************************************
  3차 4번 문자열을 겹쳐서 연결하기
 **************************************************************/
// 다음과 같이 import를 사용할 수 있습니다.

class MySolution {
    public int solution(String s1, String s2) {
        // 여기에 코드를 작성해주세요.
        int answer = 0;
        //s1의 끝과 s2의 시작을 비교한다. for 문으로 달라질때까지 비교한다.
        int shortLength=0;  //s1과 s2중 짧은 문자열의 길이
        int overlapLength=0; //s1과 s2의 중복 문자열의 길이
        int tmpOverlapLength; //더 짧은 중복 문자열의 길이
        shortLength=Math.min(s1.length(),s2.length()); //for문을 몇번 수행할지 결정한다.

        for(int i=0;i<shortLength;i++){
            //s1의 앞부분과 s2의 뒷부분 문자열을 비교한다.
            if(s1.substring(s1.length()-1-i).equals(s2.substring(0,i+1))){
                //이미저장된 overlapLength와 방금 계산한 overlapLength중 긴것을 저장한다.
                overlapLength=Math.max(overlapLength,i+1);
            }
        }
        tmpOverlapLength=overlapLength; //임시저장
        overlapLength=0; //s2와 s1의 순서를 바꾸어서 다시 수행한다.
        for(int i=0;i<shortLength;i++){
            if(s2.substring(s2.length()-1-i).equals(s1.substring(0,i+1))){
                overlapLength=Math.max(overlapLength,i+1);
            }
        }
        //더 긴 overlapLength를 찾아서 합쳐진 문자열의 길이를 구한다.
        answer=s1.length()-Math.max(tmpOverlapLength,overlapLength)+s2.length();

        return answer;
    }
    
    // 아래는 테스트케이스 출력을 해보기 위한 main 메소드입니다.
    public static void main(String[] args) {
        MySolution sol = new MySolution();
        String s1 = new String("ababc");
        String s2 = new String("abcdab");
        int ret = sol.solution(s1, s2);
        
        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.println("solution 메소드의 반환 값은 " + ret + " 입니다.");
    }
}

 

정답


정답이 제공되지 않았습니다.

첨부 파일


프로젝트 파일 전체를 첨부합니다.

Solution 이 문제, CorrectSolution 이 정답, MySolution이 제가 푼 것입니다.
"Project from existing sources..." 메뉴에서 불러다 쓰시면 됩니다.

ThirdQuestion4.zip
0.01MB

출처: https://www.ybmit.com/cos_pro/cos_pro_r_test.jsp

728x90

댓글