22.4.25 [HackerRank]Java Substring Comparison

서태욱·2022년 4월 25일
0

Algorithm

목록 보기
14/45
post-thumbnail

✅ 문제 분석

문자열 s와 정수 k가 주어지면 길이가 k이고 사전순으로 가장 작은 부분 문자열과
가장 큰 부분 문자열을 찾도록 함수를 완성해야 한다.
사전 순서: A < B < ... < Y < Z < a < b < ... < y < z

string s: 문자열
int k: 찾을 부분 문자열의 길이

String s = "welcometojava"에 사전순으로 정렬된 길이 k=3의 하위 문자열이 존재.
["ava" "com" "elc" "eto", "jav", "lco", "met", "oja", "ome", "toj","wel"]

🌱 배경지식

자바 문자열 길이 구하기 length()

문자열 길이를 구하고 위해서는 java.lang.String 클래스의 length() 메소드를 사용.
문자열의 길이 (16bit Unicode Character 갯수)를 리턴해준다.

public class StringLength {
 public static void main(String[] args) {
	 String str1 = "ABC";
     String str2 = "A B C";
	 String str3 = "안녕하세요";

     System.out.println(str1.length()); // 3을 리턴
     System.out.println(str2.length()); // 5를 리턴
     System.out.println(str3.length()); // 5를 리턴
  }
}

문자열 비교 함수 compareTo()

compareTo() : 문자열의 사전순 값을 비교하여 그에 해당되는 int값을 리턴한다.
예를 들어 A>B 일때, A=B이면 0 A>B이면 1 A<B이면 -1을 리턴한다.

public void test(){
	String str1 = "AA";
	String str2 = "AA":
	String str3 = "BB";
    
	System.out.println(str1.compareto(str2)); // 결과 0
	System.out.println(str2. compareTo(str3)); // 결과 -1
	System.out.println(str3.compareTo(str2)): // 결과 1
 }

문자열 자르기 substring(a,b)

substring(a,b) : a는 시작값, b는 종료값
a번째부터 b번째 전까지 잘라내서 표시

✏️ 해설

import java.util.Scanner;

public class Solution {
 
    public static String getSmallestAndLargest(String s, int k) {
        String smallest = "";
        String largest = "";
        
        // Complete the function
        // 'smallest' must be the lexicographically smallest substring of length 'k'
        // 'largest' must be the lexicographically largest substring of length 'k'
        String lex = s.substring(0, k); 
        // 0부터 k번째 전까지 s를 잘라 lex 라는 변수명으로 String 객체를 하나 생성한다.
        smallest = largest = lex; 
        // 그렇게 자른 lex는 wel이다.
        
        for (int i=1; i<= (s.length() - k); i++){ 
        // 위에서 비교군을 위해 wel을 하나 잘랐으므로 다음 1번째 부터(e부터) k만큼 substring한다. 
        //s.length()-k를 해주는 이유는 string의 범위를 넘어가서 substring할 수 없기 때문이다.
            lex = s.substring(i,(i+k)); 
            if (lex.compareTo(smallest)<0){ 
            // lex와 smallest를 비교해 lex가 smallest보다 작으면(사전순서상 빠르면)
            // smallest에 for문에서 돌려준 lex가 담긴다. 
                smallest = lex;
            }
            if (lex.compareTo(largest)>0){ 
            // 만약 위의 조건문이 false가 되고 여기에서 lex가 
            // largest보다 사전순으로 느리면(크면) largest에 for문에서 돌려준 lex가 담긴다.
                largest = lex;
            }
        }
        
        return smallest + "\n" + largest;
    }


    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String s = scan.next();
        int k = scan.nextInt();
        scan.close();
      
        System.out.println(getSmallestAndLargest(s, k));
    }
}

👉 참고

profile
re:START

0개의 댓글