x2가 x1보다 더 빠른데, 더 빠른 x2가 x1의 앞에서 달리고 있으므로 이 둘은 절대 만날 수 없다.
0 2 4 6 8 10
5 8 11 14 17 20
문제풀이
방법 - 1
뒤에서 출발한 캥거루가 반드시 더 멀리 뛸 수 있어야 한다. 턴이 반복될 때마다 앞선 캥거루와의 거리가 짧아질 것이고 결국 동일한 위치에 있다가 뒤에 출발한 캥거루가 앞서게 될 것이다. 이 동일한 위치가 "정수"이면 YES 이다. 동일한 위치가 정수가 아니고 두 캥거루의 거리가 멀어지면 NO다.
문제
입력 형식
입력 예제 - 1
- 캥거루 x1은 0에서 시작 3칸씩 이동한다.
- 캥거루 x2는 4에서 시작해서 2칸씩 이동한다.
따라서입력 예제 - 2
문제풀이
방법 - 1
package main import ( "fmt" ) func abs(a int) int { if a < 0 { return a - (a * 2) } return a } type kangaroo struct { currentPoint int jumpPower int } func (k *kangaroo) Jump() int { k.currentPoint += k.jumpPower return k.currentPoint } type Race struct { diff int k1 kangaroo k2 kangaroo } func NewRace(k1, k2 kangaroo) *Race { return &Race{ abs(k1.currentPoint - k2.currentPoint), k1, k2} } func (r *Race) Start() string { for { p1 := r.k1.Jump() p2 := r.k2.Jump() if abs(p1-p2) >= r.diff { return "NO" } r.diff = abs(p1 - p2) if r.diff == 0 { return "YES" } } } func main() { krace := NewRace(kangaroo{0, 3}, kangaroo{4, 2}) res := krace.Start() fmt.Println(res) }방법 - 2
package main import ( "fmt" ) func KangarooMeet(a []int) { // 분모가 0인 경우를 예외처리한다. if a[1] == a[3] { fmt.Println("NO") return } x := (a[2] - a[0]) % (a[1] - a[3]) y := (a[2] - a[0]) / (a[1] - a[3]) if x == 0 && y > 0 { fmt.Println("YES") } else { fmt.Println("NO") } } func main() { KangarooMeet([]int{0, 3, 4, 2}) KangarooMeet([]int{0, 2, 5, 3}) KangarooMeet([]int{0, 4, 5, 2}) }Recent Posts
Archive Posts
Tags