백준 문제 주소 :
비트마스크로 풀려다가 포기하고 문자열로 푼 다음,
다시 비트마스크로 풀은 문제입니다...
돌돌 비트마스크 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
그래서 오늘 올릴 코드는 2개입니다!
문자열 코드와 비트마스크 코드!!
** 푼 방법
1. 일단 네트워크 마스크를 구한다.
2. 아무 IP에 네트워크 마스크를 &연산하면 네트워크 주소가 나온다.
끝.
하기엔 뭔가 아쉬우니까?
네트워크 마스크는 XOR연산과 NOT연산을 같이해서 NXOR 연산으로 값을 구한 다음,
거기에 256을 더하면 네트워크 마스크가 나옵니다.
이 공식을 이용해서 네트워크 마스크가 앞에서 255아닌게 나오면,
그 나오는 시점부터 뒤의 숫자는 무조건 0이 되게 됩니다.
이해가 안되면 댓글 달아주세욥~
문자열 코드
import sys, re
def solution():
T = int(sys.stdin.readline())
ips = [sys.stdin.readline().rstrip() for i in range(T)]
ip = []
net_addr = []
net_mask = []
all_of_mask = []
# ip 나눠서 받고
for j in range(4):
ip += [[int(re.findall('\d+', i)[j]) for i in ips]]
# 그냥 나눠서 받을 거를 이진수로 바꾼다음, 스트링형태로 바꾸면..?
# 되긴 되겟지만... 이게 좋은 건가...? 32 * 1000 * 4 * 10 정도라고 치면 시간은 별로 안 들긴 하네
#
# ip 4파트 비교
for part in ip:
visited = [True] * 8
tmp = part[0]
# 초기값잡아주고 그값에서 visited에 False 되어있는 곳 다 0으로 만들 계획
for i in range(1, len(part)):
tmp = tmp & part[i]
str_tmp = str(format(tmp, 'b'))
while True:
if len(str_tmp) == 8 :
break
else :
str_tmp = '0'+str_tmp
# 문자변환
for jjip in range(len(part)) :
str_jjip = str(format(part[jjip], 'b'))
while True:
if len(str_jjip) == 8 :
break
else :
str_jjip = '0'+str_jjip
part[jjip] = str_jjip
# visited에 False 삽입
for k in range(1, len(part)):
for i in range(8):
if part[0][i] != part[k][i]:
visited[i] = False
mask = '11111111'
for i in range(len(visited)):
if visited[i] == False :
sig = False
str_tmp = str_tmp[:i] + '0'*(8-i)
mask = mask[:i] + '0'*(8-i)
break
for i in net_mask:
if i != '255':
mask = '00000000'
str_tmp = '00000000'
net_addr.append(str(int(str_tmp,2)))
net_mask.append(str(int(mask,2)))
# 출력
print('.'.join(net_addr))
print('.'.join(net_mask))
solution()
비트마스크 코드
import sys
def solution():
T = int(sys.stdin.readline())
ips = [sys.stdin.readline().rstrip().split('.') for i in range(T)]
net_addr = []
net_mask = []
for i in range(4):
min_ip = int(ips[0][i])
max_ip = int(ips[0][i])
for tmp_ip in ips:
if max_ip < int(tmp_ip[i]):
max_ip = int(tmp_ip[i])
if min_ip > int(tmp_ip[i]):
min_ip = int(tmp_ip[i])
if 255 == 256 + (~max_ip^min_ip):
net_mask.append(255)
else:
for j in range(9):
if -(~max_ip^min_ip) <= 1<<j:
net_mask.append(256 - (1<<j))
for k in range(3):
net_mask.append(0)
break
net_addr.append(int(ips[0][i])&net_mask[i])
net_mask = net_mask[:4]
print("{}.{}.{}.{}".format(net_addr[0], net_addr[1], net_addr[2], net_addr[3]))
print("{}.{}.{}.{}".format(net_mask[0], net_mask[1], net_mask[2], net_mask[3]))
solution()
반응형
'Study > BOJ' 카테고리의 다른 글
[BOJ] 17070. 파이프 옮기기 1 (0) | 2020.10.14 |
---|---|
[BOJ] 16236. 아기상어 (0) | 2020.10.07 |
[BOJ] 2206. 벽 부수고 이동하기 (0) | 2020.09.16 |
[BOJ] 11444. 피보나치 수 6 (0) | 2020.08.27 |
[BOJ] 9663. N-Queen (1) | 2020.08.25 |