[코테] HackerRank Sales by Match

Dongmin Lee·2023년 5월 22일
0

코테

목록 보기
14/23

💿 문제

💾 문제 요약

숫자로 이루어진 배열을 입력 받을 때, 같은 값로 이루어진 페어가 몇쌍이냐?

💿 풀이

중복을 검사하기 위한 배열 checkArr,같은 숫자가 몇개나 들어왔는지 확인하기 위한 배열 cntArr,현재 값을 카운팅하는 변수 cnt를 생성한다.

입력 받은 배열을 순회하면서 값이 checkArr에 존재하지 않으면 checkArr에 삽입하면서 하고 cnt를 1 증가시킨다. 그리고 입력 받은 배열에 같은 값이 존재하지 않을 때까지 while문을 돌려 총 몇개가 있는지 체크하고 while문을 벗어나면 카운팅한 횟수를 cntArr에 삽입하고 cnt를 0으로 초기화시킨다.

입력 받은 배열에 대한 순회가 끝나면 cntArr를 순회하면서 해당 인덱스 값이 짝수면 2로 나눈 후 총합에 더하고, 홀수면 1을 뺀 후 총합에 더한 다음 총합을 리턴한다.

💾 풀이 코드

'use strict';

const fs = require('fs');

process.stdin.resume();
process.stdin.setEncoding('utf-8');

let inputString = '';
let currentLine = 0;

process.stdin.on('data', function(inputStdin) {
    inputString += inputStdin;
});

process.stdin.on('end', function() {
    inputString = inputString.split('\n');

    main();
});

function readLine() {
    return inputString[currentLine++];
}

/*
 * Complete the 'sockMerchant' function below.
 *
 * The function is expected to return an INTEGER.
 * The function accepts following parameters:
 *  1. INTEGER n
 *  2. INTEGER_ARRAY ar
 */

function sockMerchant(n, ar) {
    // Write your code here
    const cntArr = [];
    const checkArr = [];
    
    let cnt = 0;
    let total = 0;
    
    for(let i=0; i<ar.length; i++) {
        if (checkArr.indexOf(ar[i]) === -1) {
            let j = i;
            checkArr.push(ar[i]);    
            cnt++;
            while(ar.indexOf(ar[i],j+1) !== -1) {
                j = ar.indexOf(ar[i],j+1);
                cnt++;
            }
            cntArr.push(cnt);
            cnt = 0; 
        }
    }
    
    for(let i=0; i<cntArr.length; i++){
        if(cntArr[i] > 1) {
           if(cntArr[i] %2 === 0) {
               total += cntArr[i]/2;
           } else {
               total += (cntArr[i]-1)/2;
           }
        }
           
    }

    return total;
}

function main() {
    const ws = fs.createWriteStream(process.env.OUTPUT_PATH);

    const n = parseInt(readLine().trim(), 10);

    const ar = readLine().replace(/\s+$/g, '').split(' ').map(arTemp => parseInt(arTemp, 10));

    const result = sockMerchant(n, ar);

    ws.write(result + '\n');

    ws.end();
}

💾 더 좋은 풀이 코드

function sockMerchant(n, ar) {
  const countMap = new Map();
  let totalPairs = 0;

  for (const color of ar) {
    const count = (countMap.get(color) || 0) + 1;
    countMap.set(color, count);

    if (count % 2 === 0) {
      totalPairs++;
    }
  }

  return totalPairs;
}

맵 객체를 생성하고 입력 받은 배열을 순회하며 해당 요소의 값을 key, 카운팅한 횟수 count를 value로 설정함. 순회하면서 count를 2로 나눈 나머지가 0이면 total을 증가시킴.

💿 리마인더

for..of 문
Map 객체

profile
어제보다 성장하기

0개의 댓글