Skip to content

Conversation

@sunha20
Copy link
Contributor

@sunha20 sunha20 commented Jan 8, 2026

🚀 이슈 번호

Resolve: {#2293}

🧩 문제 해결

스스로 해결: ✅ / ❌

🔎 접근 과정

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

  • 🔹 어떤 알고리즘을 사용했는지 분할정복
  • 🔹 어떤 방식으로 접근했는지

(처음에는 이동연산 자체를 사분면 번호를 수학적으로 계산해서 하려고 했으나, 복잡해서
단순한 분할정복으로 위치 찾기 + 이동을 동시에 처리하려고 했으나, 이것도 두가지가 복합되어있어서 너무 복잡해서)

쉬운 이동을 위해 가상의 배열 좌표를 두고, 좌표와 사분면 번호를 변환하는 로직을 분할정복으로 처리하고, 이동을 단순히 배열 좌표값을 더하고 빼는 것으로 함.

⏱️ 시간 복잡도

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

  • Big-O 표기법: O(N)
  • 이유:
    분할정복의 깊이가 N이기 때문에

💻 구현 코드

import java.io.*;

public class Main {
    static int N;
    static long X, Y, r, c;
    static String start;

    public static void main(String[] args) throws IOException {
        // 입력 받고
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] temp = br.readLine().split(" ");
        N = Integer.parseInt(temp[0]);
        start = temp[1];

        temp = br.readLine().split(" ");
        X = Long.parseLong(temp[0]);
        Y = Long.parseLong(temp[1]);

        long size = 1L << N;

        // 배열 좌표로 변환
        convertToPos(0,  0L, 0L, size);

        // 이동
        r += X;
        c -= Y;

        if (r < 0 || r >= size || c < 0 || c >= size) {
            System.out.println(-1);
            return;
        }

        // 좌표를 번호로 변환
        System.out.println(convertToNum(r,c, size));


    }

    static String convertToNum(long r, long c, long size) {
        if (size == 1) return "";

        long newSize = size/2;

        if (r < newSize && c < newSize) {
            return "2" + convertToNum(r, c, newSize);
        }
        else if (r >= newSize && c < newSize) {
            return "1" + convertToNum(r - newSize, c, newSize);
        }
        else if (r < newSize && c >= newSize) {
            return "3" + convertToNum(r, c - newSize, newSize);
        }
        else {
            return "4" + convertToNum(r - newSize, c - newSize, newSize);
        }

    }


    static void convertToPos(int depth, long sr, long sc, long size) {
        if (depth == N && size == 1) {
            r = sr;
            c = sc;
            return;
        }

        switch (start.charAt(depth)) {
            case '2':
                convertToPos(depth+1, sr, sc, size/2);
                break;
            case '1':
                convertToPos(depth+1, sr + size/2, sc, size/2);
                break;
            case '3':
                convertToPos(depth+1, sr, sc + size/2, size/2);
                break;
            case '4':
                convertToPos(depth+1, sr + size/2, sc + size/2, size/2);
                break;
        }
    }
}

@sunha20 sunha20 self-assigned this Jan 8, 2026
@sunha20 sunha20 linked an issue Jan 8, 2026 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.

260109 : 코딩테스트

2 participants