Skip to content

251210 : [BOJ 1891] 사분면#2242

Open
sksn12 wants to merge 1 commit intomainfrom
sksn12/2237/2
Open

251210 : [BOJ 1891] 사분면#2242
sksn12 wants to merge 1 commit intomainfrom
sksn12/2237/2

Conversation

@sksn12
Copy link
Contributor

@sksn12 sksn12 commented Dec 10, 2025

🚀 이슈 번호

Resolve: {#2237}

🧩 문제 해결

스스로 해결:

🔎 접근 과정

문제 해결을 위한 접근 방식을 설명해주세요.

  • 🔹 어떤 알고리즘을 사용했는지 : 재귀
  • 🔹 어떤 방식으로 접근했는지 : find 함수로 어느 위치일지 찾고, 한 번에 x와 y의 값을 가지는 Element 클래스의 인스턴스 dxdy를 초기화시켜준다. 그 후 check 함수에서 사분면을 4 부분으로 나눠가며 정답을 찾는다. -> 재귀 짜다가 실패해서 정답 블로그 참고..

⏱️ 시간 복잡도

시간 복잡도 분석을 작성해주세요.
최악의 경우 수행 시간은 어느 정도인지 분석합니다.

  • Big-O 표기법: O(?)
  • 이유:

💻 구현 코드

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

public class Main {

    public static int d;
    public static String num;
    public static Element dxdy, nxny;
    public static String answer = "";

    public static class Element {
        long x, y;
        public Element(long x, long y) {
            this.x = x;
            this.y = y;
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedWriter bw  = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());
        d = Integer.parseInt(st.nextToken());
        num = st.nextToken();
        st = new StringTokenizer(br.readLine());
        long x = Long.parseLong(st.nextToken());
        long y = Long.parseLong(st.nextToken());
        long n = 1L << d, m = n;


        find(0, n, 0, m, 0);
        nxny = new Element((-1 * y) + dxdy.x, x + dxdy.y);

        if (0 <= nxny.x && nxny.x < n && 0 <= nxny.y && nxny.y < m) {
            check(0, n, 0, m);
            bw.write(answer);
        }
        else bw.write("-1");
        bw.flush();

    }

    private static String check(long n1, long n2, long m1, long m2) {
        if (answer.length() == d) return answer;
        if (n1 <= nxny.x && nxny.x < (n1 + n2) / 2 && (m1 + m2) / 2 <= nxny.y && nxny.y < m2) {
            answer += "1";
            return check(n1, (n1 + n2) / 2, (m1 + m2) / 2, m2);
        } else if (n1 <= nxny.x && nxny.x < (n1 + n2) / 2 && m1 <= nxny.y && nxny.y < (m1 + m2) / 2) {
            answer += "2";
            return check(n1, (n1 + n2) / 2, m1, (m1 + m2) / 2);
        } else if ((n1 + n2) / 2 <= nxny.x && nxny.x < n2 && m1 <= nxny.y && nxny.y < (m1+m2) / 2) {
            answer += "3";
            return check((n1 + n2) / 2, n2, m1, (m1 + m2) / 2);
        } else {
            answer += "4";
            return check((n1 + n2) / 2, n2, (m1 + m2) / 2, m2);
        }
    }

    private static void find(long n1, long n2, long m1, long m2, int index) {
        if (index == d) {
            dxdy = new Element(n1, m1);
            return;
        }
        int number = num.charAt(Integer.parseInt(String.valueOf(index))) - '0';

        if (number == 1) find(n1, (n1 + n2) / 2, (m1 + m2) / 2, m2, index + 1);
        else if (number == 2) find(n1, (n1 + n2) / 2, m1, (m1 + m2) / 2, index + 1);
        else if (number == 3) find((n1 + n2) / 2, n2, m1, (m1 + m2) / 2, index + 1);
        else if (number == 4) find((n1 + n2) / 2, n2, (m1 + m2) / 2, m2, index + 1);
    }


}

@sksn12 sksn12 self-assigned this Dec 10, 2025
@sksn12 sksn12 linked an issue Dec 10, 2025 that may be closed by this pull request
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

251210 : 코딩테스트

1 participant