본문 바로가기
컴퓨터/백준 문제풀이

5397. 키로거, 10930 SHA-256, 1920 수 찾기, 4195 친구 네트워크

by 하링아 2020. 9. 11.
반응형

5397. 키로거, 10930 SHA-256, 1920 수 찾기, 4195 친구 네트워크

 

 

코딩 테스트를 준비하면서 백준 문제풀이를 나름 본격적?으로 시작함. 필자 기록용.

언어 : python, pypy3(시간 부족시 테스트용)

 

5397 키로거

# 내 풀이
# 로그 개수 입력 받기
n = int(input())
result = []

#각 로그마다 패스워드 뽑아내기 시작
for _ in range(n):
    pw = list(input()) # 로그를 받아 리스트로 생성
    cusor = 0 # 커서의 위치를 파악하기 위한 변수 생성
    
    for i in range(len(pw)):
        if pw[i] == '<': # '<'의 경우 처음이 아니면 커서 한 칸 앞으로 이동
            if cusor != 0:
                cusor -= 1
        elif pw[i] == '>': # '>'의 경우 끝이 아니면 커서 한 칸 뒤로 이동
            if i != len(pw):
                cusor += 1
        elif pw[i] == '-': # '-'의 경우 처음이 아니면 앞글자 지우고 커서 한 칸 앞으로 이동
            if cusor != 0:
                result.pop(cusor - 2)
                cusor -= 1
        else:
            result.insert(cusor, pw[i]) # 일반 문자의 경우 result 리스트에 추가
            cusor += 1
print(result)

 

다음과 같이 했으나 시간 초과로 통과 못 함.

 

n = int(input())

for _ in range(n):
	left_stack = [] # 커서 기준 왼쪽 스택 생성
	right_stack = [] # 커서 기준 오른쪽 스택 생성
    data = input() 
    for i in data:
    	if i == '-': # 왼쪽 스택 있는지 확인 후 지움
        	if left_stack: 
            	left_stack.pop()
        if i == '<': # 왼쪽 스택 데이터 확인 후 있으면 오른쪽 스택으로 이동
        	if left_stack:
            	right_stack.append(left_stack.pop())
        elif i == '>': # 오른쪽 스택 데치터 확인 후 있으면 왼쪽 스택으로 이동
        	if right_stack:
            	left_stack.append(right_stack.pop())
        else: # 왼쪽 스택에 데이터 추가
        	left_stack.append(i)
	left_stack.extend(reversed(right_stack) # 오른쪽 스택을 반대로 돌려서 왼쪽 스택에 추가
    print(''.join(left_stack)) # 리스트를 문자열로 변환하여 출력

 

강의를 보고 따라 친 코드인데 커서를 기준으로 양쪽에 스택을 만들어서 처리한다는 생각을 어떻게 하는지.. 대단하다. 

 

얻은 것

- 스택 사용법

- ''.join(list) : list를 문자열로 치환

- list1 = list1.append(list2) 랑 list1.append(list2) 다름 의미상 같은 건 줄 알았는데 후자가 맞음

-  reverse(list) : list 거꾸로

 

 

10930 SHA-256

 

해시 암호화를 코드화하는 코드이다. 이론부터 공부해야 되는 줄 알았는데 파이썬 라이브러리로 존재한다. 코드도 단순.

 

import hashlib

data = input()
encoded_data = data.encode()
result = hachlib.sha256(encoded_data).hexdigest()
print(result)

얻은 것

- 해시 암호화를 위한 라이브러리가 있음

- encode() 의 경우 문자열을 바이트화 함.

 

1920 수 찾기

 

이 문제는 기본이 안돼서 못 푼 문제.. 리스트를 집합(set)으로만 고쳤더니 됐다.

# 첫번째 풀이, 풀어지기는 하나 시간 효율 안좋음
a = int(input())
n = list(map(int, input().split(' ')))
b = int(input())
m = list(map(int, input().split(' ')))

for item in m:
    for items in n:
        if item == items:
            print(1)
            break
    else:
        print(0)
        
# 두번째 풀이, ..
a = int(input())
n = list(map(int, input().split(' ')))
b = int(input())
m = list(map(int, input().split(' ')))

for item in m:
  if item in n:
    print(1)
  else:
    print(0)
    
# 세번째 풀이(정답)
a = int(input())
n = set(map(int, input().split(' '))) # list -> set으로 시간 효율 향상...
b = int(input())
m = list(map(int, input().split(' ')))

for item in m:
  if item in n:
    print(1)
  else:
    print(0)
    
# 네번째 풀이
N, array1 = int(input()), {i : 1 for i in map(int, input().split())}
M= input()

for i in list(map(int, input().split())):
	print(array1.get(i, 0))

얻은 것

 

- 중복 관련 개념이 들어가면 set 구조를 확인

- 딕셔너리도 컴프리헨션으로 생성 가능

- 딕셔너리에서 get()  함수 사용법

 

 

4195 친구 네트워크

 

가까스로 이해했지만 구현은 못하겠음.

def find(x):
    if x == parent[x]:
        return x
    else:
        p = find(parent[x])
        parent[x] = p
        return parent[x]
    
def union(x, y):
    x = find(x)
    y = find(y)
    
    if x != y:
        parent[y] = x
        number[x] += number[y]
        
test_case = int(input())

for _ in range(test_case):
    parent = dict()
    number = dict()
    
    f = int(input())
    
    for _ in range(f):
        x, y = input().split(' ')
        
        if x not in parent:
            parent[x] = x
            number[x] = 1
        if y not in parent:
            parent[y] = y
            number[y] = 1
            
        union(x, y)
        print(number[find(x)])

 

 

반응형

댓글