[Algorithm/JavaScript] 백준 1009번 분산처리

Dico·2021년 1월 8일
0

[Algorithm/JavaScript]

목록 보기
15/18

백준 1009번 문제 '분산처리' 리뷰 🙇🏻‍♀️


문제출처: https://www.acmicpc.net/problem/1009

문제

문제 보러가기


제출답안

오답 ❌

const readline = require('readline');
const rl = readline.createInterface({
	 input: process.stdin,
	 output: process.stdout
});

const lastDigitObj = {
    "1": [1],
    "2": [2, 4, 8, 6],
    "3": [3, 9, 7, 1],
    "4": [4, 6],
    "5": [5],
    "6": [6],
    "7": [7, 9, 3, 1],
    "8": [8, 4, 2, 6],
    "9": [9, 1],
    "0": [10]
}
let lastDigit;
let t = -1;
let count = 0;

rl.on('line', line => {
    if (t < 0){
        t = parseInt(line); //제일 처음 들어오는 input이 t가 된다.
        console.log("t", t);
    } else {
        count++;
        if (count > t) {
            console.log("ended!");
            rl.close();
        } else {
            let [int, expo] = line.split(' ').map(el => Number(el));//input.push(line);
            int = parseInt(JSON.stringify(int).slice(-1));
            let lastDigit = carculate(int, expo);
            console.log("count", count);
            console.log(lastDigit);
        }
    }
});

function carculate(int, expo) {
    const remainder = expo % 10; //10보다 작은 수로 나옴.
    if (lastDigitObj[int].length === 1){
        lastDigit = lastDigitObj[int][0];
    } else {
        const length = lastDigitObj[int].length;
        let idx;
        if (remainder % length === 0){
            idx = lastDigitObj[int].length - 1;
        } else {
            idx = (remainder % length) - 1;
        }
        lastDigit = lastDigitObj[int][idx];
    }
    return lastDigit;
}

최종제출답안 ⭕️

const readline = require('readline');
const rl = readline.createInterface({
	 input: process.stdin,
	 output: process.stdout
});

const lastDigitObj = {
    "1": [1],
    "2": [2, 4, 8, 6],
    "3": [3, 9, 7, 1],
    "4": [4, 6],
    "5": [5],
    "6": [6],
    "7": [7, 9, 3, 1],
    "8": [8, 4, 2, 6],
    "9": [9, 1],
    "0": [10]
}
let lastDigit;
let t = -1;
let count = 0;

rl.on('line', (line) => {
    if (t < 0){
        t = parseInt(line); //제일 처음 들어오는 input이 t가 된다.
    } else {
        count++;
        let [int, expo] = line.split(' ').map((el) => Number(el));//input.push(line);
        let lastDigit = carculate(int, expo);
        console.log(lastDigit);
        if (count === t) {
            rl.close();
        }
    }
});

function carculate(int, expo) {
    const remainder = int % 10; //10보다 작은 수로 나옴.
    if (remainder === 0){
        lastDigit = 10;
    } else if (lastDigitObj[remainder].length === 1){
        lastDigit = lastDigitObj[remainder][0];
    } else {
        const length = lastDigitObj[remainder].length; //length of each obj in obj
        let idx; //need idx for lastDigit
        if (expo % length === 0){
            idx = lastDigitObj[remainder].length - 1;
        } else {
            idx = (expo % length) - 1;
        }
        lastDigit = lastDigitObj[remainder][idx];
    }
    return lastDigit;
}

오늘의 Lesson

  • 최근들어 가장 많은 시간을 소요한 (나를 너무나 지치게 만들어버린)문제...♨️♨️♨️ 🙉
  • 이번문제는 미완이었던 코드로 (너무나 감사하게도)팀원분께 코드리뷰를 받았다.
  • 문제점1: 사용자 input정보를 읽어오는 방법이 익숙하지 않음.
    readline.createInterface(), rl.on(), rl.close() 등)
  • 문제점2: 문제를 꼼꼼히 읽지 않은 채 코드를 작성해 간과하고 있었던 정보가 있었음.
    https://pang2h.tistory.com/187 왼쪽 블로그를 참고한 후 반복되는 1의 자리 숫자들을 lastDigitObj객체에 저장했고, 나머지를 기준으로 인덱스로 접근해 1의자리를 찾아내는 방법을 사용했다.
    10의 거듭제곱은 1의 자리가 0으로 끝나니 자연스레 0을 저장해뒀지만, 사실...
    → 재용이는 0번째 컴퓨터가 아니라 10번째 컴퓨터가 있다. 0번째 컴퓨터는 없다❗️ 문제 꼼꼼히 읽을 것❗️
  • 수정된 점:
    1) const remainder = expo % 10;const remainder = int % 10;
    expo를 나누었던 방식에서 int를 나누는 방식으로 바뀜.
    remainder % lengthexpo % length 로 바뀜.
    2) if (count > t) { console.log("ended!"); rl.close(); }if (count === t) { rl.close(); }
    rl.close()의 실행조건이 달라짐. 위치도 바뀜.
    3) if (remainder === 0){ lastDigit = 10; } 으로 0인 경우 따로 예외처리.
    4) lastDigit = lastDigitObj[int][idx];lastDigit = lastDigitObj[remainder][idx];으로 바뀜.
  • 문제의 원인을 상관없는 곳에서 찾고자 했던 것 같은 생각이 든다. 시간이 좀 지나고나서 처음부터 다시 풀어보는 연습을 해봐야겠다.
profile
프린이의 코묻은 코드가 쌓이는 공간

0개의 댓글