CodingTest/Java

BOJ_17093 : Total Circle

Soom_1n 2022. 10. 19. 16:12

πŸ‘‰ 문제링크

 

17093번: Total Circle

μ’Œν‘œν‰λ©΄μƒμ˜ 점의 λ°°μ—΄ P = P1, P2, β‹―, PN와 Q = Q1, Q2, β‹―, QM이 μžˆλ‹€. Q λ°°μ—΄ μƒμ˜ ν•œ 점을 μ€‘μ‹¬μœΌλ‘œ, P λ°°μ—΄ μƒμ˜ λͺ¨λ“  점을 ν¬ν•¨ν•˜λŠ” μ΅œμ†Œ λ„“μ΄μ˜ μ›μ˜ λ°˜μ§€λ¦„ 쀑 μ΅œλŒ“κ°’μ„ κ΅¬ν•˜μ‹œμ˜€.

www.acmicpc.net



πŸ”Έ 문제 뢄석 πŸ”Έ

  • ν•œ 점을 μ€‘μ μœΌλ‘œ μ—¬λŸ¬ μ’Œν‘œλ₯Ό μ§€λ‚˜λŠ” 원은 타원λͺ¨μ–‘κΉŒμ§€ μƒκ°ν•˜λ©΄ 무수히 λ§Žλ‹€.
    • 문제 μ‘°κ±΄μ—μ„œ μ΅œμ†Œν¬κΈ°μ˜ μ›μ˜ μ΅œλŒ€ λ°˜μ§€λ¦„μ΄λΌ ν–ˆμœΌλ―€λ‘œ, 쀑점과 κ°€μž₯ λ¨Ό μ’Œν‘œκΉŒμ§€μ˜ 거리닀.
  • λͺ¨λ“  μ€‘μ μ—μ„œ κ΅¬ν•œ λ°˜μ§€λ¦„μ˜ μ΅œλŒ€κ°’λ“€ μ€‘μ—μ„œ κ°€μž₯ 큰 값을 좜λ ₯ν•œλ‹€.
  • μ΅œλŒ€κ°’ μ°ΎκΈ°κ°€ 2λ²ˆμžˆλŠ” μ…ˆμ΄κ³ , for문이 μ€‘μ²©λ˜μ–΄ ν•œ λ²ˆμ”© λΉ„κ΅ν•˜λŠ” ν˜•νƒœμ΄λ‹€.
    • n, m의 μ΅œλŒ€κ°’μ€ 1000μ΄λ―€λ‘œ O(n^2)μ—μ„œ μ΅œλŒ€ κ³„μ‚°λŸ‰μ€ 1,000,000 (백만)으둜 1초 λ―Έλ§Œμ΄λ‹€.
      λ”°λΌμ„œ μ œν•œμ‹œκ°„ 1초λ₯Ό λ„˜μ§€ μ•ŠλŠ”λ‹€.
  • x, y의 크기가 10^7 == 10,000,000(천만) κΉŒμ§€ 이고, λ°˜μ§€λ¦„ κ³„μ‚°μ—μ„œ μ œκ³±ν•˜κ²Œ λœλ‹€.
    • μ œκ³±ν•˜λ©΄ 100,000,000,000,000(λ°±κ²½) μ΄λ―€λ‘œ intλ₯Ό μ΄ˆκ³Όν•œλ‹€...long을 μ‚¬μš©ν•΄μ•Όν•œλ‹€.

πŸ”Έ μ½”λ“œ πŸ”Έ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
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 n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        ArrayList<Pair> nl = new ArrayList<>();
        ArrayList<Pair> ml = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            nl.add(new Pair(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())));
        }
        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            ml.add(new Pair(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())));
        }

        long answer = 0;
        for (int i = 0; i < m; i++){
            long rr = 0;
            for (int j = 0; j < n; j++){
                long temp = (long)(Math.pow(nl.get(j).x - ml.get(i).x, 2) + Math.pow(nl.get(j).y - ml.get(i).y, 2));
                if (temp > rr) {
                    rr = temp;
                }
            }
            if (rr > answer){
                answer = rr;
            }
        }
        System.out.println(answer);
    }
}

class Pair {
    int x,y;
    Pair(int x, int y){
        this.x = x;
        this.y = y;
    }
}

πŸ”Έ μ½”λ“œ 해석 πŸ”Έ

  • μ’Œν‘œ 계산을 ν•΄μ•Όν•˜λ―€λ‘œ, PairλΌλŠ” 클래슀λ₯Ό λ§Œλ“€μ–΄μ„œ x, yλ₯Ό ν•¨κ»˜ μ €μž₯ν–ˆλ‹€.
    • ArrayLIst<> 의 인자둜 λ„£μœΌλ©°, μ‚¬μš©ν•  μžλ£Œν˜•μ„ Pair둜 μ§€μ •ν•œλ‹€.
  • 쀑점과 μ’Œν‘œλ“€μ˜ 거리λ₯Ό κ³„μ‚°ν•œλ‹€.
    • [λ°˜μ§€λ¦„^2 == (x-x`)^2 + (y-y`)^2 ] 곡식을 μ‚¬μš©ν•œλ‹€. (제곱 μ‚¬μš© -> longν˜• ν•„μš”)
    • λ‚˜μ˜¨ λ°˜μ§€λ¦„μ˜ μ œκ³±κ°’μ€‘ μ΅œλŒ€κ°’μ„ rr에 μ €μž₯ν•œλ‹€.
  • λ‚˜μ˜€λŠ” rr쀑 μ΅œλŒ€κ°’μ„ answer에 μ €μž₯ν•˜κ³  μ΅œμ’… 좜λ ₯ν•œλ‹€.

πŸ”Έ end πŸ”Έ

  • κ·Έλ €μ§€λŠ” 원이 μ •ν™•ν•œ 원인 쀄 μ•Œκ³  잘λͺ» μ ‘κ·Όν•΄μ„œ 많이 ν‹€λ Έμ—ˆλ‹€.
  • νƒ€μ›ν˜•μœΌλ‘œ κ·Έλ €μ§„λ‹€κ³  생각이 κ°€λ‹ˆ, μ™œ μ΅œμ†Œλ„“μ΄μ˜ μ΅œλŒ€ λ°˜μ§€λ¦„μΈμ§€ μ•Œ 수 μžˆμ—ˆλ‹€.
  • 풀이가 적은 λ¬Έμ œμ—¬μ„œ 더 λ‚΄ 였λ₯˜λ₯Ό μ•Œμ•„μΉ˜λ¦¬κΈ° μ–΄λ €μ› μ§€λ§Œ, ν’€κ³ λ‚˜λ‹ˆ κ°„λ‹¨ν–ˆκ³  브둠즈 1λ¬Έμ œμ˜€μ§€λ§Œ λ§Žμ€ 곡뢀가 된 것 κ°™λ‹€.

728x90