본문 바로가기

알고리즘

백준 19953 <영재의 산책>

728x90

이 문제는 규칙을 잘 찾는 것이 중요한 문제이다.

 

초기의 v 값에 따라 반복되는 숫자가 달라진다.

 

예를 들어 초기값이 1이고 m이 1 인경우

이렇게 time=4번 만에 같은 값을 가지게 되고

 

초기값 13이고 m=3 인경우에

time=5번 만에 같은 값을 가지게 된다.

 

그러므로 time가 4와 5에 따라 계산을 다르게 해줘야 한다.

 

그래서 확인 해주기 위해서 ArrayList를 북 동 남 서 이렇게 4개를 만들어서 값을 넣어주면서 같을 때까지 진행하였다.

 

여기서 value는 몇 번 반복되는가를 나타내는 것으로 fv에 time값을 넣어주고 만약에 time이 5였다면 맨 초기의 속력 값을 따로 해줘야 하기 때문에 돌려야 하는 t값을 -1 해준 값으로 value를 구해준다.

 

반복되는 횟수만큼 이동을 진행한다.

 

값이 4가 아니기 때문에 처음 속력만큼 우선 북쪽으로 진행해주고 나머지 이동을 실시한다.

 

전체 코드

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

   static long fv, v, m, t, sum[], sx, sy, dir[][] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };
   static Queue<Long> num[];
   static int ndir;

   public static void main(String[] args) throws NumberFormatException, IOException {
      // TODO Auto-generated method stub
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      StringTokenizer st = new StringTokenizer(br.readLine());
      v = Integer.parseInt(st.nextToken());
      long f=v;
      m = Integer.parseInt(st.nextToken());
      t = Integer.parseInt(st.nextToken());
      num = new LinkedList[4];
      for (int i = 0; i < 4; i++) {
         num[i] = new LinkedList<Long>();
      }
      sum = new long[4];
      long time = 0;
      while (num[ndir].isEmpty() || num[ndir].peek() != v) {
         num[ndir].add(v);
         sum[ndir] = v;
         v = (v * m) % 10;
         ndir = (ndir + 1) % 4;
         time++;
      }
      long value = 0;
       fv=time;
      if (fv % 4 != 0) {
         time--;
         value = (t - 1) / time;
      } else {
         value = t / time;
      }
      for (int i = 0; i < 4; i++) {
         sx += (value * sum[i] * dir[i][0]);
         sy += (value * sum[i] * dir[i][1]);
      }
      ndir = 0;
      if (fv % 4 != 0) {
         t = (t-1) % time;
         sx+= (f*dir[ndir][0]);
         sy+=(f*dir[ndir][1]);
         ndir = (ndir + 1) % 4;
      } else {
         t = t % time;
      }
        for (int i = 0; i < t; i++) {
            long next = num[ndir].remove();
            sx += (next * dir[ndir][0]);
            sy += (next * dir[ndir][1]);
            ndir = (ndir + 1) % 4;
         }
      System.out.println(sx + " " + sy);

   }

}

 

 

'알고리즘' 카테고리의 다른 글

백준 19640 <화장실의 규칙>  (0) 2020.10.05
백준 20005 <보스몬스터 전리품>  (0) 2020.10.04
백준 1744 <수묶기>  (0) 2020.10.02
백준 19952 <인성 문제있어??>  (0) 2020.09.30
백준 2589 <보물섬>  (0) 2020.09.29