카테고리 없음

20240814 (수) 프로그래머스 [Q17] + 다락방 Part2 1차시

ddh1713 2024. 8. 14. 13:56

Index

프로그래머스 코드리뷰 x 만큼의 간격이 있는 n 개의 숫자
반복문 배열

 

Programmers Code Review 

[Q17] 자연수 뒤집어 배열로 만들기

문제 설명
자연수 n 을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를 들어 n 이 12345 이면, [5, 4, 3, 2, 1] 을 리턴합니다.
제한 조건
n 은 10,000,000,000 이하인 자연수입니다.
n return
12345 [5, 4, 3, 2, 1]

 

class Solution {
        public int[] solution(long n) {


        String nStr = String.valueOf(n);    // long 타입 숫자를 문자열로 변환
        int nLength = nStr.length();        // 문자열의 길이를 구함

        int[] answer = new int[nLength];    // 결과를 저장할 배열

            // nStr 의 끝에서 부터 한 문자씩 가져와 숫자로 변환하여 배열에 저장
        for(int i = 0; i < nLength ; i++){
            answer[i] = Character.getNumericValue(nStr.charAt(nLength - (1 + i)));
                         
        }

        return answer;
    }
}

 

1. toString() 메서드와 valueOf() 메서드

 

 toString() 메서드는 객체를 문자열로 변환하는 메서드이다. 자바 객체는 기본적으로 Object 클래스의 하위 클래스이기 때문에 toString() 메서드를 상속받는다. toString() 메서드는 기본 메서드를 바로 이용하기도 하고, 필요에 따라 오버라이딩을 해서 사용하기도 한다.

기본 동작 객체의 클래스 이름과 해시코드를 반환한다. (예 : MyObject@74@14482 )
오버라이딩 특정 객체의 필드 값이나 상태를 문자열로 표현하고 싶을 때 오버라이딩 한다.

 

 위의 코드에서는 long type 의 숫자를 문자열로 변환시켜야 한다. valueOf() 메서드와 toString() 메서드 모두 이용할 수 있다. 아직 두 메서드의 차이를 명확하게 구분하지는 못하겠다. 나는 valueOf() 메서드를 사용하였다.

 

 1-1. String.valueOf()

long exNum1 = 123456789L;
String numStr1 = String.valueOf(exNum1);
System.out.println(numStr1);	// 출력 : "123456789"

 

 1-2. Long.toString()

long exNum2 = 123456789L;
String numStr2 = Long.toString(exNum2);
System.out.println(numStr2);	// 출력 : "123456789"

 

문자열 연결 연산자를 사용할 수도 있지만, 위의 두 메서드를 사용하는 것이 더 가독성도 높고 성능도 우수하다. 위의 두가지 방법을 지향한다. 두 메서드는 문자열로 반환할 때 주로 사용되는 메서드들이지만, 그 용도와 동작 방식에 차이가 있다.

 

 1-3. toString() 메서드

 

- 정의 : 객체가 가지고 있는 데이터를 문자열로 표현하기 위해 오버라이드 되는 메서드이다.

- 사용 대상 : 주로 객체에서 호출하여 해당 객체의 문자열 표현을 반환한다.

- 동작 방식 : Object 클래스에 정의되어 있으며, 클래스의 이름과 해시 코드를 반환한다. 원시 타입 (primitive type) 데이터에는 사용할 수 없다. 예를 들어, long.toString() 은 사용 불가능하며 Long.toString(long)으로 래퍼클래스를 사용하여 박싱한 후에 사용 가능해진다.

 

 1-4. valueOf() 메서드

 

- 정의 : 다양한 타입의 값을 문자열로 변환할 수 있는 정적(static) 메서드이다.

- 사용대상 : 원시 타입(primitive type)과 객체 모두에 할 수 있다.

- 동작 방식 : valueOf() 는 기본적으로 전달된 값이 null 이 아니면, toString() 메서드를 호출해 그 결과를 반환한다. 원시 타입을 문자열로 변환할 때도 사용되는데, 이 경우에는 내부적으로 해당 타입의 toString() 메서드를 호출한다.

 

 1-5. 두 메서드의 주요 차이점

 

