[★1][백준3052번]나머지 (JAVA)

Date:     Updated:

카테고리:

태그:

[★1][백준3052번]나머지 (JAVA)

3052번 문제 ☞ https://www.acmicpc.net/problem/3052

난이도 ☞ [★1]

나머지

  • 문제
    • 두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.
      수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.
    • 첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.
    • 첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.

      예제입력 예제출력
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      10
      예제입력 예제출력
      42
      84
      252
      420
      840
      126
      42
      84
      420
      126
      1
      예제입력 예제출력
      39
      40
      41
      42
      43
      44
      82
      83
      84
      85
      6

내가 푼 풀이

이번 문제도 매우 쉬울 수도 있고, 조금 애를 먹을 수도 있다. 하지만 HashSet을 쓴다면 정말 쉬운 문제가 되어진다. 그럼 간략하게 HashSet에 대해서 코멘트를 좀 해보고 넘어가도록 하겠다.

HastSet

  • 자바 Collection 중 Set의 파생 클래스. 즉, Set 인터페이스를 구현
  • 멤버의 중복 여부를 체크하기 위해 인스턴스의 동일성을 확인해야 함
  • 중복원소를 허용하지 않아 중복되는 원소는 하나만 저장함
  • 동일성 구현을 위해 필요에 따라 equals()와 hashCode() 메서드를 재정의 함
    • 아이디가 동일한 경우 같은 멤버이므로 중복되지 않도록 Member 클래스의 equals()와 hashCode() 메서드를 재정의함
  • HashSet은 순서의 개념이 없어 정렬하길 원한다면 리스트로 변환 후 정렬해야 함

[ 풀이 1 ]

메모리 : 17672KB
시간 : 208ms

Scanner

import java.util.HashSet;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		
		HashSet<Integer> hs = new HashSet<Integer>();
		
		for (int i = 0; i < 10; i++) {
			hs.add(s.nextInt() % 42);
		}
		
		s.close();
		
		System.out.println(hs.size());
	}
}

Scanner방식은 가장 기본적인 방법이다. 여기서 hs.add()HashSet.Add()이며, HashSet을 저장하는 메서드이다. 그리고 hs.size()HashSet.size()이며 HashSet 의 크기( 저장되어 있는 원소의 개수)를 반환한다.
다음 풀이는 BufferedReader를 이용한 방법이며, 위와 거의 유사하다고 생각된다.

[ 풀이 2 ]

메모리 : 14244KB
시간 : 116ms

BufferedReader

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		HashSet<Integer> hs = new HashSet<Integer>();
		
		for (int i = 0; i < 10; i++) {
			hs.add(Integer.parseInt(br.readLine()) % 42);
		}
		
		br.close();
		
		System.out.println(hs.size());
	}
}

매우 쉽게 이 정도로 풀 수 있는 문제이며, 이번 문제에서도 보다시피 BufferedReader가 훨씬 성능이 좋음을 알 수 있다.

BKJN 카테고리 내 다른 글 보러가기

댓글 남기기