프로그래머스_테이블 해시 함수

임정민·2023년 8월 14일
2

알고리즘 문제풀이

목록 보기
88/173
post-thumbnail

프로그래머스 해시 테이블 문제입니다.실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

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

[나의 풀이]

⌛ 55분 소요

def bitwise_xor_list(nums):
    result = 0
    for num in nums:
        result ^= num
    return result

def solution(data, col, row_begin, row_end):
    answer = []

    data = sorted(data, key=lambda x: (x[col-1],-x[0]))

    
    n = len(data[0])

    for i in range(row_begin,row_end+1):
        tmp = data[i-1]

        v = 0
        for j in range(n):

            v += tmp[j]%i
        answer.append(v)

    result = bitwise_xor_list(answer)

    return result

입력되는 값들을 기반으로 임의의 테이블을 정의하여 조건에 맞게 정렬하고 연산하는 문제입니다.

해시 테이블 문제이기 때문에 최초 구현 시 인덱스를 key, 컬럼별 값들을 dict() 객체를 활용하여 정의하려고 했지만 2중 리스트 형태로도 풀어낼 수 있었던 문제입니다.🐹🐹🐹

두가지의 정렬 조건을 구현하기 위해 람다식을 활용하여 오름차순은 양수, 내림차순은 음수로 표현할 수 있었습니다. 문제에서 요구하는 bitwise(XOR) 연산을 구현하기 위해 result ^= result 구문으로 표현하였습니다.🐰🐰🐰

[다른사람의 풀이1]

def solution(data, col, row_begin, row_end):
    answer = 0
    # 정렬
    data = sorted(data, key = lambda x: [x[col - 1], -x[0]])
    
    for i in range(row_begin, row_end + 1):
        total = 0
        # i행에 대해 mod 연산
        for j in data[i - 1]:
            total += (j % i)
        # mod 연산된 값의 합을 XOR연산
        answer ^= total
            
    return answer

저의 풀이와 거의 똑같은 형태의 풀이이며 약간 다른점은 answer 변수에 출력할 답을 바로 연산하는 방식이었습니다.

[다른사람의 풀이2]

from functools import reduce
def solution(data, col, row_begin, row_end):

    data.sort(key=lambda x:(x[col-1],-x[0]))
    answer = reduce(lambda x,y:x^y,[sum(map(lambda x: x%(i+1),data[i])) for i in range(row_begin-1, row_end)])
    return answer

solution([[2,2,6],[1,5,10],[4,2,9],[3,8,3]],2,2,3)

같은 원리의 풀이이지만 list comprehesion형태로 더 간결한 형태입니다.

표현방식에서 다른 점은 reduce(lambda x,y : x^y) 함수를 활용하였다는 점입니다.

reduce()함수는 예를 들어 아래와 같이 작성되면

numbers = [2, 3, 4]
product = reduce(lambda x, y: x * y, numbers)
print("Product:", product)

입력된 iterator (x)를 순회하며 그 요소들(y) 을 ':' 뒤의 수식으로 연산하며 요소들을 넘어가는 함수였습니다. 처음보는 보는 함수로 앞으로 유용하게 쓰일 것 같습니다.🐦🐦🐦

감사합니다.

profile
https://github.com/min731

0개의 댓글