[BoostCamp 8기 예상문제] 타입별 메모리 크기(python)
📌문제
💪아이디어
- 8바이트 별로 그룹만들기
메모리 크기는 딕셔너리를 사용하여 값을 불러온다.- 타입의 크기가 8이상일 경우
그 전까지 만들어 졌던 그룹이 있으면 그 그룹 먼저 그룹 배열에 넣어주고 해당 타입을 그룹으로 만들어서 그룹 배열에 넣어준다. 그다음 만들어질 그룹을 위해 그룹 별 바이트를 세는 변수와 그룹을 비워준다.
- 타입의 크기가 8이상일 경우
- 타입의 크기가 8미만일 경우
- 그룹별 바이트가 8이하일 경우
- 그룹에 넣을 형식이 short/float이고 넣을 그룹의 마지막 형식이 bool 경우 패딩을 넣어준다.
- bool이면 그냥 넣어준다
- 그룹에 넣을 형식이 short/float이고 넣을 그룹의 마지막 형식이 bool 경우 패딩을 넣어준다.
- 그룹별 바이트가 8초과일 경우
전에 만들어진 그룹이 있으면 그룹 배열에 넣어주고 해당 타입으로 시작하는 그룹을 만든다.
- 그룹별 바이트가 8이하일 경우
128바이트이상인지 검사
그룹별로 패딩 수 + 타입별 메모리를 그룹핑될때마다 세어줘서 그림그리기 전에 총 메모리크기가 128인지 검사해준다.패딩추가
bool 다음에 4바이트 이하의 형식이 오면 패딩을 추가하는 것은 그룹핑을 하면서 처리해주었다. 4바이트 이하 형식간에 패딩을 넣어주는 방식은 넣어야하는 패딩 수가 4배수이면 float뒤, 2배수이면 short뒤 나머지는 bool뒤에 넣어주는 방식으로 처리해준다.
🥂코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
memory = {"BOOL":1, "SHORT":2, "FLOAT":4, "INT":8,"LONG":16}
param0 = ["INT","INT","BOOL","SHORT","LONG"]
param1 = ["INT","SHORT","FLOAT","INT","BOOL"]
param2 = ["FLOAT","SHORT","BOOL","BOOL","BOOL","INT"]
param3 = ["BOOL","LONG","SHORT","LONG","BOOL","LONG","BOOL","LONG","SHORT","LONG","LONG"]
def grouping(param0):
total_bytes,group_bytes=0,0
group,tmp=[],[]
for t in param0:
add_bytes=memory[t]
if memory[t]>=8: # int, long
if tmp:
group.append([list(tmp),group_bytes])
add_bytes += 8-group_bytes
group_bytes=0
tmp=[]
group.append([t])
else:
if memory[t]>=2: # short,float
if tmp and tmp[-1]=="BOOL": # 앞에 bool 처리
if group_bytes + 2*memory[t]-1 <= 8:
padding_num = memory[t]-1
tmp.append('.'*padding_num)
add_bytes+=padding_num # 패딩 수
if group_bytes+add_bytes>8:
group.append([list(tmp),group_bytes])
total_bytes+= 8 - group_bytes
tmp=[t]
group_bytes=add_bytes
else:
tmp.append(t)
group_bytes+=add_bytes
total_bytes+=add_bytes
if tmp:
group.append([list(tmp),group_bytes])
total_bytes += 8-group_bytes
if total_bytes > 128: return False
return group
def drawing(groups):
answer=[]
for group in groups:
if len(group)==2:
tmp=''
padding_num = 8 - group[1]
if padding_num:
t_set = set(group[0])
if padding_num%4==0 and "FLOAT" in t_set:
inx = group[0].index("FLOAT")
elif padding_num%2==0 and "SHORT" in t_set:
inx = group[0].index("SHORT")
else:
inx = group[0].index("BOOL")
group[0].insert(inx+1,'.'*padding_num)
for t in group[0]:
if '.' in t:
tmp+=t
continue
tmp += '#'*memory[t]
answer.append(tmp)
else:
answer.append("#"*8)
if group[0]=='LONG': answer.append("#"*8)
return answer
group = grouping(param1)
if group:
print(','.join(drawing(group)))
else:
print('HALT')
This post is licensed under CC BY 4.0 by the author.
Comments powered by Disqus.