본문 바로가기
알고리즘 풀이/백준

[BOJ] 1241. 머리 톡톡 - JAVA

by 2245 2022. 12. 15.

🔗 문제

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

 

1241번: 머리 톡톡

엄지 생일 기념으로 학생들은 파티를 하고 있다. 엄지는 N(1≤N≤100,000)명의 학생에게 1부터 N번까지 차례대로 번호를 부여하였고 그들을 순서대로 빙 둘러앉아 원을 만들게 하였다. (즉 i번째 학

www.acmicpc.net

 

🧩 풀이 및 코드

문제 유형 : 수학, 소수 판정

 

잘못된 방법)

완전 탐색으로 풀 경우 N개의 숫자가 차례로 N-1 (자신을 뺀 나머지) 개의 숫자를 탐색하면서 자신이 배수인지 확인한다면 시간 복잡도 O(N^2)

N의 최댓값은 10만이므로 N^2 라면 100억, 1억당 1초가 걸린다면 소요 시간 10초 -> 제한 시간 2초를 초과

 

해결 방법)

* 약수의 갯수만큼 머리 톡톡 하므로 약수의 갯수 구하기

* 계산 횟수를 줄이기 위해 제곱근까지만 탐색

 

전체 코드

import java.io.*;
import java.util.Arrays; 

public class Main_bj_1241_머리톡톡 {

	public static void main(String[] args) throws Exception {
//		System.setIn(new FileInputStream("res/input_bj_1241.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		int[] numbers = new int[N];
		int[] count = new int[1000001];
		
		for(int i=0; i<N; i++) {
			numbers[i] = Integer.parseInt(br.readLine());
			count[numbers[i]]++;
		}
		
		StringBuilder sb = new StringBuilder();
		for(int i=0; i<N; i++) {
			int ans = 0;
			
			// 약수의 갯수만큼 머리 톡톡 -> 약수 구하기
			for(int j=1; j<=Math.sqrt(numbers[i]); j++) {
				if(numbers[i] % j == 0) {
					ans += count[j];
					
					if((numbers[i] / j) != j) {			// 제곱근인 경우 제외(ex)1*1=1)
						ans += count[numbers[i] / j];
					}
				}
			}
			
			ans--;		// 자기 자신 갯수 빼기
			sb.append(ans).append("\n");
		}
		
		System.out.println(sb.toString());
		br.close();
		
	}

}

 

'알고리즘 풀이 > 백준' 카테고리의 다른 글

[BOJ] 2448. 별 찍기 - 11 - JAVA  (0) 2022.12.16
[BOJ] 1976. 여행 가자 - JAVA  (0) 2022.12.15
[BOJ] 13460. 구슬탈출2 - JAVA  (0) 2022.12.14
[BOJ] 2234. 성곽 - JAVA  (0) 2022.12.05
[BOJ] 1593. 문자 해독 - JAVA  (0) 2022.07.03