PROBLEM.
IDEA.
2가지 방법으로 Python 구현체를 구현해보았다.
① collections 모듈의 namedtuple
namedtuple은 문자 그대로 이름이 있는 tuple 자료형이다. tuple 자료형에 이름을 붙여서 객체처럼 사용하는 방식이다. 어쩌면 class를 만드는 것과 유사하다고 볼 수 있다. 그럼 파이썬 표준 라이브러리의 basic example로 선언 및 사용하는 법을 알아보자.
# 1. namedTuple의 구조를 선언
Point = namedTuple('Point', ['x','y'])
먼저 namedTuple의 구조를 선언한다. 위 예시에서는 Point라는 이름을 가진 tuple(class라고 이해하면 좋을 것 같다.)이고, 속성으로는 x, y를 가진다. 이때 속성은 항상 string 자료형으로 선언해야한다.
# 2. 객체 생성
p = Point(11, y=22)
Point 라는 namedtuple를 이용해서 p라는 객체를 생성한다. 이때 속성을 지정하는 방식은 x 처럼 그냥 속성 값만 써줘도 되고, y처럼 속성명을 지정한 후 써도 된다. (속성명을 기입하면 속성 순서에 상관없이 지정할 수 있다.)
# 3. 속성 호출
p[0] + p[1]
# 33
p.x + p.y
# 33
tuple 자료형이기 때문에 인덱스를 지정하여 속성을 호출할 수 있다. 또한 객체이기도 하기 때문에 '객체명.속성명'의 방식으로도 호출할 수 있다.
② struct 모듈
struct 모듈 역시 객체를 생성할 수 있는 방법 중 하나이다. 다만, 개인적인 생각으로는 초보자 입장에서 선언하고 호출하는 방식이 namedtuple에 비해서는 좀 어려운 것 같다. 이번에도 파이썬 표준 라이브러리의 basic example로 간단하게 알아본다.
# 객체 선언하기
import struct
p = struct.pack('hhl', 1,2,3)
pack() 함수를 사용해서 객체를 선언할 수 있다. 이때 첫 번째 인자값은 객체의 구조(형식)을 의미하는데, 속성값의 자료형을 조합해서 문자열 형식으로 지정한다. 지정할 수 있는 자료형은 아래와 같다.
자료형 표에 따르면 basic example에서는 첫 번째, 두 번째, 세 번째 속성 모두 integer type으로 지정했다. (python type 기준) 자료형 선언이 끝나면 차례대로 속성값을 선언해주면 된다.
# 객체의 속성값 호출
res = struct.unpack('hhl', p)
print(res)
# (1, 2, 3)
print(res[0])
# 1
객체의 속성값을 호출하기 위해서는 unpack() 함수를 사용할 수 있다. pack()과 마찬가지로 해당 객체의 구조를 지정한 수 호출할 객체명을 지정하면 된다. 출력값을 보면 알겠지만 객체의 자료형은 tuple형인 것을 알 수 있다. namedtuple과 마찬가지로 인덱스를 지정해서 특정 속성값을 호출할 수도 있다.
*unpack 하지 않고 호출하면?
만약 객체를 unpack 하지 않고 호출하면 어떻게 출력될까?
print(p)
# b'\x00\x01\x00\x02\x00\x00\x00\x03'
struct는 속성을 bytes로 변환하여 저장하기 때문에 위와 같이 byte형으로 출력된다.
위 두 개념을 사용해서 3017번을 푼 소스는 아래와 같다.
SOURCE 1. namedtuple
import collections
Student = collections.namedtuple('Student', ['id', 'math', 'comp'])
Students = list()
n = int(input())
for i in range(n) :
m , c = map(int, input().split())
Students.append(Student(i,m,c))
def chg_idx(j) :
temp = Students[j]
Students[j] = Students[j+1]
Students[j+1] = temp
for i in range(1,n) :
for j in range(n-i) :
if Students[j].math < Students[j+1].math :
chg_idx(j)
elif Students[j].math == Students[j+1].math :
if Students[j].comp < Students[j+1].comp :
chg_idx(j)
for i in range(n) :
print((Students[i].id)+1, Students[i].math, Students[i].comp)
'''
입력 :
5
100 90
90 100
80 80
80 90
60 50
출력 :
1 100 90
2 90 100
4 80 90
3 80 80
5 60 50
'''
SOURCE 2. struct
import struct
n = int(input())
stus = list()
for i in range(n) :
m, c = map(int, input().split())
stus.append(struct.pack('iii',i+1,m,c))
def chg_idx(j) :
temp = stus[j]
stus[j] = stus[j+1]
stus[j+1] = temp
for i in range(1,n) :
for j in range(n-i) :
stuj = struct.unpack('iii',stus[j])
stujj = struct.unpack('iii',stus[j+1])
if stuj[1] < stujj[1] :
chg_idx(j)
elif stuj[1] == stujj[1] :
if stuj[2] < stujj[2] :
chg_idx(j)
for s in stus :
res = struct.unpack('iii', s)
print(res[0], res[1], res[2])
'''
입력 :
5
100 90
90 100
80 80
80 90
60 50
출력 :
1 100 90
2 90 100
4 80 90
3 80 80
5 60 50
'''
Reference.
https://docs.python.org/ko/3/library/struct.html?highlight=struct#module-struct
https://jacking75.github.io/python_binary/
End.
'Algorithm' 카테고리의 다른 글
Baekjoon #1389 케빈 베이컨의 법칙 (java) (0) | 2021.04.04 |
---|---|
66th. CodeUp #3015 : 성적표 출력 (0) | 2020.12.26 |
64th. CodeUp #1091 : [기초-종합] 수 나열하기3 (0) | 2020.12.23 |
63rd. CodeUp #1090 : [기초-종합] 수 나열하기2 (0) | 2020.12.23 |
62nd. CodeUp #1089 : [기초-종합] 수 나열하기1 (0) | 2020.12.23 |