코드 2021의 출현 - 3일 차

퍼즐



--- 3일차: 이진 진단 ---

잠수함이 이상한 삐걱거리는 소리를 내고 있으므로 만일을 대비하여 진단 보고서를 생성하도록 요청합니다.

진단 보고서(퍼즐 입력)는 이진 숫자 목록으로 구성되어 있으며 올바르게 디코딩되면 잠수함의 상태에 대해 많은 유용한 정보를 알려줄 수 있습니다. 확인해야 할 첫 번째 매개변수는 전력 소비입니다.

진단 보고서의 이진수를 사용하여 두 개의 새로운 이진수(감마율 및 입실론율이라고 함)를 생성해야 합니다. 그런 다음 감마 비율에 엡실론 비율을 곱하여 전력 소비를 찾을 수 있습니다.

감마율의 각 비트는 진단 보고서에 있는 모든 숫자의 해당 위치에서 가장 공통적인 비트를 찾아서 결정할 수 있습니다. 예를 들어 다음 진단 보고서가 있다고 가정합니다.

00100
11110
10110
10111
10101
01111
00111
11100
10000
11001
00010
01010

각 숫자의 첫 번째 비트만 고려하면 5개의 0비트와 7개의 1비트가 있습니다. 가장 일반적인 비트가 1이므로 감마율의 첫 번째 비트는 1입니다.

진단 보고서에 있는 숫자의 가장 일반적인 두 번째 비트는 0이므로 감마율의 두 번째 비트는 0입니다.

세 번째, 네 번째, 다섯 번째 비트의 가장 일반적인 값은 각각 1, 1, 0이므로 감마율의 마지막 세 비트는 110입니다.

따라서 감마율은 이진수 10110 또는 십진수로 22입니다.

엡실론 비율은 비슷한 방식으로 계산됩니다. 가장 공통 비트를 사용하는 대신 각 위치의 최소 공통 비트가 사용됩니다. 따라서 엡실론 비율은 01001 또는 십진수로 9입니다. 감마 비율(22)에 엡실론 비율(9)을 곱하면 소비 전력 198이 생성됩니다.

진단 보고서의 이진수를 사용하여 감마 비율과 엡실론 비율을 계산한 다음 함께 곱합니다. 잠수함의 전력 소비는 얼마입니까? (2진수가 아닌 10진수로 답을 표현해야 합니다.)*

내 솔루션




package main;

import java.io.File;
import java.util.*;

public class Puzzle {
  public static void main(String[] args) throws Exception {
    File input = new File("/Users/files/input.txt");

    StringBuilder gammaRate = new StringBuilder();
    StringBuilder epsilonRate = new StringBuilder();

    for (int i = 0; i < 12; i++) {
      Scanner scanner = new Scanner(input);
      List<Character> characterZero = new ArrayList<>();
      List<Character> characterOne = new ArrayList<>();

      while (scanner.hasNextLine()) {
        char character = scanner.nextLine().charAt(i);
        switch (character) {
          case '0':
            characterZero.add(character);
            break;
          case '1':
            characterOne.add(character);
        }
      }
      if (characterZero.size() > characterOne.size()) {
        gammaRate.append('0');
        epsilonRate.append('1');
      } else {
        gammaRate.append('1');
        epsilonRate.append('0');
      }
    }
    int gammaInDecimal = Integer.parseInt(gammaRate.toString(), 2);
    int epsilonInDecimal = Integer.parseInt(epsilonRate.toString(), 2);

    System.out.println(gammaInDecimal * epsilonInDecimal);
  }
}




*출처: https://adventofcode.com/2021/day/3

좋은 웹페이지 즐겨찾기