[코드트리 조별과제 마지막 6주차 코딩테스트 연습] 자리 수 단위로 완전탐색 / (모이자) 문제 풀이 모음 with 자바스크립트(Javascript) & 자바(Java)

Re_Go·2024년 8월 25일
0

코딩테스트연습

목록 보기
106/106
post-thumbnail

1. 첫번째 문제 풀이(2024-08-20)

해당 문제를 마지막으로 조별과제 이벤트를 완료하게 되었습니다. 그간 미뤄왔던 Novice Low 단계를 졸업하고 Novice Mid도 어느덧 2/3 정도 해결을 했네요...! 물론 중도에 막히기도 해서 알고리즘 기초부터 하나씩 풀어나가는 중인데, 알고리즘 문제를 풀면 풀수록 "얼른 블로그를 이사해야겠다..." 라는 생각이 들었습니다. (워낙 블로그에 축약 및 요약해야할 내용들이 많다보니...)

그래도 이번 조별과제를 하면서 코테 공부도 제법 되었고, 자동으로 깃 커밋도 되어서 잔디가 하루 하루 깔리는 보람도 느꼈는데 이젠 무료 이벤트가 지나면 그럴 수 없다는게 아쉬워 지네요... 🤣 그래도 돈이 여유가 생기면 한 달이라도 결제를 해보고자 합니다. (물론 요즘은 국비 학원 공부에 사플도 두 개 하는 중이라 알고리즘 공부할 시간이 없지만...)

무튼 마지막 조별과제 제출도 열심히 풀어봤습니다! 이번주는 정말 어렵고도 어렵다는 완탐을 풀었고요! (물론 배열 기록이 더 어렵지만... ㅋㅋㅋ)

  1. JS 버전
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const n = Number(input[0]);
const people = input[1].split(" ").map(Number);

// 최소 거리를 찾아야 하므로 최대값(Infinity)로 설정
let min = Infinity;

for (let i = 0; i < n; i++) {
    let total = 0;
    for (let j = 0; j < n; j++) {
        /*
          i가 집이고, j가 사람이라고 하면 편한데
          만약 첫번째 집(i가 0일때)일때를 기준으로 거리를 구하고자 할때는 
          첫번째 사람(1)은 자기 집에 있으니 1 * 0이 됨 (거리 없음)
          그러나 두번째 사람(2)은 거리가 1이 걸리기 때문에 2 * 1이 걸림
          나머지도 3 * 2, 2 * 3, 6 * 4 만큼의 거리가 걸림 
          그래서 이들의 합이 36이 되는거임

          반대로 3번의 집(i가 2 일때)는 처음부터 계산해보면
          1 * (2 - 0), 2 * (2 - 1), 3 * (2 - 2), 2 * (2 - 3), 6 * (2 - 4)의 거리 계산이 나옴
          그래서 결과가 18이 나오는 것임
        */

        total += people[j] * Math.abs(i - j);
    }
    // 전체 구한 거리의 합이 최소거리의 값보다 작을 때 그 값으로 대체
    if (total < min) {
        min = total;
    }
}

console.log(min);
  1. JAVA 버전
import java.util.Scanner;

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

        // 첫 번째 줄의 입력을 읽습니다.
        int n = scanner.nextInt();

        // 두 번째 줄의 입력을 읽습니다.
        int[] people = new int[n];
        for (int i = 0; i < n; i++) {
            people[i] = scanner.nextInt();
        }

        // 최소 거리를 무한대로 초기화합니다.
        long min = Long.MAX_VALUE;

        // i를 집의 위치로 보고, j를 사람의 위치로 보고 거리를 계산합니다.
        for (int i = 0; i < n; i++) {
            long total = 0;
            for (int j = 0; j < n; j++) {
                total += people[j] * Math.abs(i - j);
            }
            // 현재 계산된 거리가 최소 거리보다 작으면 업데이트합니다.
            if (total < min) {
                min = total;
            }
        }

        // 결과를 출력합니다.
        System.out.println(min);

        // Scanner 객체를 닫습니다.
        scanner.close();
    }
}

사실 이번에 조별과제를 참여하면서 백준이나 프로그래머스에서는 볼 수 없었던 AI나 답변들을 보고 굉장히 만족을 해서 사용했습니다. 특히 이번 코드 피드백을 계기로 "다음 달에 수급비를 받으면 한 번 학생 할인을 받아서 질러봐야겠다." 는 생각까지 들었어요. (물론 해커랭크 입문했다가 정신 나간 가격에 광탈하고 돌아왔다는 말은 못합니다 ㅎ...)

다만 좀 아쉬웠던건 답변을 받는 부분이었는데, 하루 하루 꾸준히 푸는 입장에서 토론글에 전문적으로 답변을 달아주시는 분들의 피드백을 받는다는 점에서도 메리트가 있긴 한데,

답변을 꾸준히 달아주시기는 하는데 아무래도 답변을 달아도 몇 시간은 기다려야 하니 한 문제가 막히면 이에 대한 답변을 받느라 또 문제를 푸는데 집중을 할 수 없다는 단점도 생길 수 밖에 없었던 듯 합니다. (특히 Novice mid 중간부터 막혀서 전날 저녁 즈음 답변을 달면 오후 늦게 답변이 달리는 부분은 좀 아쉽더라고요. 근데 이 부분은 달아주시는 분도 일을 하시거나 다른 일을 하시는 분일수도 있으니 아쉬운 부분이라고 해야하나...)

이번 조별과제 이벤트가 끝난 현재는 조만간 사플에 집중을 할 계획이긴한데, 이번에 블로그를 이사할 때 제가 정리했던 블로그 글들을 다시 한 번 정리하면서 여태껏 풀었던 코드트리 문제들을 제대로 리포스팅 해볼 생각까지 갖게 해주었던 의외로 뜻깊었던 시간이었던 것 만큼은 분명합니다!

profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글