Post

[BoostCamp 8기 예상문제] 타입별 메모리 크기(python)

📌문제

Alt text Alt text

💪아이디어

  1. 8바이트 별로 그룹만들기
    메모리 크기는 딕셔너리를 사용하여 값을 불러온다.
    • 타입의 크기가 8이상일 경우
      그 전까지 만들어 졌던 그룹이 있으면 그 그룹 먼저 그룹 배열에 넣어주고 해당 타입을 그룹으로 만들어서 그룹 배열에 넣어준다. 그다음 만들어질 그룹을 위해 그룹 별 바이트를 세는 변수와 그룹을 비워준다.

  • 타입의 크기가 8미만일 경우
    • 그룹별 바이트가 8이하일 경우
      • 그룹에 넣을 형식이 short/float이고 넣을 그룹의 마지막 형식이 bool 경우 패딩을 넣어준다.
      • bool이면 그냥 넣어준다

    • 그룹별 바이트가 8초과일 경우
      전에 만들어진 그룹이 있으면 그룹 배열에 넣어주고 해당 타입으로 시작하는 그룹을 만든다.
  1. 128바이트이상인지 검사
    그룹별로 패딩 수 + 타입별 메모리를 그룹핑될때마다 세어줘서 그림그리기 전에 총 메모리크기가 128인지 검사해준다.

  2. 패딩추가
    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.