상세 컨텐츠

본문 제목

1769. 3의 배수

Algorithm

by aeongiii 2024. 11. 28. 20:01

본문



1. 문제 분석
    1) 주어진 수가 3의 배수인지 알아내기 위해, 자릿수를 모두 더해서 나온 "한 자리 수"가 3의 배수인지 구해야 한다.
    2) 한 자리 수가 될 때까지 계속해서 자릿수를 더해야 하며, 이 작업을 몇번 반복했는지 출력해야 한다.
    3) 주어진 수가 3의 배수라면 YES, 아니라면 NO를 출력한다.

2. 제약 조건
    자연수 X <= 1.000.000"자리"

3. 의사결정
 [ 1. 문자열 > 문자 > 정수로 형변환하는 경우 ]
    1) 주어진 수 number를 문자열로 입력받는다. (길이 재기 편하도록)
    2) 다 더한 숫자가 "한자리 수가 될 때까지" while문을 반복한다.
        (1) for문을 사용하여 number를 한글자씩 인덱싱하면서 누적한다.
        (2) number를 갱신한다.
    3) 한자리수가 되어 while문을 빠져나오면, 3의 배수인지 확인 후 YES / NO를 출력한다.

 [2. 형변환 없이 정수로만 진행하는 경우 ]  ===> 이걸로 진행하면 X . int나 long으로 풀 수 없다...
    1) 주어진 수 number를 정수로 입력받는다.
    2) (안쪽 while)  %10 해서 마지막 자리를 뽑아내 누적하고,  /10 해서 누적한 자리를 버린다. number의 길이만큼 반복한다.
    3) (바깥쪽 while)  number 변수를 누적값으로 갱신한다. count++ 한다. number가 한자릿수가 될 때까지 반복한다.
    4) count와 Yes/No를 출력한다.

4. 문제 해결
    1) char -> int 변환 방법 : 문자로 되어있는 char에서 '0'값을 뺀다.
       ex) char 값인 '1'을 int형으로 변환하면 아스키코드 값 49이다.
           우리는 int값 1이 필요하므로, 49-48 = 1을 만들어야 한다.
           char 값인 '0'은 아스키코드 48이다. 따라서, char '1' - char '0' = 1이 된다.
    2) 더 간단한 방법 : int일때 %10으로 계산하면 끝자리수를 알 수 있다! 이를 누적하면 형변환 없이 더 빠르게 계산 가능
    3) 첫번째 while문의 조건 구하기
        (1) 정수 길이를 직접 구해서 1이 아닌 경우 반복한다. : (int)(Math.log10(number)+1) 사용
        (2) 정수 길이가 두자릿수 이상일 경우 반복한다. number >= 10 사용
    4) Integer.toString() : 정수를 String으로 변환한다.
       String.valueOf()의 : 모든 데이터타입을 String으로 변환할 수 있다. 속도 차이는 거의 비슷하다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String number = br.readLine(); // 주어진 수를 입력받아 number에 넣음
        int count = 0; // while문 반복 횟수 기록용

        // 자릿수를 계속 더하면서 한 자릿수가 될 때까지 반복
        while (number.length() > 1) { // 길이가 1을 초과할 때 while문 계속 반복
            int sum = 0; // 누적할 변수 sum 선언

            // "number의 자릿수만큼" for문 돌려서 각 자릿수 누적 : number를 캐릭터 배열로 바꿔서 배열의 각 요소를 기준으로.
            for (char c : number.toCharArray()) { // toCharArray를 사용하여 char 배열로 만든다.
                sum += c - '0'; // 정수로 만들어서 누적해줄건데, 아스키코드 "48"만큼을 빼서 정수 만들어주기
            }
            number = Integer.toString(sum); // 누적값을 다시 문자로 변환하여 number 갱신
            count++;
        }
        System.out.println(count);
        System.out.println(Integer.parseInt(number) % 3 == 0 ? "YES" : "NO"); // 숫자로 변환해서 3의 배수 찾기

    }
}

 

'Algorithm' 카테고리의 다른 글

31562. 전주 듣고 노래 맞히기  (1) 2024.11.29
9933. 민균이의 비밀번호  (0) 2024.11.29
10828. 스택  (0) 2024.11.28
10845. 큐  (1) 2024.11.28
12605. 단어 순서 뒤집기  (1) 2024.11.28

관련글 더보기