Dev Hyeri

◖코딩 테스트◗▬▬▬▬▬▬▬▬▬/백준

[백준](2024) ✔️개미 (설명/코드/정답)

_hyeri 2024. 2. 20. 17:24

 

 

문제 링크 : https://www.acmicpc.net/problem/10158

 

 

난이도
알고리즘 
실버3 수학, 애드 혹, 사칙연산

 

 

1. 요구 사항 이해

시간, 메모리 제한 : 0.15초 / 256MB

 

x가 w, y가 h인 이차원 격자에서 x, y +1씩 이동.

x가 0또는 w, y가 0또는 h일때 증감을 바꿔서 입력 횟수만큼의 이동 후 있는 위치를 계산 

 

w와 h는 자연수이며 범위는 2 ≤ w,h ≤ 40,000

초기 위치 p와 q도 자연수이며 범위는 각각 0 < p < w과 0 < q < h

이동 횟수 t의 범위는 1 ≤ t ≤ 200,000,000

 

 

 

2. 설계/검증 

입력

- 격자 설정

- 초기 위치 좌표

- 이동 횟수

 

이동 실행 반복문

- 증감 변환  

 

시간 복잡도  최악의 경우  공간 복잡도
O(1)    

 

 

 

 

3. 정상 코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 격자의 크기 입력
        int w = scanner.nextInt();
        int h = scanner.nextInt();

        // 초기 위치 입력
        int p = scanner.nextInt();
        int q = scanner.nextInt();

        // 시간 입력
        int t = scanner.nextInt();

        // 개미의 이동 계산.
        // p + t는 개미가 현재 위치에서 시간 t만큼 이동한 위치
        // 가로 길이의 두배인 2*w로 나눈 나머지를 구합니다.
        // 격자를 벗어난 이동을 처리하고 다시 처음부터 반복되는 이동을 구현합니다.
        int x = (p + t) % (2 * w);
        int y = (q + t) % (2 * h);

        // 경계면 반사 처리
        if (x > w) {
            x = 2 * w - x;
        }

        if (y > h) {
            y = 2 * h - y;
        }

        System.out.println(x + " " + y);
    }
}

 

 

 

 

4. 처리 과정 추적 코드


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("[초기 상태]");
        // 격자의 크기 입력
        int w = scanner.nextInt();
        int h = scanner.nextInt();

        // 초기 위치 입력
        int p = scanner.nextInt();
        int q = scanner.nextInt();

        // 시간 입력
        int t = scanner.nextInt();
        System.out.println("가로 크기: " + w + ", 세로 크기: " + h);
        System.out.println("초기 X 위치: " + p + ", 초기 Y 위치: " + q);
        System.out.println("이동 시간: " + t);

        // 개미의 이동 계산.
        // p + t는 개미가 현재 위치에서 시간 t만큼 이동한 위치
        // 가로 길이의 두배인 2*w로 나눈 나머지를 구합니다.
        int x = (p + t) % (2 * w);
        int y = (q + t) % (2 * h);
        System.out.println("\n[계산된 이동 위치]");
        System.out.println("이동 후 X 위치: " + x + ", 이동 후 Y 위치: " + y);


        // 경계면 반사 처리
        if (x > w) {
            x = 2 * w - x;
        }

        if (y > h) {
            y = 2 * h - y;
        }

        // 출력: 경계면 반사 처리 후 위치
        System.out.println("\n[경계면 반사 처리 후 위치]");
        System.out.println("반사 처리 후 X 위치: " + x + ", 반사 처리 후 Y 위치: " + y);

        // 최종 결과 출력
        System.out.println("\n[최종 결과]");
        System.out.println(x + " " + y);
    }
}