코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/백준

14562번 : 태권왕

2023. 9. 28. 22:01

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

 

14562번: 태권왕

첫째 줄에 테스트 케이스의 수 C(1 ≤ C ≤ 100)이 주어진다. 둘째 줄부터 C줄에 걸쳐 테스트 케이스별로 현재 점수 S와 T가 공백을 사이에 두고 주어진다. (1 ≤ S < T ≤ 100)

www.acmicpc.net

 

문제

태균이는 지금 태권도 겨루기 중이다. 지금은 상대에게 지고 있지만 지금부터 진심으로 경기하여 빠르게 역전을 노리려 한다.

태균이가 현재 할 수 있는 연속 발차기는 두가지가 있다.

  1. A는 현재 점수만큼 점수를 얻을 수 있는 엄청난 연속 발차기이다. 하지만 상대 역시 3점을 득점하는 위험이 있다.
  2. B는 1점을 얻는 연속 발차기이다.

현재 태균이의 점수 S와 상대의 점수 T가 주어질 때, S와 T가 같아지는 최소 연속 발차기 횟수를 구하는 프로그램을 만드시오.

 

입력

첫째 줄에 테스트 케이스의 수 C(1 ≤ C ≤ 100)이 주어진다. 둘째 줄부터 C줄에 걸쳐 테스트 케이스별로 현재 점수 S와 T가 공백을 사이에 두고 주어진다. (1 ≤ S < T ≤ 100)

 

출력

각 줄마다 S와 T가 같아지는 최소 연속 발차기 횟수를 출력한다.

 


소스코드

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

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        int c = Integer.parseInt(br.readLine());
        for (int i = 0; i < c; i++) {
            st = new StringTokenizer(br.readLine());
            int s = Integer.parseInt(st.nextToken());
            int t = Integer.parseInt(st.nextToken());

            // bfs
            ArrayDeque<int[]> queue = new ArrayDeque<>();
            queue.add(new int[]{s, t});
            int result = 0;
            boolean flag = false;
            while(!queue.isEmpty()) {
                int size = queue.size();
                for (int j = 0; j < size; j++) {
                    int[] now = queue.poll();
                    int s1 = now[0] * 2;
                    int t1 = now[1] + 3;
                    int s2 = now[0] + 1;
                    int t2 = now[1];

                    if(s1 == t1 || s2 == t2) {
                        flag = true;
                        break;
                    }
                    if(s1 < t1) queue.add(new int[]{s1, t1});
                    if(s2 < t2) queue.add(new int[]{s2, t2});
                }
                result += 1;
                if(flag) break;
            }
            sb.append(result + "\n");
        }

        System.out.println(sb);
    }
}

 

해결방법

BFS 유형인 것만 판단하면 쉽게 풀 수 있다. 

연속 발차기를 할 수 있는 두 가지 경우를 모두 고려하는 BFS 연산을 하면 된다.

'알고리즘 > 백준' 카테고리의 다른 글

8979번 : 올림픽 2  (0) 2023.10.03
2792번 : 보석 상자  (0) 2023.10.01
9489번 : 사촌  (0) 2023.09.27
1911번 : 흙길 보수하기  (0) 2023.09.26
5214번 : 환승  (0) 2023.09.26
    '알고리즘/백준' 카테고리의 다른 글
    • 8979번 : 올림픽 2
    • 2792번 : 보석 상자
    • 9489번 : 사촌
    • 1911번 : 흙길 보수하기
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바