이 영역을 누르면 첫 페이지로 이동
codesche's blog 블로그의 첫 페이지로 이동

codesche's blog

페이지 맨 위로 올라가기

codesche's blog

1110. 더하기 사이클

  • 2022.12.08 21:36
  • Algorithm/백준

https://www.acmicpc.net/problem/1110

 

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,

www.acmicpc.net

 

1. 문제

자릿수 개념에 대한 응용이 익숙하지 않아서 나로서는 문제풀기가 쉽지 않았다.

N을 10으로 나눈 값이 몫이고, N을 10으로 나눈 값의 나머지를 활용하여 푼다는 생각은 하지도 않았기 때문이다.

알고리즘 문제 하나하나 풀기가 여간 쉬운 일이 아니다... 조금씩 정리해나가면서 문제풀이 경력을 쌓아나가야겠다는

생각이 들었는데 해당 문제에서 나온 해결법은 다른 곳에서도 충분히 활용가능할 듯 싶다.

 

2. 풀이

사례를 보면 이렇다

 

## 1 사이클 ##

2 + 6 = 8

68


## 2 사이클 ##

6 + 8 = 14

84

 

## 3 사이클 ##

8 + 4 = 12

42

 

# 4 사이클 ##

4 + 2 = 6

26 => 새로운 수는 26

 

N(주어진 수)의 10의 자리와 합의 수로 또 다른 수를 만들어내는 방식인데 

같은 방식으로 순환을 시켜서 원래 숫자인 N이 나왔을 경우의 사이클의 길이를 구하는 것이다.

(결국 몇 번 계산해야 N이 나오는가에 대한 답을 출력해야 함)

 

여기서 알아야 할 것이 있다.

N의 1의 자리수는 그 다음 수의 십의 자리로 가는데 이를 식으로 표현하면 다음과 같다.

(10의 자리수) = (N % 10) * 10

(26 % 10) * 10 = 60

=> 즉 10으로 나눈 나머지 값에 10을 곱하면 새로운 수의 10의 자리수가 되는 것이다.

 

그럼 1의 자리수는 어떻게 구할까.

눈치 빠르신 분들은 알겠지만 26을 10으로 나눈 몫과 나머지를 더하면 8이 나온다.

이걸 잘 활용하면 1의 자릿수를 구하는 식을 세울 수 있다.

(1의 자리수) = ((N / 10) + (N % 10)) % 10

((26 / 10) + (26 % 10)) % 10 = 8

 

위 두개의 값을 더하면

(새로운 수) = ((N % 10) * 10 + (((N / 10) + (N % 10)) % 10)

 

마지막으로 새로운 수와 기존의 수가 같을 경우 해당 사이클 숫자를 출력해야 하는데

새로운 수 계산시 사이클 숫자를 확인해주는 변수를 하나 지정해준다.

이 경우 변수를 하나 지정해서 기존의 수를 복사하여 새로운 수와 비교하면 된다.

 

3. 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
 
        int count = 0;
        int copy = N;
 
        do {
            N = ((N % 10) * 10) + (((N / 10) + (N % 10)) % 10);
            count++;
 
            if (copy == N) {
                break;
            }
        } while (copy != N);
        System.out.println(count);
    }
}
Colored by Color Scripter
cs

** 다른 소스코드 **

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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));
        int N = Integer.parseInt(br.readLine());
        int temp = N;
        int count = 0;
 
        while (true) {
            int left = temp / 10;
            int right = temp % 10;
            temp = right * 10 + (left + right) % 10;
            count++;
 
            if (N == temp) {
                break;
            }
        }
        System.out.println(count);
    }
}
 
Colored by Color Scripter
cs

입력한 숫자를 왼쪽, 오른쪽 변수로 나누어서 구현했다. 

 

4. 느낀 점 및 추가사항

자릿수 개념을 응용하는 문제는 생각보다 자주 나와서 이번 기회에 정리를 잘해야겠다는 생각이 들었다.

그렇게까지 어려운 문제는 아니었던 것 같은데 막상 접하고 나니 해결방법이 쉽게 떠오르지 않았다.

아직도 풀어야 할 문제는 많기에 계속 풀어봐야 할 것 같다.

이번 문제를 풀면서 알고리즘 문제들은 암기하면서 풀기보단

조금씩 조금씩 생각의 영역을 넓혀가는 게 중요하다는 생각을 했다.

'Algorithm > 백준' 카테고리의 다른 글

1940. 주몽  (1) 2022.12.25
11720. 숫자의 합 구하기  (0) 2022.12.23

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 1940. 주몽

    1940. 주몽

    2022.12.25
  • 11720. 숫자의 합 구하기

    11720. 숫자의 합 구하기

    2022.12.23
다른 글 더 둘러보기

정보

codesche's blog 블로그의 첫 페이지로 이동

codesche's blog

  • codesche's blog의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (76)
    • Algorithm (15)
      • 백준 (3)
      • 프로그래머스 (10)
      • inflearn 알고리즘(Java) (2)
    • 블로그소개 (1)
    • Back-End (11)
      • Java (10)
      • SpringBoot (1)
    • Database (2)
      • MySQL (0)
      • MariaDB (1)
      • Redis (0)
      • 개념, 이론 (1)
    • Front-End (0)
      • html, css, javascript (0)
    • Git (2)
    • 알고리즘 지식 (11)
      • 자료구조 (11)
    • Study Cafe (21)
      • 기술면접 (6)
      • Clean Code 스터디 (14)
      • CS 스터디 (0)
      • 개발용어 (1)
    • 주간 에세이 (10)
    • DevOps (3)
      • 배포, Front&Back 연동 (1)
      • AWS (0)
      • Docker (1)
      • 이론 (1)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 주간에세이
  • 클린코드
  • 자바 변수
  • git commit
  • 개발자 현실
  • java
  • 자바 기초
  • 자료구조

나의 외부 링크

정보

The Code의 codesche's blog

codesche's blog

The Code

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © The Code. Designed by Fraccino.

티스토리툴바