반응형
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)])
반응형
'컴퓨터 > 백준 문제풀이' 카테고리의 다른 글
1302 베스트셀러, 1668 트로피진열, 1236 성 지키기 (0) | 2020.09.23 |
---|---|
11004 k번째 수, 1543 문서 검색, 1568 새 (0) | 2020.09.19 |
1074번 Z, 7490 0 만들기, 2751 수 정렬하기 2 (0) | 2020.09.17 |
11650 좌표 정렬하기, 10989 수 정렬하기 3, 2747 피노나치 수 (0) | 2020.09.12 |
2750 수 정렬하기, 1427 소트인사이드, 10814 나이순정렬 (1) | 2020.09.12 |
댓글