Coding Test/HackerRank

HackerRank 문제풀이 - 1 (Socks Merchant)

범데이 2022. 2. 2. 16:18
728x90

코딩 인터뷰시 기업들에서 널리 활용중인 해커랭크(HackerRank)의 문제들을 풀어보고, 정리하여 포스팅 할 계획이다.

(HackerRank사이트: https://www.hackerrank.com/)

 


1.문제

 

  • 간단히 n개의 랜덤한 수를 제시해주어, 총 짝이 몇개인지 찾는 로직을 설계하는 문제이다.
    • 짝을 찾지 못했거나 짝을 찾고난 뒤의 홀수개의 수는 모두 버린다

 


2. 풀이

'use strict';

import { WriteStream, createWriteStream } from "fs";
process.stdin.resume();
process.stdin.setEncoding('utf-8');

let inputString: string = '';
let inputLines: string[] = [];
let currentLine: number = 0;

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

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

    main();
});

function readLine(): string {
    return inputLines[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: number, ar: number[]): number {
    // Write your code here
    var count = 0;
    
    var tempArr: number[] = [];
     
    ar.forEach((item: number)=>{
        if(tempArr && tempArr.indexOf(item) > -1){
            tempArr.splice(tempArr.indexOf(item), 1);
            count += 1;
        }else {
            tempArr.push(item);
        }
    })
    
    return count;
}

function main() {
    const ws: WriteStream = createWriteStream(process.env['OUTPUT_PATH']);

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

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

    const result: number = sockMerchant(n, ar);

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

    ws.end();
}

 

  • 나의 풀이 방법은 다음과 같다.
    • ar Array를 이더레이션하면서 다음 검사를 진행한다.
      • tempArr에 저장된 숫자인지 검사한다.
        • 이미 저장된 숫자일 시, count 변수를 +1 하고, tempArr에 저장된 숫자를 제거한다.
        • 이미 저장된 숫자가 아닐시, tempArr에 해당 숫자를 저장한다. 
    • ar Array를 이더레이션을 모두 돌았을 시, count 변수를 리턴한다.

 

 

 

  • Discussion을 참고하니 아래와 같이 Hashset을 쓰는 방법이 vote가 가장 많은듯 하다.
    • 해시셋의 개념을 공부하고, 문제를 다시 풀어보자.
Set<Integer> colors = new HashSet<>();
    int pairs = 0;

    for (int i = 0; i < n; i++) {
        if (!colors.contains(c[i])) {
            colors.add(c[i]);
        } else {
            pairs++;
            colors.remove(c[i]);
        }
    }

    System.out.println(pairs);

3. 결과

반응형