Algorithm - String CodingTest Tip

  • Java로 코딩테스트를 준비하며 부족한 부분을 공부하기 위해 정리하였음.
  • 코딩테스트 String과 관련된 정리내용임.

1. 해당 문자(char)가 대문자인지, 소문자인지 확인하는 방법

public class A {
    public static void main(String[] args) {
      char c = 'A';
      char c2 = 'a';

      boolean check = Character.isUpperCase(c);
      boolean check2 = Character.isLowerCase(c2);

      System.out.println(check);
      System.out.println(check2);
   }
}
  • Character.isUpperCase(c); 해당 문자가 대문자인지를 체크하여 true, false로 반환
  • Character.isLowerCase(c); 해당 문자가 소문자인지를 체크하여 true, false로 반환



2. 해당 문자(char)가 영어인지 확인하고, 대소문자를 바꾸는 방법

  • A ~ Z : 65 ~ 90a ~ z : 97 ~ 122인거는 외워야 한다.
  • 이걸 메서드로는 Character.isAlphabetic(c); 를 하면 영어인지 아닌지 판별할 수 있다.
  • 대문자를 소문자로 바꿀 때, Character.toLowerCase(c);
  • 소문자를 대문자로 바꿀 때, Character.toUpperCase(c); 를 사용해도 되지만,
  • 대문자를 소문자로 바꿀 때 +32, 소문자를 대문자로 바꿀 때 -32 를 해줘도 된다.



3. 해당 문자(char)가 숫자인지 판별 하는 방법

  • 아스키 코드 48 ~ 57은 숫자로 0 ~ 9이다.
      public class A {
          public static void main(String[] args) {
    		  
            int i = 5;
            char c = (char) i;
    		  
            if ( c >= 48 && c <= 57 ) {
                // ...
            }
         }
      }
    
  • 그래서 숫자인지 아닌지를 판별할 때의 정규식을 사용해도 되지만, 대신 이렇게 48보다 크고, 57보다 작은지로 판별해도 된다.
  • 그리고 또 다른 숫자를 판별하는 방법으로는
  • Character.isDigit(c); 가 있다.
  • 이건 c가 숫자인지 아닌지를 판별한다.
  • 주의할 점은 c가 int 자료형이라는 것이 아니라, char 자료형인데 그 값이 숫자임을 판별하는 것이다.



4. 문자열의 대, 소문자를 바꾸는 방법

  • 문자(char)의 대소문자 치환 방법과 비슷하다.
  • str.toUpperCase(); 가 문자열 str의 전체를 대문자로 치환하는 방법이고,
  • str.toLowerCase(); 가 문자열 str의 전체를 소문자로 치환하는 방법이다.
  • 하지만 조금은 다른게 있다면,
  • 문자는 char c2 = Character.toUpperCase(c); 이렇게 하지만,
  • 문자열은 String str2 = str.toUpperCase(); 이렇게 한다.



5. 문자열을 문자로 for문 돌리는 방법

  • str.toCharArray() 를 활용하면 된다.
      public class A {
          public static void main(String[] args) {
    		  
            String str = "Java !!!";
    		  
            for ( char c : str.toCharArray() ) {
                System.out.println(c);
            }
         }
      }
    



6. 문자열 뒤집기

  • 문자열을 뒤집는 방법으로 활용하기 좋은건 StringBuilder 이다.
      public class A {
          public static void main(String[] args) {
            String str = "StarCraft";
            String str2 = new StringBuilder(str).reverse().toString();
            // ...
         }
      }
    
  • 이렇게 하면, StarCraft 라는 문자열이 뒤집어진 상태로 str2에 저장된다.
  • StringBuffer를 사용해도 되지만, 그건 멀티쓰레드 환경에서 좋으므로, 코딩테스트에서는 그냥 StringBuilder를 사용하는게 좋다.



7. 문자 배열을 문자열로 만들기

  • 문자 배열을 문자열로 만들 때 굳이 for문을 통해 일일히 문자열에 +=로 추가해 줄 필요가 없다.
      public class A {
          public static void main(String[] args) {
            char[] cArr = {'a', 'b', 'c'};
            String str = String.valueOf(cArr);
            // ...
         }
      }
    
  • 이렇게 String.valueOf(cArr); 을 활용하여 문자 배열을 String으로 만들 수 있다.



8. 문자열 비교

  • 문자열을 비교하는 방법은 2가지가 있다.
  • 대,소문자를 구분하여 비교하는 방법 : str.equals(str2);
  • 대,소문자를 구분하지 않고 비교하는 방법 : str.equalsIgnoreCase(str2);
  • 그리고, StringBuilder나 StringBuffer는 equals로 비교할 수 없다. 비교를 하려면 toString()으로 String 타입으로 만들어준 후에 equals로 비교해주어야 한다.그 이유는 cs적인 부분에 있는데, String은 Object에 있는 equals랑 hashcode를 오버라이딩으로 재정의해서 가져오는데, StringBuilder랑 StringBuffer는 그렇지 않기 때문에 참조 주소를 비교해버린다.



