문제 : 문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.
import java.util.Arrays;
class Solution {
public String solution(String s) {
String answer = "";
char[] chArray = s.toCharArray();
Arrays.sort(chArray);
answer = new StringBuilder(new String(chArray)).reverse().toString();
return answer;
}
}
- 문자열을 배열로 만든다.
- Arrays.sort()를 사용하여 정렬 - 오름차순 정렬
- StringBuilder에 정렬된 배열을 문자열로 만들어 넣어줌.
- StringBuilder에 있는 reverse()메서드를 통해 오름차순 정렬된 문자열을 뒤집음.
- toString()으로 문자열로 변환.
answer = new StringBuilder(new String(chars)).reverse().toString();
- 정렬된 문자 배열을 다시 문자열로 변환한 후,
StringBuilder
를 사용하여 문자열을 뒤집음. 뒤집은 문자열을answer
에 저장함- 구체적으로
new String(chars)
는 문자 배열을 문자열로 변환하고,new StringBuilder(문자열)
는 해당 문자열을StringBuilder
객체로 변환함.reverse()
메소드는StringBuilder
의 문자열을 뒤집으며, 마지막으로toString()
은 뒤집힌 문자열을 다시 문자열로 반환함
StringBuilder
는 Java에서 문자열을 효율적으로 조작하기 위해 제공되는 클래스로StringBuilder
는java.lang
패키지에 포함되어 있으며, 문자열을 변경할 수 있도록 설계된 가변적인 시퀀스를 제공하여 문자열을 빈번하게 수정해야 하는 경우,StringBuilder
는 불변 객체인String
보다 성능 면에서 훨씬 효율적임주요 특징 및 메소드
가변성 (Mutability)
String
객체는 불변(immutable) 객체이므로, 문자열을 변경할 때마다 새로운String
객체가 생성됩니다. 이는 메모리 사용과 성능에 비효율적일 수 있음.- 반면에,
StringBuilder
객체는 변경 가능(mutable)하므로, 문자열을 수정할 때 새로운 객체를 생성하지 않고 기존 객체를 변경함.주요 메소드
append(String str)
: 문자열의 끝에 다른 문자열을 추가insert(int offset, String str)
: 지정한 위치에 문자열을 삽입delete(int start, int end)
: 시작 인덱스부터 끝 인덱스까지의 문자열을 삭제reverse()
: 문자열의 순서를 뒤집음toString()
:StringBuilder
객체를String
으로 변환하여 반환/* StringBuilder를 사용하는 간단한 예제 */ public class StringBuilderExample { public static void main(String[] args) { // StringBuilder 객체 생성 StringBuilder sb = new StringBuilder("Hello"); // 문자열 추가 sb.append(" World"); System.out.println(sb.toString()); // 출력: Hello World // 문자열 삽입 sb.insert(6, "Java "); System.out.println(sb.toString()); // 출력: Hello Java World // 문자열 삭제 sb.delete(6, 11); System.out.println(sb.toString()); // 출력: Hello World // 문자열 뒤집기 sb.reverse(); System.out.println(sb.toString()); // 출력: dlroW olleH } }
StringBuilder
를 사용하는 이유
- 성능: 문자열을 자주 변경해야 하는 경우,
StringBuilder
는String
보다 더 빠르고 메모리 효율적- 편의성: 다양한 문자열 조작 메소드를 제공하여 코드 작성이 간편해짐
이와 같은 이유로, 문자열을 많이 다루는 작업에서는
StringBuilder
를 사용하는 것이 좋음
문제 : 관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.
SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I
JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.DATETIME > O.DATETIME
ORDER BY I.DATETIME
문제에서 요구하는 것은 보호 시작일(
I.DATETIME
)보다 입양일(O.DATETIME
)이 더 빠른 동물의 아이디와 이름을 조회하는 것. 이는 논리적으로 보호 시작일(I.DATETIME
)보다 입양일(O.DATETIME
)이 이전인 경우를 찾아야 함.즉, 입양일(
O.DATETIME
)이 보호 시작(I.DATETIME
)일보다 더 빨라야 하므로, 입양일(O.DATETIME
)이 보호 시작일(I.DATETIME
)보다 작아야 함.잘못된 데이터는 입양일(
O.DATETIME
)이 보호 시작일(I.DATETIME
)보다 이전에 기록된 경우.
이 경우 (O.DATETIME
)이 (I.DATETIME
)보다 작음.그렇기 때문에 WHERE절의 조건이 I.DATETIME < O.DATETIME가 아니라 I.DATETIME > O.DATETIME이어야 함.
이후 숙련주차 2주차 강의를 들었다.