🔥 학습 계획
- [ v ] 데일리 SQL, 알고리즘 풀이
- [ v ] java 책 (~123p)
- [ v ] TIL 작성
⚠️ 모르는 부분 정리해야 할 것(TIL)
- [ v ] String 클래스의 생성자 / 메소드
데일리 루틴 알고리즘 풀이
import java.lang.*;
class Solution {
public boolean solution(int x) {
boolean answer = true;
int sum = 0;
String s = Integer.toString(x);
int length = s.length();
for(int i =0; i<length;i++){
sum += s.indexOf(i);
}
answer = (x%sum==0)?true:false;
return answer;
}
}
하샤드 수 설명에 따라 했지만 일부 케이스에서 실패한 것을 알 수 있었다.
제한조건을 확인해 for문을 감싸는 조건문을 추가해봤지만 동일하게 실패가 발생했다.
print해서 확인해보니 sum에 생각한 것과 전혀 다른 값이 들어있어서 메소드를 적절하지 못하게 사용했음을 알 수 있었다.
String 으로 변경해 저장 후 하나씩 꺼내는건 비효율적인 느낌이 들어 아래 코드로 변경했다.
(int)(Math.log10(x)+1)의 경우 양의 정수의 길이를 구하는 방법이다. 본래라면 for문을 이용해 카운트 해줬겠지만 새로운 방법을 찾았다
class Solution {
public boolean solution(int x) {
boolean answer = false;
if(x>0&&x<=10000){
int sum = 0;
int getx = x;
int length = (int)(Math.log10(x)+1);
int []a = new int[length];
for(int i=0; i<length; i++){
a[i]=getx%10;
getx/=10;
}
for(int i=0; i<length; i++){
sum+=a[i];
}
answer = (x%sum==0)?true:false;
}
return answer;
}
}
성공은 했지만 역시 다른 사람이 푼 코드를 보니 한참 멀었다는 생각이 들었다.
내가 맨 처음에 시도했던 String 객체로 변환하려면 더 쉬운 방법이 있었다.
class Solution {
public boolean solution(int x) {
String [] tmp = String.valueOf(x).split("");
int sum=0;
for(String s:tmp) {
sum+=Integer.parseInt(s);
}
if(x%sum==0) {
return true;
} else {
return false;
}
}
}
String [] tmp = String.valueOf(num).split("");
num값에는 x가 들어간다. valueOf(num)은 다양한 타입의 값을 문자열로 변환해주는 메소드이다.
split은 " "안에 든 문자열을 기준으로 나눠주는 메소드인데, 핸드폰 번호에 - 가 들어가는 것을 이용해서 str(String으로 선언된 배열 이름).split("-")로 만약 010-3333-4444가 주어진다면 String[0]에는 010 String[1]에는 3333 String[2]에는 4444가 저장된다.
그 후에 향상된 for문을 이용하여 String 객체 끝까지 반복한다. 반복문 안에는 문자열을 정수로 바꾸는 int a = Integer.parseInt(s); 로 문자열을 정수로 바꾸고 앞에서 int sum = 0; 으로 선언해주고 sum += Integer.parseInt(s); 로 저장해준다. 그 이후에는 내가 했던 부분과 동일하게 받아준 x값을 sum으로 나눈 나머지가 0이면 true로 반환하고 아니면 false로 반환한다.
class Solution {
public boolean solution(int x) {
int sum = String.valueOf(x).chars().map(ch -> ch - '0').sum();
return x % sum == 0;
}
}
해당 코드는 람다식 표현을 이용한 것 같은데 아직 그 부분까지 진도를 나가지 못하여서 배운 이후에 복습이 필요할 것 같다.
String 객체 메소드 필기(110p)
*charsetName : "UTF-8", "EUC-KR" 등 문자셋을 지정함
- 생성자
- String() : 빈 문자열인 객체를 생성
- String(byte[]bytes) : byte 배열의 내용을 String 객체를 생성
- String(byte[]bytes, int offset, int length) : byte 배열의 offset 위치부터 count개만큼의 내용을 String 객체를 생성
- String(byte[]bytes, int offset,int length,StringcharsetName) : byte 배열의 offset 위치부터 count개만큼의 내용을 지정된 문자셋으로 String 객체를 생성
- String(byte[]bytes, String charsetName) : byte 배열의 내용을 지정된 문자 셋으로 String 객체를 생성
- String(char[]value) : char 배열의 내용을 String 객체로 생성
- String(char[]value, int offset, int couint)) : char 배열의 offset 위치부터 count개만큼의 내용을 String 객체를 생성
- String(StringOriginal) : String 문자열을 가진 객체를 생성
- String(StringBufferbuffer) : StringBuffer 문자열을 가진 객체를 생성 - 메소드
- char charAt(int index) : index 번째 문자를 반환
- int compareTo(Object o) : o와 비교하여 결과로 양수,음수,0의 값을 반환.
- int compareTo(StringanotherString) : 두개의 문자열을 비교하여 결과로 양수,음수,0의 값을 반환
String a = "123";
String b = "223";
int result = 0;
result = a.compareTo(b);// -1
String a = "903";
String b = "643";
int result = 0;
result = a.compareTo(b);// 3
String a = "903";
String b = "903";
int result = 0;
result = a.compareTo(b);// 0
ASCII 코드 기준으로 출력되며 문자열이 a값보다 b값이 크면 음수로 반환하며 (a)-(b)=(49)-(50) = -1 이 된다. 맨 처음 글자부터 비교한다. 대소문자를 무시하는 메소드는 compareToIgnorecase() 를 사용하면 된다.
- Stringconcat(String str) : '+'연산자처럼 문자열을 결합
- boolean contentEquals(StringBuffer sb) : StringBuffer와 문자열을 비교하여 true, false를 반환
- static String copyValueOf(char[] data) : 문자배열값을 문자열로 복사
: static으로 선언된 메소드여서 아래 코드처럼 실행 가능함
- static String copyValueOf(char[] data, int offset, int count)
char[] ch = {'H','e','l','l','o'};
String s = String.copyValueOf(ch);
System.out.println(s); //Hello 출력
char[] ch = {'H','e','l','l','o'};
String s = String.copyValueOf(ch,2,2);
System.out.println(s); //ll 출력
- boolean endsWith(Stringsuffix) : 특정 문자열로 끝나는지 확인하여 true, false를 반환
- boolean equals(Object obj) : 두 개의 문자열 값을 비교하여 true, false를 반환
- boolean equalsIgnorreCase(StringanotherString) : 대소문자를 구분하지않고 문자열 비교해 true, false를 반환
- byte[] getBytes() : 문자열을 바이트 배열로 변환
- byte[] getBytes(charsetName) : 문자열을 지정된 문자셋의 바이트 배열로 변환
String str = "Hello World";
// getBytes() 메소드로 바이트 배열 생성
byte[] byteArray = str.getBytes();
// 결과 출력
System.out.println("바이트 배열:");
for (byte b : byteArray) {
System.out.print(b + " ");
}
// ASCII 코드값으로 출력됨 H=72, e=101...
// 출력: 72 101 108 108 111 32 87 111 114 108 100
- void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) : 문자열의 일부를 문자배열로 생성
+ srcBegin : 문자열에서 복사를 시작할 시작 인덱스
+ srcEnd : 문자열에서 복사를 끝낼 인덱스, 5로 지정되면 (srcEnd-1), 즉 4까지의 문자가 복사됨
+ dst : 복사할 문자를 저장할 char 형 배열
+ dstBegin : char 배열에서 복사한 문자를 저장할 위치의 시작 인덱스.
- int hashCode() : 객체의 메모리 주소를 기반으로 해시 코드를 계산
- int indexOf(int ch) : ch를 유니코드로 하는 문자의 위치를 반환한다. 문자열에서 해당 문자(ch)가 처음으로 등장하는 인덱스를 반환하며 찾는 문자가 문자열에 존재하지 않으면 -1을 반환
- int indexOf(int ch, int fromIndex)
+ fromIndex : 탐색을 시작할 인덱스
- int indexOf(String str) : str 문자열의 위치를 반환
- int indexOf(String str, int fromIndex)
- int lastIndexOf(int ch) : 문자열 끝에서부터 찾음
- int lastIndexOf(int ch, int fromIndex)
- int lastIndexOf(String str)
- int lastIndexOf(String str, int fromIndex)
- int length() : 문자열의 길이를 반환
- boolean matches(String regex) : 두개의 문자열이 일치하는지 여부를 비교
* equals()와 matches()의 차이점
: matches는 정규표현식을 포함하여 비교한다.
"Hello".equals("hello") → false
"Hello123".matches("Hello\\d+") → true
보통 equals() 는 로그인 시 사용자 ID가 정확히 일치하는지 비교할 때 사용하고 matches()는 비밀번호 생성시 숫자와 특수문자가 포함되었는지 검증할 때 사용
- Stringreplace(char oldChar, char newChar) : oldChar을 newChar로 변환한다.
- String[] split(String regex) : 지정된 regex를 중심으로 여러 개의 문자열 배열로 분리한다.
- String[] split(String regex, int limit) : 지정된 개수만큼 배열로 분리
- boolean startsWith(String prefix) : 특정 문자열로 시작하는지 비교
- String substring(int beginIndex) : 특정 위치부터의 문자열만 반환
- String substring(int beginIndex, int endIndex)
String original = "Hello, World!";
String substring1 = original.substring(7); // "World!"
String substring2 = original.substring(0); // "Hello, World!"
- char[] toCharArray() : String을 char형 배열로 반환한다.
- String toLowerCase() : 소문자로 변환한다.
- String toUpperCase() : 대문자로 변환
- Stringtrim() : 문자열 양쪽의 공백을 제고
- String toString() : 문자열로 변환한다, Object 클래스의 오버라이딩 / 오버라이딩을 위한 메소드임
class Person {
String name;
int age;
// 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// toString() 메소드 오버라이드
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class CustomToStringExample {
public static void main(String[] args) {
// Person 객체 생성
Person person = new Person("Alice", 30);
// toString() 메소드 호출
String personString = person.toString();
// 결과 출력
System.out.println("toString() 호출 결과: " + personString); // 출력: Person{name='Alice', age=30}
}
}
- static String valueOf(boolean b) : boolean 데이터형을 문자열로 변환한다. // "true", "false" 저장됨
- static String valueOf(char c)
- static String valueOf(char[] data)
- static String valueOf(char[] data, int offset, int count)
- static String valueOf(double d)
- static String valueOf(float f)
- static String valueOf(int i)
- static String valueOf(long l)
- static String valueOf(Object obj)
java.util 패키지
- Date 클래스
생성자
- Date() : 현재 날짜와 시간을 저장한 객체 생성
- Date(long msec) : 1970년 1월1일 0시0분0초부터 msec 1/1000초 단위로 하여 경과한 날짜와 시간을 저장한 객체 생성
메소드
- boolean after(Date when) : when의 날짜가 현재 날짜 이후면 true, 아니면 false 반환
- boolean before(Date when) : when의 날짜가 현재 날짜 이전이면 true, 아니면 false 반환
- int compareTo(Date anotherDate) : 다른 날짜 객체와 비교하여 음수, 양수,0의 결과 반환
- int compareTo(Object obj)
- boolean equals(Object obj) : 날짜와 값 비교하여 그 결과 반환
- long getTime() : 1970년 1월1일 0시 0분 0초로부터 시간을 1/1000초 단위로 반환
- void setTime(long time) : time의 시간을 1970년 1월1일 0시 0분 0초로부터 시간을 1/1000초 단위로 설정
* long currentTimeMillis = System.currentTimeMillis();
-> 현재 시간을 밀리초 단위로 얻을 수 있다. 현재 밀리초: 1698414230456 << 이런식으로 나옴
해당 값을 setTime(currentTimeMillis); 를 생성한 Date 객체에 집어넣고 출력 시 현재 시간: Sun Oct 27 15:23:50 GMT 2024 와같이 출력됨 - Calendar 클래스
추상 클래스로 객체를 직접 생성할 수 없고 getInstance() 메소드를 이용하여 시스템의 날짜와 시간 정보를 표현, Calendar 클래스는 표현에 따른 상수 제공 (ex static int OCTOBER, static int TUESDAY...)
메소드
- void set(int year, int month, int date, int hour, int minute) : 현재 객체의 년, 월, 일, 시, 분 값을 다른 값으로 설정
- void set(int year, int month, int date, int hour, int minute, int second) - Vector 클래스
가변 길이의 배열
생성자
- Vector() : 10개의 데이터를 저장할 수 있는 길이의 객체, 저장 공간이 부족할 경우 10개씩 증가
- Vector(int size) : size 개의 데이터를 저장할 수 있는 길이의 객체, 저장 공간이 부족할 경우 size 개씩 증가
- Vector(int size, int incr) : size 개의 데이터를 저장할 수 있는 길이의 객체, 저장 공간이 부족할 경우 incr 개씩 증가
메소드
- void addElement(Object obj) : obj 객체를 Vector에 저장
- int capacity() : Vector의 용량 반환
- boolean contains(Object elem) : 현재 Vector에 elem 요소가 있으면 true
- void copyInto(Object[] anArray) : Vector 내용을 Object 배열로 복사
- Object elementAt(int index) : index위치의 객체 반환
- Enumeration elements() : Vector의 Enumeration 생성(컬렉션 순회 인터페이스)
- boolean equals(Object o) : Vector의 내용이 같은지 비교
- Object firstElement() : Vector의 첫번째 요소를 반환
- Object get(int index) : Vector의 index 번째 요소를 반환
- int indexOf(Object elem) : elem 객체의 위치 반환
- int indexOf(Object elem, int index) : index위치부터 elem의 객체 위치 반환
- int insertElementAt(Object obj, int index) : index 위치에 obj 삽입
- boolean isEmpty() : 비어있는지 확인
- Object lastElement() : Vector의 마지막 요소 반환
- int lastIndexOf(Object elem) : elem 객체가 마지막으로 나타난 위치를 반환
- Object remove(int index) : index 위치의 객체를 Vector에서 제거
- boolean remove(Object o) : 객체를 찾아 Vector에서 제거 //해당 객체가 없으면 false를 반환, 있으면 true
- void removeAllElements() : Vector의 모든 요소를 제거
- boolean removeElement(Object obj) : obj 객체를 Vetor에서 제거하고 그 결과를 true,false로 반환
* 비슷한 동작을 하기 때문에 보통 remove를 더 많이 쓴다.
- void removeElementAt(int index) : index 위치의 요소를 제거
- protected void removeRange(int fromIndex, int toIndex) : fromIndex 위치에서부터 toIndex 위치까지의 Vector의 일부 객체에 요소를 제거
- Object set(int index, Object element) : index위치에 element 객체로 설정, 설정 후에 설정된 객체 반환
- void setElementAt(Object obj, int index) : index 위치에 element 객체로 설정
- int size() : Vector의 사이즈 반환
- void setSize(int newSize) : Vector의 사이즈를 새로 설정
- Object[] toArray() : Vector를 Object 배열로 생성하여 반환
java 책까지 공부하기엔 string 객체를 정리하고 사용방법을 확인하는 과정에서 시간이 꽤나 소요되었다. java 책 진도를 조금 더 나가려고 했는데 시간이 부족했다. enumeraton이 뭔지 모르겠다. 내용 추가 필요.
'사전캠프 > 회고' 카테고리의 다른 글
2024-10-31 / 소켓 프로그래밍, 참조타입 변수, 메모리 영역, 리스트 선언 (0) | 2024.10.31 |
---|