[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인 경우 게임이 어떻게 진행되는지를 살펴보겠습니다.
- 남우와 술래가 거리 10만큼 떨어져 있는 상황에서 게임이 시작됩니다.
- 술래가 7초 동안 뒤돌아보고 있고, 남우는 이때 앞으로 전진합니다. (+7)
술래는 3초 동안 앞을 보고 있기 때문에, 남우는 그대로 서있습니다. (+3)
다시 술래가 뒤를 돌아보고 있는데, 이때 남우가 3초간 앞으로 전진하여 술래를 터치합니다. (+3)
- 터치가 되는 즉시 술래는 이제 3초간 뒤를 돌아보게 됩니다. 남우는 이때 출발지를 향해 전진합니다. (+3)
술래는 7초 동안 앞을 보고 있기 때문에, 남우는 그대로 서있습니다. (+7)
술래가 3초 동안 뒤돌아보고 있고, 남우는 이때 앞으로 전진합니다. (+3)
술래는 7초 동안 앞을 보고 있기 때문에, 남우는 그대로 서있습니다. (+7)
술래가 3초 동안 뒤돌아보고 있고, 남우는 이때 앞으로 전진합니다. (+3)
술래는 7초 동안 앞을 보고 있기 때문에, 남우는 그대로 서있습니다. (+7)
술래가 뒤를 돌아보고 있는 동안, 남우는 1초간 앞으로 전진하여 출발지에 도달합니다. (+1)
따라서 이 게임을 진행하는 데 걸리는 총 시간은 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번의 기다리는 시간을 제외시켜주는 코드를 짜주었다.
느낀점
- 진짜 오랜만에 코딩테스트와 자바를 하는데 코틀린만 하다보니 역시 헷갈리는 것 같다.. 이제부터라도 두가지를 모두 손대볼까 한다 ㅎㅎ..