문제

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

26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.

위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.

N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.

 

출력

첫째 줄에 N의 사이클 길이를 출력한다.


 

정작 소스코드는 엄청 간단했는데 풀다가 몇번 엥? 한 문제 ..

다른 분들 코드를 보면 더 간단하게 해결 된 문제가 많았는데, 우선 내가 푼 방법은 이렇다.

 

우선, 문제를 분석해봤을 때 푸는 방법은

  • 각 자리 수를 더한다. (10 미만인 경우 10을 더한다)

  • 새로운 수 = 주어진 수의 가장 오른쪽 자리 (일의자리) + 앞에서 구한 값의 오른쪽 자리 (일의자리) 

여기서 앞에서 구한 값은 각 자리수를 더한 값이고, 주어진 수는 초기에는 N, 이후에는 계속해서 계산 된 새로운 수로 볼 수 있다.

따라서 식을 조금 정리해보면

 

새로운 수 = ( 오른쪽 자리 수 * 10) + { (새로운 수 / 10) + (새로운 수 % 10) % 10 } 로 볼 수 있다.

새로운 수를 구한 뒤에는 오른쪽 자리 수 값을 새로운 수 % 10으로 업데이트 해 준다.

 

 

코드로 써 보면

new_number = ((sec_num)*10) + (((new_number/10) + (new_number%10)) % 10); // 68
sec_num = new_number%10;

 

로 해결할 수 있었다.


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.Scanner;
 
