자바 강의, 코테 문제
문제 설명
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
import java.util.Arrays;
class Solution {
public String[] solution(String[] strings, int n) {
Arrays.sort(strings, (a,b)->
a.charAt(n)==b.charAt(n)? a.compareTo(b): Character.compare(a.charAt(n),b.charAt(n)) );
return strings;
}
}
character.compare(char a,char b) // 두 개의 문자를 비교해서 a가 b보다 작으면 -1 반환, a와 b가 같으면 0반환, a가 b보다 크면 1 반환
a.compareTo(b) // 문자 말고 문자열을 비교한다는 것 빼곤 위와 같음.
compare() 메서드 규칙: a-b가 음수면 오름차순 정렬, a-b가 양수면 내림차순 정렬.
좀 충격적이다. 1시간 동안 코드 엄청 길게 짰는데 생각하다가 막혀서 gpt한테 물어봤는데 그냥 위의 코드처럼 엄청 짧게 나왔다.. 람다식이 이렇게 간편했나? 이해는 했지만 다시 비슷한 문제 나와도 못 할 것 같다..
String(String s) // 주어진 문자열(s)을 갖는 String인스턴스를 생성
String(char [] value) // 주어진 문자열(value)을 갖는 String인스턴스를 생성
String(StringBuffer buf) // StringBuffer인스턴스가 갖고 있는 문자열과 같은 내용의
String인스턴스를 생성
charAt(int index) // 지정된 위치(index)에 있는 문자 반환
compareTo(String str) // 문자열(str)과 사전순서로 비교. 같으면 0, 이전이면 음수,
이후면 양수 반환
concat(String str) // 문자열(str)을 뒤에 덧붙임.
contains(CharSequence s) // 지정된 문자열(s)이 포함되었는지 검사
startsWith(String prefix) // 주어진 문자열(prefix)로 시작하는 지 검사
`endsWith(String suffix)`` // 지정된 문자열(suffix)로 끝나는 지 검사
equals(Object obj) // 매개변수로 받은 문자열(obj)과 String인스턴스의 문자열을 비교
equalsIgnoreCase(String str) // 문자열과 String인스턴스의 문자열을 대소문자 무시
하고 비교
indexOf() // 주어진 문자나 문자열이 존재하는 지 확인하여 위치(index)를 반환.
못 찾으면 -1을 반환
indexOf( , int pos) // 주어진 문자나 문자열이 존재하는지 지정된 위치(pos)부터
확인 〃
lastIndexOf(int ch) // 지정된 문자 또는 문자코드, 문자열이 끝에서 부터
존재하는지 확인 〃
length() // 문자열의 길이
split(String regex) // 문자열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아
반환
split(String regex, int limit) // 〃 단, 문자열 전체를 지정된 수로 자름
substring(int begin) // 주어진 시작위치(begin)부터 끝까지의 문자열을 반환
substring(int begin, int end) // 주어진 시작위치(begin)부터 끝 위치(end) 까지의
문자열을 반환. 끝 위치는 포함 안 됨
toLowerCase() // 문자열을 소문자로 변환
toUpperCase() // 문자열을 대문자로 변환
trim() // 문자열의 왼쪽 끝과 오른쪽 끝 공백을 없앤 결과를 반환
valueOf() // 문자열로 변환하여 반환
join(구분자,배열이름) // 여러 문자열 사이에 구분자를 넣어서 결합
-String처럼 문자열 배열(char[])을 내부적으로 가짐
-String과 달리 내용 변경 가능
-배열은 길이 변경불가. 공간이 부족하면 새로운 배열 생성
-저장할 문자열의 길이를 고려해서 적절한 크기로 생성
StringBuffer() // StringBuffer 선언 및 객체 생성
StringBuffer(int length) // 지정된 개수의 문자를 담는 버퍼를 가진 StringBuffer객체
StringBuffer(String str) // 지정된 문자열 값(str)을 갖는 StringBuffer객체 생성
-equals 오버라이딩 안 되어 있음
append() // 문자열로 변환하여 StringBuffer객체가 저장하고 있는 문자열 뒤에 추가
capacity() // 버퍼의 크기
charAt(int index) // 지정된 위치(index)에 있는 문자 반환
delete(int start, int end) // 시작위치부터 끝 위치 사이에 있는 문자 제거. 끝 위치
문자는 포함 x
deleteCharAt(int index) // 지정된 위치(index)의 문자 제거
insert(int pos, 값) // 값을 문자열로 변환하여 지정된 위치(pos)에 추가
length() // 문자열 길이 반환
replace(int start, int end, String str) // 지정된 범위의 문자들을 주어진 문자열로 변환
reverse() // 순서 거꾸로 나열
setCharAt(int index, char ch) // 지정된 위치의 문자를 주어진 문자로 변환
setLength(int newLength) // 지정된 길이로 문자열의 길이를 변경
toString() // String으로 반환
substring(int start) // 지정된 시작 위치부터 끝까지 반환
substring(int start, int end) // 지정된 범위를 반환. 끝은 포함 x
-StringBuffer는 동기화(데이터보호) o, 멀티 쓰레드에 안전, StringBuilder는 동기화 x
멀티 쓰레드 프로그램이 아닌 경우, 동기화는 불필요하고 성능저하
멀티 쓰레드일 때는 StringBuffer 사용하고 단일 쓰레기일 땐 StringBuilder 사용
-StringBuffer와 동일
-수학 관련 static 메서드의 집합
abs() // 값의 절대값을 반환
ceil(double a) // 값을 올림하여 반환
floor(double a) // 값을 버림하여 반환
max( , ) // 두 값을 비교하여 큰 쪽 반환
min( , ) // 두 값을 비교하여 작은 쪽 반환
rint(double a) // 주어진 double 값과 가장 가까운 정수값을 double형으로 반환
단, 두 정수의 정가운데 있는 값은 짝수 반환
round() // 소수점 첫 째자리에서 반올림한 정수값을 반환
-8개의 기본형을 객체로 다뤄야 할 때 사용하는 클래스
-대부분 기본형의 앞 글자를 대문자로 바꾸면 래퍼클래스가 됨.
-모든 숫자 래퍼 클래스의 조상
문자열->기본형
기본형 a = 기본형에 맞는 래퍼클래스.parse바꾸고 싶은 기본형("숫자")
ex)
int a = Integer.parseInt("100") // int a의 값은 100
문자열->래퍼클래스
래퍼클래스 a = 래퍼클래스.valueOf("숫자")
ex)
Integer a = Integer.valueOf("100") // Integer a의 값은 100
-n진법의 문자열을 숫자로 변환하는 방법
int a = Integer.parseInt("숫자", 진법)
ex)
int a = Integer.parseInt("100", 2) // 100을 2진법으로 읽어서 4로 반환
-기본형의 값을 객체로 자동변환하는 것을 오토박싱, 그 반대는 언박싱
java.util.Date
-날짜와 시간을 다룰 목적으로 만들어진 클래스
-Date의 메서드는 거의 deprecated되었지만, 여전히 쓰임
java.util.Calendar
-Date클래스를 개선한 새로운 클래스. 여전히 단점 존재
java.time패키지
-Date와 Calendar의 단점을 개선한 새로운 클래스들을 제공
-추상 클래스이므로 getInstance()를 통해 구현된 객체를 얻어야 함.
Calendar.getInstance() // 현재 날짜와 시간으로 셋팅하고 객체 생성
get(field) // 날짜와 시간 필드 가져오기
getActualMaximum(field) // 해당 필드에서 가질 수 있는 가장 큰 값 반환
set(field, value) // 날짜와 시간 지정
set(년도,달,일,시간,분,초) // 순으로 여러 개 지정도 가능
getTimeInMillis() // 날짜 및 시간을 밀리초 단위로 반환
음.. 메서드만 주구장창 나와서 이걸 써야 돼 말아야 돼 하다가 아직도 잘 모르겠지만 쓰긴 했다. 사전캠프 마지막 날이다. 걱정이 태산