본문 바로가기

Coding Test/백준

백준 10158. 개미

 

 

공유 소스 보기

 

www.acmicpc.net

 

문제

가로 길이가 w이고 세로 길이가 h인 2차원 격자 공간이 있다. 이 격자는 아래 그림처럼 왼쪽 아래가 (0,0)이고 오른쪽 위가 (w,h)이다. 이 공간 안의 좌표 (p,q)에 개미 한 마리가 놓여있다. 개미는 오른쪽 위 45도 방향으로 일정한 속력으로 움직이기 시작한다. 처음에 (p,q)에서 출발한 개미는 1시간 후에는 (p+1,q+1)로 옮겨간다. 단, 이 속력으로 움직이다가 경계면에 부딪치면 같은 속력으로 반사되어 움직인다.

위 그림은 6×4 격자에서 처음에 (4,1)에서 출발한 개미가 움직인 길을 보여주고 있다. 처음에 (4,1)에 있는 개미는 2시간 후에 (6,3)에 있으며 8시간 후에 (0,1)에 있다. 만일 그 개미가 처음에 (5,3)에 있었다면 매 시간마다 (6,4), (5,3), (4,2), (3,1)로 움직인다. 

여러분은 크기 w×h인 격자 공간에서 처음에 (p,q)에서 출발하는 개미의 t시간 후의 위치 (x,y)를 계산하여 출력해야 한다. 개미는 절대 지치지 않고 같은 속력으로 이동한다고 가정한다. 

문제에서 w와 h는 자연수이며 범위는 2 ≤ w,h ≤ 40,000이다. 그리고 개미의 초기 위치 p와 q도 자연수이며 범위는 각각 0 < p < w과 0 < q < h이다. 그리고 계산할 시간 t의 범위는 1 ≤ t ≤ 200,000,000이다.

 

입력

첫줄에는 w와 h가 공백을 사이에 두고 주어진다. 그 다음 줄에는 초기 위치의 좌표값 p와 q가 공백을 사이에 두고 주어진다. 3번째 줄에는 개미가 움직일 시간 t가 주어진다. 

 

출력

출력은 t 시간 후에 개미의 위치 좌표 (x,y)의 값 x와 y를 공백을 사이에 두고 출력한다. 

 


 

내가 작성한 코드

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

public class Main{
    public static void main(String[] args) throws IOException{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        String str1[] = br.readLine().split(" "); 
        String str2[] = br.readLine().split(" ");

        //처음 입력 가로길이 w * h
        int w = Integer.parseInt(str1[0]);
        int h = Integer.parseInt(str1[1]);
        
        //두번째 입력 (p, q)
        int p = Integer.parseInt(str2[0]);
        int q = Integer.parseInt(str2[1]);
        
        //개미가 움직일 시간 t
        int t = Integer.parseInt(br.readLine());
        
        //t시간 후에 개미의 위치 좌표(x,y)의 값은?

        boolean tw = (p + t) / w % 2 == 1;  //
        boolean th = (q + t) / h % 2 == 1;

        ///
        int rx = 0;
        int ry = 0;
        
        ///
        if(tw){
            rx = w - (p + t) % w;
        }else{
            rx = (p + t) % w;
        }
        
        if(th){
            ry = h - (q + t) % h;
        }else{
            ry = (q + t) % h;
        }

        bw.write(rx + " " + ry);
        bw.flush();
    }
}

 

비교

import java.util.Scanner;

public class Main{
    
    //_s 지점에서 _cnt 만큼 더하면 얼마인지
    //최대 _max라면
    //수평, 수직 2개의 방향으로 적용
    static int getvalue(int _s, int _max, int _cnt){
        int res = (_s + _cnt) % (2 * _max);
        if(res > _max) res = 2 * _max - res;
        return res;
    }
    
    public static void main(String[] args){
        
        Scanner sc = new Scanner(System.in);
        
        int w = sc.nextInt();
        int h = sc.nextInt();
        
        int p = sc.nextInt();
        int q = sc.nextInt();
        
        int t = sc.nextInt();
        
       System.out.format("%d %d", getvalue(p, w, t), getvalue(q, h, t));
    }
}

'Coding Test > 백준' 카테고리의 다른 글

백준 6064. 카잉 달력  (0) 2021.03.11
백준 10156. 과자  (0) 2021.03.11
백준 10250. ACM 호텔  (0) 2021.03.11
백준 10817. 세 수  (0) 2021.03.11
백준 10828. 스택  (0) 2021.03.11