99클럽 코테 스터디 1일차 TIL

2024. 10. 28. 16:03·코딩테스트/99클럽 4기

백준 - 1072번

 

처음 문제를 봤을 때, 눈에 띄었던 부분들이 있다.

  • 이제 형택이는 앞으로의 모든 게임에서 지지 않는다.
  • 게임 기록
  • 만약 Z가 절대 변하지 않는다면 -1을 출력한다.

키워드 힌트로 이분탐색이 주어졌지만 처음에는 알고리즘을 적용하지 않고 시도해 보았다.

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        double x = sc.nextDouble();
        double y = sc.nextDouble();
        int z = (int) ((y / x) * 100);

        int count = 0;
        if (x != y) {
            for (double i = y + 1; i <= x + 1; i++) {
                x++;

                int rate = (int) ((i / x) * 100);

                count++;

                if (rate != z) {
                    break;
                }
            }
        } else {
            count = -1;
        }

        System.out.println(count);
        sc.close();
    }
}

위 코드로 예제에 나와있는 케이스들을 입력했을 때 정상적으로 출력되어 제출해 봤지만 틀렸다.

 

게임이 진행되면 게임 횟수와 이긴 횟수 모두 1씩 증가한다.

반복문을 돌 때마다 승률을 계산하고, 새로 계산한 승률과 기존 승률이 다른 경우 반복문을 종료하도록 구현했다.

그리고 기존 게임 횟수와 이긴 횟수가 같을 때만 -1이 출력되도록 했다.

 

여기서 문제는 동일한 승률이 반복된다면 무한 루프에 빠지게 된다는 것이다.

만약 기존 승률이 99%라면 어떻게 될까.

반복문이 끝나지 않아 결과가 출력되지 않는다.

100%가 되려면 게임 횟수와 이긴 횟수가 동일해야 하는데, 둘 다 하나씩 증가하기 때문에 성립될 수 없다.


더 눈여겨봐야 했던 것은 문제의 '제한' 부분이다.

반복문을 10억 번 돌게 하는 것도 굉장히 비효율적이지만

입력 값이 10억이나 9억 999.. 라면 어떻게 구현해야 할 지도 막막하다. 

 

여기서 알고리즘을 적용해 보자.

이분탐색

  • 정렬되어 있는 데이터에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법
  • 찾으려는 데이터와 중간점 위치에 있는 데이터를 반복적으로 비교하여 원하는 데이터를 찾는다.
  • 변수로 start, mid, end / left mid right 등을 사용

문제에 어떻게 적용해 볼 수 있을까.

  • 제한된 수 안에서 중간 지점의 숫자 mid 선택
  • 게임을 mid번 진행했을 때의 승률과 기존 승률 비교
  • 승률이 같은 경우, mid 보다 큰 수의 범위를 탐색하여 다시 비교 
  • 승률이 다른 경우, mid 보다 작은 수의 범위를 탐색하여 다시 비교 

위 과정을 반복하여 결괏값을 찾는다.

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int x = sc.nextInt();
        int y = sc.nextInt();
        int z = getRate(x, y);

        int result = -1;
        int start = 0;
        int end = 1_000_000_000;
        while (start <= end) {
            int mid = (start + end) / 2;

            if (getRate(x + mid, y + mid) != z) {
                result = mid;
                end = mid - 1;
            } else {
                start = mid + 1;
            }
        }

        System.out.println(result);
        sc.close();
    }

    static int getRate(int x, int y) {
        return (int) ((long) y * 100 / x);
    }
}

100 99 값이 주어진 경우,  99%로 -1 이 출력되어야 한다.

기존에는 10억 번을 전부 돌았지만 알고리즘 적용으로 반복 횟수가 약 30번으로 줄었다.


코테를 많이 풀어보진 않았지만 그중에서도 알고리즘을 적용해서 풀어본 문제는 없었던 것 같다.

'알고리즘은 어렵다'라는 인식이 강해 항상 기초적인 문제만 풀어왔다.

 

코테스터디를 통해 그 인식을 조금이라도 깨고자 한다.

 

백준 1072번 게임

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

저작자표시 (새창열림)

'코딩테스트 > 99클럽 4기' 카테고리의 다른 글

99클럽 코테 스터디 6일차 TIL  (0) 2024.11.02
99클럽 코테 스터디 5일차 TIL  (0) 2024.11.01
99클럽 코테 스터디 4일차 TIL  (0) 2024.10.31
99클럽 코테 스터디 3일차 TIL  (0) 2024.10.30
99클럽 코테 스터디 2일차 TIL  (0) 2024.10.29
'코딩테스트/99클럽 4기' 카테고리의 다른 글
  • 99클럽 코테 스터디 5일차 TIL
  • 99클럽 코테 스터디 4일차 TIL
  • 99클럽 코테 스터디 3일차 TIL
  • 99클럽 코테 스터디 2일차 TIL
tjdgus
tjdgus
  • tjdgus
    Do It...
    tjdgus
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Language
        • Java
      • CS
        • Data Structure
        • OS
        • Algorithm
        • Network
      • 오류 모음집
      • ETC
      • 함수형 프로그래밍
      • JPA
      • Toy
      • 데이터베이스
      • Spring
      • 코딩테스트
        • 99클럽 4기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    99클럽
    오블완
    개발자취업
    티스토리챌린지
    코딩테스트준비
    TiL
    항해99
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
tjdgus
99클럽 코테 스터디 1일차 TIL
상단으로

티스토리툴바