프로그래머스 해시 테이블 문제입니다.실전에 대비하기 위해 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) 을 ':' 뒤의 수식으로 연산하며 요소들을 넘어가는 함수였습니다. 처음보는 보는 함수로 앞으로 유용하게 쓰일 것 같습니다.🐦🐦🐦
감사합니다.