ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준/BOJ] 1009번 : 분산처리 (JAVA / 자바)
    백준 2022. 1. 28. 15:41

    안녕하세요~ 코딩하는 코알못 코메인입니다.

     

     

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

     

    1009번: 분산처리

    입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 정수 a와 b가 주어진다. (1 ≤ a < 100, 1 ≤ b < 1,000,000)

    www.acmicpc.net


    - 문제 -

     

    난이도 브론즈 3 문제이다.

     

    자바에서 입력방식은 scanner와 bufferedreader가 있다.

    자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.

    bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.

    더 자세한 내용은 아래 글 참고 하면 좋다.

    https://comain.tistory.com/3

     

    (JAVA / 자바) Scanner 와 Bufferedreader

    안녕하세요~ 코딩하는 코알못 코메인입니다. 이번엔 백준 문제 풀면서 계속 언급될 scanner와 bufferedreader에 대한 간단한 정리를 해볼거다. 자바에서 입력은 scanner와 bufferedreader가 있다. 우선 각자

    comain.tistory.com

     

    풀이 방법

    a제곱 b 번의 자리 번호를 찾는 문제이다. 컴퓨터는 10개가 있으니 1번 자리부터 10번자리까지 총 10개가 있는 것이고, 10번이 지나면 1부터 다시 시작한다. 그렇다면 그말은 곧 번호에서 10을 나눠서 나오는 나머지 값이 자리가 된다는 것이다.

     우선 a에 올 수 있는 수는 1부터 99까지이고 이것들을 제곱 했을 떄 증가하는 패턴을 본다. 하지만 99까지 다 보기엔 많다. 그럼 보자 2를 b만큼 제곱하면 그 값이 총  처리 횟수가 된다. 그럼 방금 말했듯이 총 횟수를 10으로 나누면 컴퓨터 자리 번호가 나온다. 2를 제곱하면 2, 4, 8, 16, 32, 64, ... 이 나온다. 그럼 10나누면 1자릿수만 남으니 1자릿수만 보면 2, 4, 8, 6, 2, 4, ... 나온다. 이걸 보면 번호가 2, 4, 8, 6 4개가 반복되는 것을 볼 수 있다. 12도 계산해보면 12, 144, 1728, 20736, ... 이 나온다 1의자리수만 보면 2, 4, 8, 6이다. 2의 제곱 패턴과 같다. 그러면 10이 넘어가는 수들을 10으로 나눠서 나머지 값을 구하면 좀 더 패턴 수를 줄일 수 있을 것이다.

     

    여기까지하면 제곱 패턴을 잡아야할 a값들을 구햇다. a % 10 해주면 결국 남는건 0, 1, 2, 3, ..., 9이다. 먼가 이상하다. 0? 10은 어디갔나. 여기서 그냥 단순하게 10으로 나눠서 하면 무조건 틀릴 수 밖에 없다. a에 10의 배수들도 오는데 이것들을 10으로 나누고 나머지를 구하면 당연 0이다. 그러니 여기서는 a가 10의 배수일 때는 a에 10을 넣고, a 가 10 초과 이면서 10이 아닐때 10으로 나누고 나머지를 a값에 다시 저장한다.

     

    그럼 이제 패턴 대로 하면 a가 1일때는 계속 1이 반복된다 2일때는 2, 4, 8, 6 총 4개가 반복된다. 5일때는 5씩 총 1개가 반복한다. 이렇게 반복 패턴 가짓수를 보면 1 = 1가지 / 2 = 4가지/ 3= 4가지/ 4 = 2가지/ 5 = 1가지/ 6 = 1가지/ 7 = 4가지 / 8 = 4가지/ 9 = 2가지 / 10 = 1가지 이렇게 나온다.

     

    나온 값들로 조건 문에 넣는다. 패턴이 1가지 / 패턴 2가지 / 패턴 4가지 이렇게 나눈다.(어떻게 나눴는진 코드로 보자)

    패턴이 1가지면 해당 값a가 반복되니 해당 값을 출력한다.

    패턴이 2가지면 해당 값과 다른 값 하나가 반복되는데 2가지면 결국 반복 횟수가 홀수이냐 짝수 이냐로 비교할 수 있다.

    홀수면 해당 값, 짝수면 해당값을 제곱 후 10으로 나누고 나머지를 구한다.

    패턴이 4가지면 해당 값을 포함한 총 4개가 반복 되는 것이니 제곱 값인 b를 4로 나눠서 나머지를 구한다. 그럼 4번씩 반복하고 1~4번까지 몇번 째 반복 자릿수가 마지막인지 구할 수 있다.  하지만 4의 배수일 경우 0이 나오는데 이건 4번째 반복 자리를 말하니 0일결루 b에 4를 저장해준다. 이렇게 b를 다시 구했으면 a를 b만큼 제곱한다. 제곱하고 10으로 나눠 나머지를 구한다.

    이렇게 풀이 방법을 적어봤는데 너무 길다... 코드를 보면 좀 더 쉽게 이해 되겠지만... 혹시 모르니 요약도 해보겠다.

     

    1. 테스트 횟수 값인 a와 b값을 입력

    2. a가 10 초과할 경우 계산이 커지니 10으로 나눈 나머지 값을 a에 다시 저장.(a가 10의 배수일 땐 a에 10 저장)

    3. a에 오는 값들의 제곱을 10으로 나눈 나머지 값들은 각 패턴을 가지고 있다. (1개 반복, 2개 반복, 4개반복)

    4. 1개 반복인 수들을 조건문으로 한데 묶고 본인 자신 값을 출력.

    5. 2개 반복인 수들을 조건문으로 한데 묶고 홀수, 짝수 조건을 추가해 여부에 따른 값 출력

    6. 4개 반복인 수들을 조건문으로 한데 묶고 b값을 4로 나누고 나머지를 구한다.(b가 0이 나올 경우 4를 저장)

    7. a를 b만큼 제곱하고 10으로 나눠 나머지를 구함

     

    사용 함수 : if문, for문, Math.pow

     


    -풀이-

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main {
    	
    	public static void main(String[] args) throws IOException{
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		int T = Integer.parseInt(br.readLine());
    		
    		//T값만큼 for문을 반복
    		for(int i = 0; i < T; i++) {
    			StringTokenizer st = new StringTokenizer(br.readLine());
    			int a = Integer.parseInt(st.nextToken());
    			int b = Integer.parseInt(st.nextToken());
    			
    			//a의 %10 값을 구하고, 0일경우 10 저장
    			if(a % 10 == 0) {
    				a = 10;
    			}else if(a > 10){
    				a = a % 10;
    			}
    			
    			//반복 횟수에 따른 if문
    			if(a == 1 || a == 5 || a == 6 || a == 10) {
    				System.out.println(a);
    			}else if(a == 4 || a == 9) {
    				if(b % 2 == 0) {
    					System.out.println((int) ((a * a) % 10));
    				}else {
    					System.out.println(a);
    				}
    			}else {
    				b %= 4;
    				if(b == 0) {
    					b = 4;
    				}
    				//2제곱이면 a*a로 충분하지만 횟수가 변하는 값이면 pow나 for문 사용
    				System.out.println((int) (Math.pow(a, b) % 10));
    			}
    		}
    	}
    
    }

    -결과-

     


    아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠다.

    댓글