[Algorithm/Softeer] 위험한 효도

[Algorithm/Softeer] 위험한 효도

현대 커넥티드카에 지원하려고 하는데 Softeer의 코딩테스트가 Kotlin이 아닌 Java로만 지원되는 것 같아 Java, Kotlin 동시에 풀이를 하며 공부해보려고 한다.

성능 요약

  • 실행 시간

    116 ms

  • 메모리

    11.96 MB

채점결과

정답

제출 일자

2024-01-31 15:05:57

문제 설명

남우는 어버이날에 부모님께 선물을 사드리기 위해 게임에 참가하게 되었습니다. 게임 종목은 무궁화 꽃이 피었습니다 입니다.

무궁화 꽃이 피었습니다 게임 룰은 다음과 같습니다.

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

예로 d = 10, a = 7, b = 3인 경우 게임이 어떻게 진행되는지를 살펴보겠습니다.

  1. 남우와 술래가 거리 10만큼 떨어져 있는 상황에서 게임이 시작됩니다.

img

  1. 술래가 7초 동안 뒤돌아보고 있고, 남우는 이때 앞으로 전진합니다. (+7)

img

  1. 술래는 3초 동안 앞을 보고 있기 때문에, 남우는 그대로 서있습니다. (+3)

  2. 다시 술래가 뒤를 돌아보고 있는데, 이때 남우가 3초간 앞으로 전진하여 술래를 터치합니다. (+3)

img

  1. 터치가 되는 즉시 술래는 이제 3초간 뒤를 돌아보게 됩니다. 남우는 이때 출발지를 향해 전진합니다. (+3)

img

  1. 술래는 7초 동안 앞을 보고 있기 때문에, 남우는 그대로 서있습니다. (+7)

  2. 술래가 3초 동안 뒤돌아보고 있고, 남우는 이때 앞으로 전진합니다. (+3)

img

  1. 술래는 7초 동안 앞을 보고 있기 때문에, 남우는 그대로 서있습니다. (+7)

  2. 술래가 3초 동안 뒤돌아보고 있고, 남우는 이때 앞으로 전진합니다. (+3)

img

  1. 술래는 7초 동안 앞을 보고 있기 때문에, 남우는 그대로 서있습니다. (+7)

  2. 술래가 뒤를 돌아보고 있는 동안, 남우는 1초간 앞으로 전진하여 출발지에 도달합니다. (+1)

img

따라서 이 게임을 진행하는 데 걸리는 총 시간은 7+3+3+3+7+3+7+3+7+1=44초가 됩니다. 남우가 게임에서 승리하여 상금을 획득하기 위해 걸리는 최소 시간을 구하는 프로그램을 작성해보세요.

본 문제의 저작권은 (주)브랜치앤바운드에 있으며, 저작자의 동의 없이 무단 전재/복제/배포를 금지합니다.

제약조건

1 ≤ b ≤ a ≤ 1,0001 ≤ d ≤ 100,000

입력형식

첫 번째 줄에 a, b, d 값이 공백을 사이에 두고 주어집니다.

출력형식

첫 번째 줄에 남우가 게임을 끝내기 위해 걸리는 최소 시간을 출력합니다.

입력예제1

7 3 10

출력예제1

44

입력예제2

10 3 10

출력예제2

50


풀이

JAVA
import java.io.*;
import java.util.*;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        int d = scanner.nextInt();
        int result = calculateGameTime(a, b, d);
        System.out.println(result);
    }
    private static int calculateGameTime(int a, int b, int d) {
        int time = (d * 2) + (d / a * b) + (d / b * a);
        if(d%a == 0){
            time -= b;
        }
        if(d%b == 0){
            time -= a;
        }
        
        return time;
    }
}
KOTLIN
fun main(){
	val input = readLine()!!.split(" ").map { it.toInt() }
  // 입력 값 할당
  val (a, b, d) = input
  println(calculateGameTime(a,b,d))
}
private fun calculateGameTime(a: Int, b: Int, d: Int) : Int{
	val time = (d * 2) + (d / a * b) + (d / b * a)
 	if (d%a==0){
    time -= b
  }
 	if (d%b==0){
    time -= a
  }
  return time
}

설명

  • 먼저 사용자 입력을 받아 준 뒤 calculateGameTime 함수에 a,b,d를 넘겨 호출해주었다.
  • time이라는 변수를 두고 먼저 총 거리에 비례한 시간을 더해주고 추가적으로 술래가 앞을 보며 기다릴 때의 시간을 더해주었다.
  • 추가적으로 만약 전진하는 시간이 d와 맞아떨어진다면 마지막에는 기다릴 필요가 없어지기 때문에 1번의 기다리는 시간을 제외시켜주는 코드를 짜주었다.

느낀점

  • 진짜 오랜만에 코딩테스트와 자바를 하는데 코틀린만 하다보니 역시 헷갈리는 것 같다.. 이제부터라도 두가지를 모두 손대볼까 한다 ㅎㅎ..

© 2023. All rights reserved.

by SoftyChoo