9. 2진수, 8진수, 10진수, 16진수 바꾸는 방법

  • 10진수를 제외한 다른 진수들은 모두 문자열로 반환되고, 비교할 수 있다.
      public class A {
          public static void main(String[] args) {
    		  
            String str = "1000111"; // 2진수의 문자열
            int i = Integer.parseInt(str, 2);
    		  
         }
      }
    
  • 해당 코드는 n 진수를 10진수로 치환하는 방법이다.
  • 예시는 2진수를 10진수로 치환했지만, Integer.parseInt(str, 2); 에서 2 대신 n을 넣으면 n 진수를 10진수로 치환해준다.
  • 다음은 10진수를 2, 8, 16진수로 치환하는 방법이다.
      public class A {
          public static void main(String[] args) {
    		  
            int i = 77;
            String a = Integer.toBinaryString(i); // 10 -> 2
            String b = Integer.toOctalString(i); // 10 -> 8
            String c = Integer.toHexString(i); // 10 -> 16
    		  
         }
      }
    
  • 2, 8, 16 진수 대신 다른 진수로 치환하려면 직접 구현해줘야 한다.



10. subString() 사용 방법

  • subString()은 문자열을 나눌 때 쓰는 방법이다.
  • subString(n); 만 있을경우 Index n부터 끝까지를 가져온다.
  • subString(n, m); 이렇게 될 경우, Index n ~ Index m-1까지 가져온다.



11. StringBuffer에서 문자열 추가하는 방법

  • StringBuffer는 .append(str); 이렇게 추가해줄 수 있다.
  • ex) strBuffer.append(“abc”);



12. List 를 for문으로 돌리지 않아도 안에 해당 값이 있는지 없는지 알 수 있는 방법

  • 이건 사실 Array, List 쪽에서 다뤄야하지만 String 을 공부하면서도 필요해서 함께 정리해두었다.
  • list.contains(data); 해당 문법으로 알 수 있다.
  • 아래는 예시코드이며, true나 false로 return 된다.
      public class A {
          public static void main(String[] args) {
    		  
            List<String> strList = new ArrayList<>();
    		  
            strList.add("A");
            strList.add("B");
            strList.add("C");
    		  
            boolean check = strList.contains("A"); // true
    		  
         }
      }
    



13. Scanner

  • 코딩테스트를 할 때 Scanner는 아주 많이 쓰인다.
  • 그래서 쓰임새를 알아야 하는데, 가장 중요한 건 한 단어를 받느냐, 문장을 받느냐, 단어를 받느냐를 구분하는 것이다.
  • String str = scan.next(); 토큰 기준으로 한 단어를 가져온다. 띄어쓰기 공백이 있으면 그 뒤의 문자열은 가져오지 않는다.
  • String str = scan.nextLine(); 개행 기준으로 문자열을 가져온다. Enter로 줄바꿈을 하지 않는 한, 그 문장을 가져온다.
  • char c = scan.next().charAt(0); 이건 한 글자를 가져올 때 사용한다.
* nextInt()     int 를 읽음.
* nextBoolean() boolean 을 읽음.
* nextByte()    byte 를 읽음.
* nextShort()   short 를 읽음.
* nextLong()    long 을 읽음.
* nextFloat()   float 을 읽음.
* nextDouble()  double 을 읽음.



14. replace vs replaceAll

  • replace(a, b)는 딱 해당 문자열과 100% 일치하는걸, 다른 문자열로 치환해준다.
  • 예를 들어, String str2 = str.replace(“abc”, “cba”);
  • 이렇게 있으면, str이라는 문자열에서 딱 abc 로 알맞는게 있으면 그걸 cba로 치환해준다.
  • 하지만 replaceAll(a, b)은 a에 정규식이 들어간다.
  • 정규식 꼭 공부하자.



15. 단어간 거리 비교하는 방법

  • 단어간 거리를 비교하는 방법에는 좋은 알고리즘이 있다.
      public static int[] findDistanceAnotherSolution(String str, char c) {
    
          int[] iArr = new int[str.length()];
          int p = Integer.MAX_VALUE;
    
          for ( int i = 0; i < str.length(); i++ ) {
              if ( str.charAt(i) == c ) {
                  p = 0;
              } else {
                  p ++;
              }
              iArr[i] = p;
          }
    
          p = Integer.MAX_VALUE;
    
          for ( int i = str.length() -1; i >= 0; i-- ) {
              if ( str.charAt(i) == c ) {
                  p = 0;
              } else {
                  p ++;
              }
              iArr[i] = Math.min(iArr[i], p);
          }
    
          return iArr;
      }
    
  • 목표 단어면 p를 0으로 바꿔주고, 이동할 때마다 p++; 을 통해 증가시켜준다. 이게 단어간의 거리를 나타낸다.






results matching ""

    No results matching ""