- toString() : 객체가 가지고 있는 데이터를 문자열로 표현하는 메서드이다. 만약 객체가 null 일 경우 NullPointerException 을 발생시킨다.

- valueOf() : 더 범용적으로 사용되며, 원시 타입과 객체 모두를 문자열로 변환할 수 있다. 만약 전달된 값이 null 이면 null 문자열을 반환한다.

이로 인해, valueOf() 는 더 안전하고 다재 다능한 방법으로 간주되며, 원시 타입과 객체를 안전하게 문자열로 변환할 때 자주 사용한다.

 

2. length() 메서드

 Java에서 문자열의 길이를 반환하는데 사용되는 메서드이다. 주로 문자열의 문자 수를 구할 때 사용한다. 

 

- 정의 : 인스턴스 메서드로써 해당 문자열의 길이를 반환

- 반환값 : 문자열의 길이 (즉, 문자열에 포함된 문자 수)를 int 타입으로 반환

- 예시

String exStr3 = "Hello, World!";
int length = str.length();
System.out.println(length);	// 출력 : 13

( 특수문자, 띄워쓰기(공백)도 길이에 포함된다. )

 

- 주의 사항 : 

빈 문자 ("")일 경우 0을 반환한다.
 문자열의 길이가 배열이나 컬렉션의 크기와 같지 않다는 점에 주의해야 한다. 예를 들어, 배열의 길이는 length 라는 속성을 사용하며, 메서드가 아닌 속성으로 접근한다.

 

- 다른 유형의 길이 계산

배열
배열의 길이는 .length 속성으로 구할 수 있다. 예를 들어 int[] arr = {1, 2, 3}; 의 길이는 arr.length 로 구한다.
리스트
리스트 같은 컬렉션의 크기는 .size() 메서드로 구한다. 예를 들어 List<String> list = new ArrayList<>(); 의 크기는 list.size() 로 구한다.

 

3. getNumericValue()

 getNumericValue() 메서드는 문자(Character)에 대한 유니코드 값을 기반으로 숫자를 반환하는 메서드이다. 이 메서드는 주로 문자가 숫자에 해당하는 경우, 그 숫자 값을 정수(int)로 반환한다.

char char = '5';
int intChar = Character.getNumericValue(char);

 

 

 

Main

다락방 Part2 1차시

반복문 배열

 

[1] 반복문

 

 1-1. for 문

for (초기값 ; 조건문 ; 증가연산) { 연산 }

 

 1-2. while 문

while (조건) { 연산 }

 

for 문과 while 문의 활용점 :
while 문은 보편적으로 무한적인 반복이 있을 때 사용한다.
for 문은 정함이 있을 때, 즉 해당 range 가 파악이 될 때 사용한다.

 

1-3. do - while

위험성이 있기 때문에 사용을 지양하는 것을 권장한다.

 

1-4. 반복문 안의 break; 와 continue;

break;    ⇒  가장 가까운 반복문을 빠져나간다.

continue;   ⇒  해당되는 for 문에 대해서만 다시 위로 올라가서 증감식을 주고 조건식을 확인하고 밑으로 내려 온다.

 

[2] 배열

배열에서 가장 중요한 것은 Index. 배열은 Index 로 접근하기 때문에 속도가 빠르다. 배열은 초기에 공간을 잡아줘야 한다.

 

2-1. 배열의 초기화

int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};  // 9개의 공간의 배열
int[] arrs = new int[9];

// 배열의 길이는 변수명.length
for (int i = 0 ; i < arr.length ; i++ ) { arrs[i] = i + 1; }

// iter => 향상된 for 문 단축키
for (int i : arrs){ System.out.println("i = " + (i + 1)); }

 

2-2. 2차원 배열

 

 

[exQ] 배열과 반복문에 대한 예시 (로또 문제)

 

 

Try

toString() 메서드와 valueOf() 메서드를 좀 더 명확하게 구분할 수 있으면 좋을 것 같다.