본문 바로가기
Algorithm/etc

[파이썬] 프로그래머스 : 테이블 해시 함수 (Lv.2)

by 베짱이28호 2023. 7. 11.

[파이썬] 프로그래머스 : 테이블 해시 함수 (Lv.2)

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

 

프로그래머스

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

programmers.co.kr

 


풀이

0. 방향성 생각

문제에서 하란대로 구현하기.

다중 입력에 대한 bitwise XOR 구현하는거만 잘 해주면 된다.

 

1. mod 구하기

def solution(data, col, row_begin, row_end):
    
    data.sort(key=lambda x:(x[col-1],-x[0]))
    temp = []
    for i in range(row_begin-1,row_end): # S_i
        q = 0
        for j in data[i]:
            q += j%(i+1)
        temp.append(bin(q)[2:])
    print(temp)
    
# 출력 ['0', '100']

주어진 범위 row_begin, row_end에 대해서 모듈러 연산을 해준다.

data[i]에서 모든 모듈러 연산의 합을 q에 할당하고 이진수로 바꿔서 temp에 저장하기.

2. 자리수 맞추기

    leng = 0
    for i in temp:
        if len(i) > leng : leng = len(i)
    print(leng)
# 출력 : 3
    answer = []
    for i in temp:
        answer.append(list('0'*(leng-len(i))+i))
    print(answer)
    

# 출력 [['0', '0', '0'], ['1', '0', '0']]

XOR 연산을 위해 비어있는 자리수의 경우 연산이 안되므로 temp에 들어있는 최대 문자열 길이를 leng으로 놓고,

leng보다 작은 길이의 경우 0으로 채운다. ljust로 채워도 된다.

 

3. 답 구하기

   s = ''
    for i in zip(*answer):
        s += str(i.count('1')%2)
    print(s)
 # 출력 100
    return int(s,2)

2차원 배열에서 zip(*리스트) 이걸 쓰면 행끼리 저장되있던게 열끼리 저장되게 바뀐다.

여기서 열끼리 저장되는 거에서 1의 개수를 세고 2로 나누면 된다.

마지막에는 정수로 변환

['0', '0', '0']
['1', '0', '0']

('0', '1')
('0', '0')
('0', '0')

위에 있던게 zip(*리스트) 쓰면 아래거로 바뀜


전체코드

def solution(data, col, row_begin, row_end):
    
    data.sort(key=lambda x:(x[col-1],-x[0]))
    temp = []
    for i in range(row_begin-1,row_end): # S_i
        q = 0
        for j in data[i]:
            q += j%(i+1)
        temp.append(bin(q)[2:])
    print(temp)
    
    leng = 0
    for i in temp:
        if len(i) > leng : leng = len(i)
    print(leng)
    
    answer = []
    for i in temp:
        answer.append(list('0'*(leng-len(i))+i))
    print(answer)
    
    s = ''
    for i in zip(*answer):
        s += str(i.count('1')%2)
    print(s)
    return int(s,2)

 

코멘트

문자열, 진법변환 잘 하면 쉬운문제

댓글