public class Main{
    public static void main(String[] args) {
        
        Scanner scan = new Scanner(System.in);
        
        int N               = scan.nextInt();
        int new_number     = N, sec_num = N%10;
        int cycle = 0;
        
        while(true) {
            cycle += 1;
 
            new_number = ((sec_num)*10+ (((new_number/10+ (new_number%10)) % 10); // 68
            sec_num = new_number%10;
            
            if (N==new_number) break;
        }
        System.out.println(cycle);
    }
}
cs
문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

 

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

 

출력

각 테스트 케이스마다 A+B를 출력한다.


처음에 보고 ....? 했던 문제

아니 종료조건이 없는데 어떻게 종료를 하죠...? 였지만 이건 while 문 문제였다.

 

A, B를 한 줄에 입력받고, 공백(띄어쓰기)를 기준으로 분리한 후 더한 값을 append한다.

이때 while 조건 안에는 입력받은 라인이 null이 아닐 경우 로 주면 된다! 

 

문제를 풀면서 import 문제를 너무 많이 겪었었다 .. 

평소에는 Scanner 함수만 써서, Scanner 관련 모듈만 import했었는데 라인을 읽어오다보니 BufferedReader를 썼다.

 

거기서.. 에러가 좀 많이났었다

> InputStreamReader cannot be resolved to a type 이라던지..

> StringTokenizer cannot be resolved to a type 이라던지 ..

 

 

보통은 빨란 라인에 커서를 갖다 대면 이런 창이 뜨고, 해결할 수 있게 해결책? 을 제공해주기 때문에

import ~~ 되어있는 맨 위 솔루션을 클릭해서 해결해줬다.

 


 

소스코드

 

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
26
27
28
29
30
import java.io.*;
import java.util.StringTokenizer;
 
public class Main{
    public static void main(String[] args) {
        
        try {
            BufferedReader     br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st;
            
            StringBuilder     sb = new StringBuilder();
            
            String AB_Line;
            
            while( (AB_Line = br.readLine()) != null) {
                st = new StringTokenizer(AB_Line, " ");
                
                int A = Integer.parseInt(st.nextToken());
                int B = Integer.parseInt(st.nextToken());
                
                sb.append(A+B).append('\n');
            }
            
            System.out.println(sb);
        }
        
        catch (Exception e) {
        }
    }
}
cs
문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

 

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

입력의 마지막에는 0 두 개가 들어온다.

 

출력

각 테스트 케이스마다 A+B를 출력한다.

 


for문 문제 졸업하고 시작하는 while문! 

코딩을 점점 안하게 되면서 (...) 반복문은 대부분 for문으로 쓰고, while문은 무한루프에만 쓰다보니까 생소하게 느껴진 데서 충격받았다.

 

while ( 조건 ) {

 수행구문

 

으로 동작하고, 조건이 참이면 동작 한다!

 

그래서 문제를 풀어보면

 

while (true) {

   A, B 입력

   

   if ( A, B가 0이면 ) break;

 

   A + B 출력

}

 

으로 해결할 수 있다.


 

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        int A =0, B=0;
        Scanner scan = new Scanner(System.in);
        
        while (true) {
            A = scan.nextInt();
            B = scan.nextInt();
            if(A==0 && B==0break;
            System.out.println(A+B);
        }
    }
}
cs
문제

정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)

둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.

 

출력

X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.

 


반복해서 입력받을 횟수 (N)와 검사할 조건 (X)를 입력받고,

N의 수만큼 입력받은 후 판별해서 출력해주면 되는 문제

if 문이 함께 쓰여야 한다!

 

 

N 입력

X 입력

 

for ( i는 0부터 N-1까지) {

   정수 입력 

   

   if (정수 < X ) 정수 출력

 

 


 

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.Scanner;
 
public class Main{
    public static void main(String[] args) {
        
        Scanner scan = new Scanner(System.in);
        
        int N = scan.nextInt();
        int X = scan.nextInt();
        
        for (int i=0; i<N; i++) {
            int num = scan.nextInt();
            if (num < X) {
                System.out.print(num+" ");
            }
        }
    }
}
cs
문제

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

 

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

 

출력

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

 


2438 별찍기 문제에서 조금 더 변형시켜야 하는 문제!

 

acmicpc(baekjoon) - 2438 : 별 찍기 - 1

문제 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제 입력 첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다. 출력 첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다. 풀이 이중 for

se-cure.tistory.com

2438 별찍기 문제에서는 

*

**

***

****

***** 

형태로 출력이 돼야 했으니까, 아래처럼 문제를 풀었다.

 

for( i는 1부터 N까지, 1씩 증가) {          -------- ( 1 )

   for ( j는 1부터 i까지, 1씩 증가) {        -------- ( 2 )

     * 출력

   }

}

 

 

하지만 이제 앞부분 공백이 들어가고, 우측 정렬로 출력이 되어야 하니까,

(1) 번 for문 안에 공백 출력하는 for 구문과, *을 출력하는 for 구문 두 개를 작성해줬다.

 

for ( i는 1부터 N까지, 1씩 증가 ) {          ------ (1)

      for ( j는 0부터 (N-i)-1까지, 1씩 증가 ) {   ------ (2) // for ( j=0; j<N-i; j++)

             공백 " " 출력

      }

 

      for ( k는 j부터 N-1까지, 1씩 증가 ) {    ------ (3)  // for ( k=j; k<N; k++)

             * 출력

      }

      개행

}

 

 

(1)은 똑같이 1~N으로 설정하고, (총 5줄 출력)

 

(2)번 for문은 공백을 출력한다.

 - 0부터 N-i까지, 즉 첫번째 라인 (i=1) 일 때는 공백이 4개, 두 번째 라인 (i=2)일 때는 공백이 3개여야 하므로 n-i 로 설정한다. 

 

(3)번 for문에서는 *을 출력한다.

 - j부터 N-1까지인데, 이유는 (2)번 for문에서 공백이 출력이 되었으므로, 그 개수 이후부터, N개만큼 출력되어야 한다.

   예를 들어, 두 번째 라인 (i=2)일 때, j는 0부터 (N-i)-1 (== 2) 까지 총 3번 출력되었을 것이다. 

   이 때 남은 2개는 *이 출력되어야 하므로, 조건을 k는 j부터, k < N 으로 설정해주면 3, 4 이렇게 두 번 반복한다.

 

 

 


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.Scanner;
 
public class Main{
    public static void main(String[] args) {
        
        Scanner scan = new Scanner(System.in);
        
        int N = scan.nextInt();
        int j;
        for (int i=1; i<=N; i++) {
            for (j=0; j<N-i; j++) {
                System.out.print(" ");
            }
            for (int k=j; k<N; k++) {
                System.out.print("*");
            }
            System.out.print("\n");
        }
    }
}
cs

+ Recent posts