[백준 JAVA] 10158 개미

이성훈·2021년 10월 29일
0
post-custom-banner


https://www.acmicpc.net/problem/10158

문제는 시간제한이 0.15초이고 t의입력값이 2억이다.
처음에는 while문으로 t의값을 하나씩줄이는 반복문을사용하여 풀어보았으나 당연히 시간초과가뜬다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class test {

	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int w = Integer.parseInt(st.nextToken());
		int h = Integer.parseInt(st.nextToken());
		st = new StringTokenizer(br.readLine());
		int p = Integer.parseInt(st.nextToken());
		int q = Integer.parseInt(st.nextToken());
		int t = Integer.parseInt(br.readLine());
		//이동방향
		int width = 1; //벽에 닿은횟수가 짝수번or0번이면 1
		int height = 1; //			  홀수번이면 -1
		
		//가로 정방향이동중 오른쪽끝벽을 넘기전
		//가로 역방향중 왼쪽끝벽을 넘기전
		while(t > 0) {
			//가로 정방향이동중 오른쪽끝벽을 넘기전은 방향전환필요X
			//가로 역방향중 왼쪽끝벽을 넘기전은 방향전환필요X
			if(p + width > w && width == 1){ //가로 정방향이동중 오른쪽끝벽을 넘으면
				width = -1; //정방향 -> 역방향
			}else if(p + width < 0 && width == -1) { // 가로 역방향중 왼쪾끝벽을 넘으면
				width = 1;//역방향 -> 정방향
			}
			p += width; //가로 갱신
			if(q + height > h && height == 1){ 
				height = -1; //정방향 -> 역방향
			}else if(q + height < 0 && height == -1) { 
				height = 1;//역방향 -> 정방향
			}
			q += height; //세로갱신

			t--;
		}
		System.out.println(p + " " + q);
	}
}

다시보니 정말 비효율적인 코드였다. 그래도 이후 코드를 다시짜면서 출력값 확인할때 이코드를 돌리며 체크했다.
다음으로는 반복문없이 if문만사용하여 몫과 나머지로 개미의 위치를 계산하였다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int w = Integer.parseInt(st.nextToken());
		int h = Integer.parseInt(st.nextToken());
		st = new StringTokenizer(br.readLine());
		int p = Integer.parseInt(st.nextToken());
		int q = Integer.parseInt(st.nextToken());
		int t = Integer.parseInt(br.readLine());
		int x = 0;
		int y = 0;
		
		int p_quo = (int)(p + t) / w; //가로이동경로 몫
		int p_rem = (p + t) % w; //가로이동경로 나머지
		if(p_quo % 2 == 0) {
			x = p_rem; //짝수번 방향전환했으면 좌표는 정방향
		}else {
			x = w - p_rem; //홀수번 방향전환시 좌표는 거꾸로계산
		}
		
		int q_quo = (int)(q + t) / h;
		int q_rem = (q + t) % h;
		if(q_quo % 2 == 0) {
			y = q_rem;
		}else {
			y = h - q_rem; 
		}
		System.out.println(x + " " + y);
	}
}

이때까지 백준에서 채점언어를 java11로 했더니 중간에 시간초과가 계속떠서 또한번 코드를 재수정했다. (if문을 줄이진못했으나, stringtokenizer를 안쓰는방향으로)

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String temp = br.readLine();
		int w = Integer.parseInt(temp.split(" ")[0]);
		int h = Integer.parseInt(temp.split(" ")[1]);
		temp = br.readLine();
		int p = Integer.parseInt(temp.split(" ")[0]);
		int q = Integer.parseInt(temp.split(" ")[1]);
		int t = Integer.parseInt(br.readLine());

		if(((int)(p + t) / w) % 2 == 0) {
			p = (p + t) % w;
		}else {
			p = w - (p + t) % w; 
		}
		
		if(((int)(q + t) / h) % 2 == 0) {
			q = (q + t) % h;
		}else {
			q = h - (q + t) % h; 
		}
		System.out.println(p + " " + q);
	}
}

이렇게해도 java11 에서는 시간초과가 떠서 또한번코드를 바꾸긴했으나, 이후
백준사이트 언어설정에서 java8이 숨겨져있는것을 확인, 이것으로 바꾸고 돌린결과

황당하게도 코드에는 문제가없었다.. 2번째로올린코드(if문을 처음사용한코드)도 정답이다.

결론 : java11 말고 java8 언어를 쓰자

profile
I will be a socially developer
post-custom-banner

0개의 댓글