ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ - Bronz 1] 기상청 인턴 신현수
    카테고리 없음 2024. 3. 25. 13:58

    ❓문제 설명

    • 누적합을 구하는 문제로 주어진 배열에 대해서 주어진 값 K만큼의 누적합 중 가장 큰 수를 구하는 문제이다.

    ✅ 문제 해결

    • 누적합을 구하기 위해서 reduce와 반복문을 사용했으며 2중반복문이 나오는 구조가 되는 것이 조금 아쉽지만 어쩔 수 없다는 생각이 들었다.
    • 아래의 방식으로 코드를 구성했을 때 배열을 생성하는 부분에서 재대로 값이 나오지 않아서 아래에 있는 식을 참고해서 다시 코드를 구성하게 되었다.
    const readline = require("readline");
    
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout,
    });
    
    let linesRead = 0;
    let inputData = [];
    
    rl.on("line", (line) => {
      linesRead++;
      inputData.push(line.split(" "));
      if (linesRead === 2) {
        const [firstLine, secondLine] = inputData;
        const [N, K] = firstLine.map(Number);
        const result = [];
        const numberArray = secondLine.map(Number);
        if (K === N) console.log(Math.max(numberArray));
        else {
          for (let i = 0; i < N; i++) {
            if (i < K) continue;
            const value = numberArray
              .slice(i - K, i)
              .reduce((acc, cur) => acc + cur, 0);
            result.push(value);
          }
          console.log(Math.max(...result));
        }
    
        rl.close();
      }
    });
    
    rl.on("close", () => {
      process.exit();
    });

    🔥 인상 깊은 남의 풀이

    const readline = require("readline");
    
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout,
    });
    
    let linesRead = 0;
    let N = 0; // 전체 일수
    let K = 0; // 연속될 일수
    let temperatures = []; // 기온 데이터를 저장할 배열
    
    rl.on("line", (line) => {
      linesRead++;
      if (linesRead === 1) {
        // 첫 번째 줄에서 N과 K를 추출합니다.
        [N, K] = line.split(" ").map(Number);
      } else if (linesRead === 2) {
        // 두 번째 줄에서 기온 데이터를 추출합니다.
        temperatures = line.split(" ").map(Number);
        // 입력을 모두 받았으므로 연산을 수행하고 출력 후, readline 인터페이스를 닫습니다.
        console.log(findMaxTemperatureSum(N, K, temperatures));
        rl.close();
      }
    });
    
    rl.on("close", () => {
      process.exit();
    });
    
    function findMaxTemperatureSum(N, K, temperatures) {
      let maxSum = -Infinity; // 최대 합계를 저장할 변수를 초기화합니다.
      for (let i = 0; i <= N - K; i++) {
        let currentSum = 0;
        for (let j = i; j < i + K; j++) {
          currentSum += temperatures[j];
        }
        if (currentSum > maxSum) {
          maxSum = currentSum;
        }
      }
      return maxSum;
    }

     

    • 쓸 데 없이 배열에 좌표값을 저장할 필요가 없다. 실제로 사용하지 않기 때문에 이처럼 count만 올리는 방법을 통해서 구현을 하는 것이 좋은 것 같다. 메모리적으로도 코드량으로도 상당히 적은 모습을 보여준다.

    ❕느낀점

    • node 환경을 이용하는 BOJ의 특성 상 좀 귀찮은 입력부분에 대해서 알아야하는 소요가 있어서 좀 불편했지만 단계별 카테고리별 나누어졌있는 것이 좀 더 알기 쉽고 내 점수를 명확하게 알려주기에 많이 사용할 예정이다.
    • 이중반복문 구조를 내가 구현한 것보다 훨씬 더 간단히 구현한 내용이 있었고 심지어 내껀 잘 안되는 부분이 있어서 왜 안되는지에 대해서 원인을 파악하지 못했던 것이 아쉽다.
    • 누적합의 구현에 있어서 간단한 문제를 풀어보려했는데 어쩌다보니 다른 요소로 인해 시간이 오래걸려서 다음부터는 시간을 좀 더 줄일 수 있을 것 같다.

    댓글

Designed by Tistory.