[백준 1241번] 머리 톡톡

2025. 5. 8. 16:02·알고리즘
728x90
반응형

 

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

 

 

 

 

문제의 핵심

  1. 자신이 쓰고 있는 숫자가 다른 사람이 쓰고 있는 모자의 배수라면 count 해준다.
  2. 동일한 숫자를 쓰고 있는 학생의 수가 있을 수 있다.

 

arr[] : 해당 위치에 적혀있는 모자의 숫자

Map<Integer, Integer> map : 현재 모자에 적혀져있는 숫자들의 개수 -> 적혀있는 숫자들의 모자들을 함께 counting

cnt[] : 해당 위치에서 자신이 머리를 친 학생의 수를 더한다.

 

배열을 돌면서 현재 자신의 모자에 적힌 숫자에 약수를 구한 후, 약수에 적힌 다른 사람이 쓰고 있는 모자의 번호의 개수(map의 value) 만큼 counting해서 더해준다.

 

만약 4의 약수의 경우 1,2,4인데 -> 여기서 2 * 2는 같은 숫자이므로 동일한 약수의 경우 counting을 하나 제외해줘야 한다.

 

약수를 구할 때에도 Math.sqrt를 하여 시간복잡도를 줄이고, Math.sqrt()로 햇을 때 나온 숫자가 현재 적혀 있는 모자의 숫자를 나눴을 때 나머지가 0이라면 해당하는 숫자와 curr / j를 했을 때 나오는 숫자는 약수의 쌍이므로 해당하는 모자의 개수만큼 더해주면 된다.

 

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

public class BOJ_G5_1241_머리톡톡 {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		int N = Integer.parseInt(br.readLine());
		// 해당 위치에 적혀있는 모자의 숫자
		int[] arr = new int[N];
		// 현재 모자에 적혀져있는 숫자들의 개수
		Map<Integer, Integer> map = new HashMap<>();

		for (int i = 0; i < N; i++) {
			arr[i] = Integer.parseInt(br.readLine());
			map.put(arr[i], map.getOrDefault(arr[i], 0) + 1);
		}

		int[] cnt = new int[N];

		for (int i = 0; i < N; i++) {
			int curr = arr[i];
			int sq = (int) Math.sqrt(curr);

			// 동일한 약수인 경우 하나만 나와야한다.
			if (sq * sq == curr) {
				cnt[i] -= map.getOrDefault(sq, 0);
			} else {
				cnt[i] = 0;
			}

			for (int j = 1; j <= sq; j++) {
				if (curr % j == 0) {
					cnt[i] += map.getOrDefault(j, 0) + map.getOrDefault(curr / j, 0);
				}
			}
		}

		for (int i = 0; i < N; i++) {
			sb.append(cnt[i] - 1).append('\n');
		}

		System.out.println(sb);

	}
}

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘' 카테고리의 다른 글

[백준 2655번] 가장높은탑쌓기  (0) 2025.05.13
[백준 1278번] 연극  (0) 2025.05.08
[백준 1027번] 고층 건물  (0) 2025.05.07
[백준 2629번] 양팔저울  (0) 2025.05.06
[백준 1707번] 이분 그래프  (0) 2025.05.05
'알고리즘' 카테고리의 다른 글
  • [백준 2655번] 가장높은탑쌓기
  • [백준 1278번] 연극
  • [백준 1027번] 고층 건물
  • [백준 2629번] 양팔저울
moongi
moongi
프로그래밍 관련 공부를 정리하는 블로그
  • moongi
    By_Me
    moongi
  • 전체
    오늘
    어제
    • 공부 (80) N
      • 알고리즘 (63) N
        • 기업별 유사 문제 (2)
        • Sudo Code (5) N
        • 예외처리 (1)
        • SQL (9) N
      • spring boot (6)
        • jpa (0)
        • querydsl (0)
        • MVC pattern (0)
        • setting (2)
      • 취준 (3)
      • CS (8)
        • 디자인패턴 (1)
        • 데이터베이스 (4)
        • 네트워크 (3)
        • 운영체제 (0)
  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
moongi
[백준 1241번] 머리 톡톡

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.