본문 바로가기

코딩 테스트

[코딩테스트] 백준 2588번: 곱셈

# 문제

 

# 코드

  • Scanner, BufferedReader + InputStreamReader 사용

▼ Scanner 사용 - 1

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    int A = sc.nextInt();
    int B = sc.nextInt();

    String strB = String.valueOf(B);
    String[] arrB = strB.split("");

    int sum1 = A * Integer.parseInt(arrB[2]);
    int sum2 = A * Integer.parseInt(arrB[1]);
    int sum3 = A * Integer.parseInt(arrB[0]);
    int sum4 = sum1 + (sum2 * 10) + (sum3 * 100);

    System.out.println(sum1);
    System.out.println(sum2);
    System.out.println(sum3);
    System.out.println(sum4);
  }
}

 

▼ Scanner 사용 - 2

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    String A = sc.nextLine();
    String B = sc.nextLine();

    char[] charB = B.toCharArray();

    int numA = Integer.parseInt(A);

    int sum1 = numA * (charB[2] - '0');
    int sum2 = numA * (charB[1] - '0');
    int sum3 = numA * (charB[0] - '0');
    int sum4 = sum1 + (sum2 * 10) + (sum3 * 100);

    System.out.println(sum1);
    System.out.println(sum2);
    System.out.println(sum3);
    System.out.println(sum4);
  }
}

 

▼ BufferedReader + InputStreamReader 사용

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 A = Integer.parseInt(br.readLine());
    int B = Integer.parseInt(br.readLine());

    int lenB = String.valueOf(B).length();
    int sum = A * B;

    int[] arrLen = new int[lenB];

    for (int i = 0; i < lenB; i++) {
      int result = B % 10;
      arrLen[i] = result;

      B = B / 10;

      System.out.println(arrLen[i] * A);
    }

    System.out.println(sum);
  }
}

 

# 입/출력 결과

▼ Scanner 사용 - 1

 

▼ Scanner 사용 - 2

 

▼ BufferedReader + InputStreamReader 사용

 

# 과정

  • 첫 번째, 두 번째는 Scanner 클래스 사용해서 문제를 풀었다.
    • 첫 번째 방식
      • 사용자한테 입력 받은 값을 int타입으로 저장.
      • 두 번째로 입력 받은 값을 String 타입으로 형변환 한 다음, .split()를 사용하여 String타입의 배열로 값을 저장.
      • 첫 번째 입력 받은 값과 배열의 index 값을 각각 곱한 값을 출력.
      • index의 값과 계산을 끝낸 각각의 자리수에 맞추어 10, 100 을 곱한 다음 전체 값을 더하여 최종 값 만들기.
    • 두 번째 방식
      • 사용자한테 입력 받은 값을 String타입으로 저장.
      • 두 번째로 입력 받은 값을 .toCharArray() 메서드를 사용하여 char타입의 배열에 낱개로 저장.
      • 첫 번째로 입력 받은 값을 숫자형으로 변환.
      • 첫 번째 입력 값과 char타입의 배열에 저장된 값의 index 각각 곱하여 출력. 이때 char[index] 형태는 숫자가 아스키코드로 출력되기 때문에 - '0'을 붙이기.
      • index의 값과 계산을 끝낸 각각의 자리수에 맞추어 10, 100 을 곱한 다음 전체 값을 더하여 최종 값 만들기.
  • 세 번째는 BufferedReader + InputStreamReader 를 사용해서 문제를 풀었다.
    • 사용자한테 입력 받은 값을 int타입으로 저장.
    • 두 번째로 입력 받은 값의 길이를 구하기. String.valueOf(두 번째로 입력받은 값을 저장한 변수).length(); 사용
    • int형 배열을 만들기.
    • for문을 사용하여 두 번째 입력 받은 값의 길이 만큼 돌리기.
      • 두 번째로 입력 받은 값을 10으로 나누고 나머지 값을 int형 배열의 각 index에 저장하기.
      • 두 번째로 입력 받은 값을 10으로 나누고 몫을 다시 두 번째로 입력 받은 값을 담은 변수에 저장하기.
      • for문에서 1회 실행될 때마다 int형 배열에 담은 index값과 첫 번째로 입력받은 값 곱하여 출력.
    • for문이 끝난 다음 최종으로 첫 번째 입력 받은 값과 두 번째 입력 받은 값 곱하여 출력.

 

# 느낀 점

  • Java 기초 지식이 많이 부족함을 느꼈다.
  • 처음에 나는 두 번째로 입력 받은 값을 1글자씩 쪼개어 배열에 담은 다음 첫 번째 입력 받은 값과 곱하여 출력하는 방식을 생각했다. 이 방식도 맞지만 '좀 더 간결하고 메모리 사용을 덜 하면서 3자리 수가 아니더라도 자동으로 자리수까지 계산되어 계산 과정을 출력할 수 있는 방법이 있지 않을가?'라는 생각에 다른 사람들의 소스 코드를 보았다.
  • 간결한 소스 코드와 수학적 사고 능력이 좋은 사람들이 많았다. 각 자리수를 split하여 저장하지 않고도 10으로 나누어 나머지 값을 저장하는 방법도 있었다. 그래서 이를 참고하여 10으로 나누어 나머지 값을 저장하는 방법으로 풀어보았다.
  • 처음에 입력 받은 값을 int형으로 받을지, String으로 받을지 고민을 했다. 두 가지 방법 다 사용해보았고, 각각의 차이점에 무엇이 있는지 chat-gpt와 대화를 하면서 이해했다. 그리고 여기서 Java 기초지식이 많이 부족함을 느꼈다.

 

# 메모

  • int타입을 문자열로 변환할 때.
    • String.valueOf(변수); 사용
  • .split()는 문자열 타입만 가능.
  • 문자형 char의 배열로 저장하려면 String타입의 .toCharArray() 메서드를 사용해야한다.
    • .toCharArray() 메서드는 문자열을 문자형으로 변환할 때 사용한다.
  • int[] 배열은 초기화가 필수.
    • int[] arr = new int[6];
    • [6] 에서 6이란 숫자는 크기를 말한다.
    • 값에 접근할 시, int value = arr[i]; 로 하면 된다
  • ArrayList<Integer>도 사용할 수 있었으나 사용 안함. int[]와 ArrayList<Integer>의 차이점을 이해해야 함.
    • chat-gpt에 물어보니 차이점을 잘 알려주었다.
      항목  int[] (기본형 배열)  ArrayList (컬렉션)
      크기 조절 고정 크기 (변경 불가) 유동 크기 (자동 증가 가능)
      요소 추가 인덱스로 직접 할당 (arr[i] = x) .add() 메서드 사용
      자료형 기본형 int 객체형 Integer (박싱 필요)
      성능 빠름 (메모리, 속도 효율적) 느림 (박싱/언박싱으로 성능 저하)
      메서드 지원 없음 많음 (add, remove, sort 등)
      메모리 사용량 적음 많음 (객체로 저장되므로 오버헤드)
      초기화 방법 new int[크기] 필요 new ArrayList<>()
      사용 용도 단순한 수치 처리, 고정 크기 데이터 동적 데이터 저장, 리스트 조작
      출력 편의성 Arrays.toString() 필요 System.out.println(list) 가능