본문 바로가기
사전캠프/회고

2024-10-27 사전캠프 12일차 / 하샤드 수, String 객체 메소드

by 어떻게말이름이히힝 2024. 10. 27.

🔥 학습 계획

  • [ 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이 뭔지 모르겠다. 내용 추가 필요.