본문 바로가기

알고리즘/Softeer(현대자동차)

[Softeer] 위험한 효도 (Lv.1) JAVA, 레벨1이지만 살짝 고민해야 하는 문

우연히 현대자동차 관련 알고리즘 문제풀이에 관심이 생겨서

낮은 레벨부터 풀어보고 있다.

 

LEVEL1은 말도 안되게 쉬운 문제부터

알고리즘 다운 문제들이 많이 분포해있다


문제 설명

https://softeer.ai/practice/7368

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

 

softeer.ai

문제에 대한 대략적인 설명은 "무궁화 꽃이 피었습니다." 게임을 하는데 술래가 뒤돌았을때, 앞으로 나아가야 한다는 것이다.

 

1) 남우와 술래는 처음에 거리 d 만큼 떨어져 있습니다.
2) 남우는 술래를 향해 뛰어가 술래를 터치하고 다시 출발선으로 돌아와야 합니다.
3) 남우는 술래가 뒤를 돌아보고 있을 때만 움직일 수 있으며, 앞을 바라보고 있을 때는 절대 움직일 수 없습니다.
4) 술래는 처음 a 초간은 뒤를 보고 있고, 그 다음 b 초간은 앞을 보고 있고, 다시 a 초간 뒤를, b 초간 앞을, ... 이 과정을 계속 반복합니다.
5) 남우가 술래를 터치한 직후, 술래의 움직임은 달라집니다. 터치된 직후 처음 b 초간은 뒤를 보고 있고, 그 다음 a 초간은 앞을 보고 있고, 다시 b 초간 뒤를, a 초간 앞을, ... 이 과정을 계속 반복합니다.
6) 술래가 앞, 뒤를 돌아보기 위해 자세를 바꾸는 데 걸리는 시간은 0초라고 가정해도 좋습니다.
7) 남우는 최선을 다해 움직이며, 1초에 거리 1만큼 이동이 가능합니다.

 

문제 풀이

처음에는 문제가 잘 이해가지 않았는데,

결론적으로는 술래를 잡으러 갈때는 a만큼 갔다가 b만큼 쉬고

돌아올때는 b만큼 갔다가 a만큼 쉬면 된다.

 

* 여기서 헷갈렸던 포인트 하나는 잡으러 가거나 돌아오는 거리 d가 a나 b보다 작으면 따로 쉴 필요는 없다. (한번에 간 것)

 

결과물

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

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int distance = sc.nextInt();

        //처음엔 a초간 뒤, b초간 앞 -> a초간 앞, b초간 뒤, 
        int go = distance;
        int back = distance;
        int goSec = 0;
        int backSec = 0;
        while(true){
            if(go == 0 && back == 0){
                break;
            }
            if(go > 0){
                if(go >= a){
                    goSec += a; //앞으로 감
                    go-=a;
                    if(go>0){
                        goSec += b; //기다림
                    }
                    // System.out.println(goSec);
                }else{
                    goSec += go;
                    go = 0;
                }
            }
            if(go == 0){
                if(back >= b){
                    backSec += b; //앞으로 감
                    back -= b;
                    if(back > 0){
                        backSec += a; //기다림
                    }
                }else{
                    backSec += back;
                    back = 0;
                }
            }
        }
        // System.out.println(goSec);
        // System.out.println(backSec);
        System.out.println(goSec+backSec);
    }
}