상세 컨텐츠

본문 제목

테이블 해시 함수 (연습문제)

프로그래머스 코딩테스트 풀이

by 발발개발 2023. 1. 2. 14:14

본문

원본 : https://school.programmers.co.kr/learn/courses/30/lessons/147354

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

class Solution {
    public int solution(int[][] data, int col, int row_begin, int row_end) {
        List<Integer> sList = new ArrayList<>();

        Arrays.sort(data, (o1, o2) -> {
            if (o1[col - 1] == o2[col - 1]) {
                return o2[0] - o1[0];
            } else {
                return o1[col - 1] - o2[col - 1];
            }
        });

        for (int i = row_begin - 1; i < row_end; i++) {
            int s = 0;

            for (int tuple : data[i]) {
                s += tuple % (i + 1);
            }

            sList.add(s);
        }

        sList.sort(Comparator.reverseOrder());
        String binary = decimalToBinary(sList.get(0));

        for (int i = 1; i < sList.size(); i++) {
            String binaryTemp = decimalToBinary(sList.get(i));
            binary = xor(binary, binaryTemp);
        }

        return binaryToDecimal(binary);
    }

    public static String decimalToBinary(int num) {
        StringBuilder sb = new StringBuilder();

        while (num > 0) {
            sb.append(num % 2);
            num /= 2;
        }

        return sb.reverse().toString();
    }

    public static int binaryToDecimal(String binary) {
        int result = 0;
        StringBuilder sb = new StringBuilder(binary).reverse();

        for (int i = 0; i < sb.length(); i++) {
            if (sb.charAt(i) == '1') {
                result += Math.pow(2, i);
            }
        }

        return result;
    }

    public static String xor(String num1, String num2) {
        StringBuilder sb1 = new StringBuilder(num1).reverse();
        StringBuilder sb2 = new StringBuilder(num2).reverse();

        if (sb1.length() > sb2.length()) {
            for (int i = 0; i < num1.length() - num2.length(); i++) {
                sb2.append(0);
            }
        } else if (sb1.length() < sb2.length()) {
            for (int i = 0; i < num2.length() - num1.length(); i++) {
                sb1.append(0);
            }
        }

        StringBuilder result = new StringBuilder();
        char[] chArr1 = sb1.toString().toCharArray();
        char[] chArr2 = sb2.toString().toCharArray();

        for (int i = 0; i < chArr1.length; i++) {
            if (chArr1[i] != chArr2[i]) {
                result.append(1);
            } else {
                result.append(0);
            }
        }

        result.reverse();
        int idx = result.indexOf("1");

        return idx >= 0 ? result.substring(idx) : "0";
    }
}

관련글 더보기

댓글 영역