'5월 25일' 푸른 달 넷째 주 토요일의 기록 [TIL]

가은·2024년 5월 25일
0

I Learned [본 캠프]

목록 보기
44/135
post-thumbnail

📑오늘 학습한 내용

🧩오늘의 알고리즘 : 문자열 내림차순으로 배치하기 🧩

문제 : 문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.

s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.

제한 사항

  • str은 길이 1 이상인 문자열입니다.
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;
    }
}
  1. 문자열을 배열로 만든다.
  2. Arrays.sort()를 사용하여 정렬 - 오름차순 정렬
  3. StringBuilder에 정렬된 배열을 문자열로 만들어 넣어줌.
  4. StringBuilder에 있는 reverse()메서드를 통해 오름차순 정렬된 문자열을 뒤집음.
  5. toString()으로 문자열로 변환.

🗝️ 여기서 잠깐! "StringBuilder"

answer = new StringBuilder(new String(chars)).reverse().toString();

  • 정렬된 문자 배열을 다시 문자열로 변환한 후, StringBuilder를 사용하여 문자열을 뒤집음. 뒤집은 문자열을 answer에 저장함
  • 구체적으로 new String(chars)는 문자 배열을 문자열로 변환하고, new StringBuilder(문자열)는 해당 문자열을 StringBuilder 객체로 변환함. reverse() 메소드는 StringBuilder의 문자열을 뒤집으며, 마지막으로 toString()은 뒤집힌 문자열을 다시 문자열로 반환함

StringBuilder는 Java에서 문자열을 효율적으로 조작하기 위해 제공되는 클래스로StringBuilderjava.lang 패키지에 포함되어 있으며, 문자열을 변경할 수 있도록 설계된 가변적인 시퀀스를 제공하여 문자열을 빈번하게 수정해야 하는 경우, StringBuilder는 불변 객체인 String보다 성능 면에서 훨씬 효율적임

주요 특징 및 메소드

  1. 가변성 (Mutability)

    • String 객체는 불변(immutable) 객체이므로, 문자열을 변경할 때마다 새로운 String 객체가 생성됩니다. 이는 메모리 사용과 성능에 비효율적일 수 있음.
    • 반면에, StringBuilder 객체는 변경 가능(mutable)하므로, 문자열을 수정할 때 새로운 객체를 생성하지 않고 기존 객체를 변경함.
  2. 주요 메소드

    • 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를 사용하는 이유

  • 성능: 문자열을 자주 변경해야 하는 경우, StringBuilderString보다 더 빠르고 메모리 효율적
  • 편의성: 다양한 문자열 조작 메소드를 제공하여 코드 작성이 간편해짐

이와 같은 이유로, 문자열을 많이 다루는 작업에서는 StringBuilder를 사용하는 것이 좋음

🧩 오늘의 SQL : 있었는데요 없었습니다 🧩

문제 : 관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 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주차 강의를 들었다.

0개의 댓글