ejyoo's 개발 노트

10430 번 : 나머지 본문

문제풀이/백준 입출력과 사칙연산

10430 번 : 나머지

ejyoovV 2021. 3. 3. 10:42

  • 🤜🏻 주의할 점
    • 입력은 공백단위로 구분된다.
    • 나머지를 구하는 문제라 변수를 정수형으로 계산한다.
  • 🤜🏻 풀이 전 모듈러 연산(Modular Arithmetic) 과 증명

    4개의 조건이 있음.

    1) (A+B) % C

    2) (A%C + B%C)%C

    3) (A*B) % C

    4) (A%C * B%C)%C

    1) 2) 식의 값이 같고 3) 4) 식의 값이 같다.

    Set.

    a mod c = T

    b mod c = S

    a = T + ic(i는 임의의 정수)

    b = S + jc(j는 임의의 정수)

    (a + b) mod c = ((T+ic)+(S+jc)) mod c

    = ((T+S) + (i+j)c) mod c

    = (T+S) mod c

    = ((a mod c) + (b mod c)) mod c

    ⇒ a와 b에 대해 c로 나눈 나머지 값을 mod로 표현하여 정의한다.(이때 T와 S는 a와 b의 나머지다)

    그럼 a와 b에 대하여 식을 변형할 수 있는데 그게 아래와 같다.

    Set.

    a mod c = T

    b mod c = S

    a = T + ic (i는 임의의 정수)

    b = S + jc (j는 임의의 정수)

    이 두 식을 갖고 증명하려는 식에 대입해보면

    (a+b) mod c = ((T+ic) + (S + jc)) mod c

    = ((T+S) + (i+j)c) mod c

    c = 0이 아닌 이상 (i+j)*c는 0 또는 3의 배수다.

    i와 j 값에 상관없이 c의 배수이기 때문에 (i+j)*c mod c = 0 이다.

    즉 나머지 연산에서 (T+S)의 나머지에 대하여(i+j)*c는 위 식의 나머지 값에 대하여 아무런 영향을 미치지 못한다.

    (a+b) mod c = ((T+ic) + (S + jc)) mod c

    = ((T+S) + (i+j)c) mod c

    = (T+S) mod c

    그리고 T와 S는 처음 정의했듯이 각 각 a mod c 와 b mod c이므로 이들로 교체해주면 증명 공식이 완성된다.

    (a + b) mod c = ((T+ic) + (S+jc)) mod c

    = ((T+S) + (i+j)c) mod c

    = (T+S) mod c

    = ((a mod c) + (b mod c)) mod c

    Set.

    a mod c = T

    b mod c = S

    a = T + ic (i는 임의의 정수)

    b = S + jc (j는 임의의 정수)

    (a * b) mod c = ((T+ic) * (S+jc)) mod c

    = ((TS) + Tjc + Sic + (ij)c^2) mod c

    = ((TS) + (Tj + Si)c + (ij)c^2) mod c

    = (TS) mod c

    = ((a mod c) * b mod c)) mod c

    곱셈을 풀어준 뒤 c로 묶인 것들은 나머지 값에 영향을 미치지 못하므로 생략해주면 위 같이 공식이 성립함.

  • 🤜🏻풀이방법(2가지)

    1) Scanner로 입력받아 연산

    2) BufferedReader로 입력받아 연산

  • 🤜🏻방법1 - Scanner
    import java.util.Scanner;
    
    public class Main {
    	public static void main(String[] args) {
    		Scanner in = new Scanner(System.in);
    		
    		int A = in.nextInt();
    		int B = in.nextInt();
    		int C = in.nextInt();
    		
    		in.close();
    		
    		System.out.println((A+B)%C);
    		System.out.println((A%C+B%C)%C);
    		System.out.println((A*B)%C);
    		System.out.println((A%C*B%C)%C);
    	}
    }
  • 🤜🏻방법2 - BufferedReader

    BufferedReader 를 사용

    readLine() 을 통해 입력 받아 연산하는 방법 두가지로 나뉨

    readLine은 한 행을 전부 읽기 때문에 공백 단위로 입력해 준 문자열을 공백 단위로 분리해주어야 함.

    • 1) StringTokenizer 클래스 사용

      st.nextToken()은 문자열을 반환하니 Integer.parseInt()로 int 형변환 시켜주어야 함.

      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));
      		
      		String str = br.readLine();
      		StringTokenizer st = new StringTokenizer(str," ");
      		int A = Integer.parseInt(st.nextToken());
      		int B = Integer.parseInt(st.nextToken());
      		int C = Integer.parseInt(st.nextToken());
      		
      		System.out.println((A+B)%C);
      		System.out.println((A%C+B%C)%C);
      		System.out.println((A*B)%C);
      		System.out.println((A%C*B%C)%C);
      		
      		/*
      		 굳이 String 변수 생성하지 않고 입력과 동시에 구분자로 분리해줘도 됨.
      		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      		
      		StringTokenizer st = new StringTokenizer(br.readLine()," ");
      		int A = Integer.parseInt(st.nextToken());
      		int B = Integer.parseInt(st.nextToken());
      		int C = Integer.parseInt(st.nextToken());
      		
      		System.out.println((A+B)%C);
      		System.out.println((A%C+B%C)%C);
      		System.out.println((A*B)%C);
      		System.out.println((A%C*B%C)%C);
      		*/
      	}
      }
    • 2) split() 사용
      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[] str = br.readLine().split(" ");
      		int A = Integer.parseInt(str[0]);
      		int B = Integer.parseInt(str[1]);
      		int C = Integer.parseInt(str[2]);
      		
      		System.out.println((A+B)%C);
      		System.out.println((A%C+B%C)%C);
      		System.out.println((A*B)%C);
      		System.out.println((A%C*B%C)%C);
      	}
      }
  • 🤜🏻그 외 방법3(2가지 - 성능개선)
    • 1) BufferedReader + StringBuilder
      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));
      		
      		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
      		int A = Integer.parseInt(st.nextToken());
      		int B = Integer.parseInt(st.nextToken());
      		int C = Integer.parseInt(st.nextToken());
      		
      		StringBuilder sb = new StringBuilder();
      		
      		sb.append((A+B)%C);
      		sb.append('\n');
      		
      		sb.append((A%C+B%C)%C);
      		sb.append('\n');
      		sb.append((A*B)%C);
      		sb.append('\n');
      		sb.append((A%C*B%C)%C);
      		
      		System.out.println (sb);
      	}
      }
    • 2) BufferedReader + BufferedWriter
      import java.io.BufferedReader;
      import java.io.BufferedWriter;
      import java.io.IOException;
      import java.io.InputStreamReader;
      import java.io.OutputStreamWriter;
      import java.util.StringTokenizer;
      
      public class Main {
      	public static void main(String[] args) throws IOException {
      		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      		
      		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
      		int A = Integer.parseInt(st.nextToken());
      		int B = Integer.parseInt(st.nextToken());
      		int C = Integer.parseInt(st.nextToken());
      		
      		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
      		
      		bw.write((A+B)%C + "\n");
      		bw.write((A%C+B%C)%C + "\n");
      		bw.write((A*B)%C + "\n");
      		bw.write((A%C*B%C)%C + "\n");
      		
      		bw.flush();
      		bw.close();
      	}
      }

'문제풀이 > 백준 입출력과 사칙연산' 카테고리의 다른 글

1001번 : A-B  (0) 2021.03.03
10998번 : A X B  (0) 2021.03.03
1008번 : A/B  (0) 2021.03.03
10869번 : 사칙연산  (0) 2021.03.03
2588번:곱셈  (0) 2021.03.03