Yet Never Lose Faith

- Good to Great , Jim Collins

How To Preprocess Image Data 자세히보기

Algorithm

65th. CodeUp #3017 : 정렬 기준

Kellyyyy 2020. 12. 25. 13:08

PROBLEM.

 

정렬 기준

정렬된 데이터를 번호, 수학, 정보 점수 순으로 각 줄에 하나씩 출력한다.

codeup.kr


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() 함수를 사용해서 객체를 선언할 수 있다. 이때 첫 번째 인자값은 객체의 구조(형식)을 의미하는데, 속성값의 자료형을 조합해서 문자열 형식으로 지정한다. 지정할 수 있는 자료형은 아래와 같다.

 

struct 선언 가능한 foramt 리스트

 

자료형 표에 따르면 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.

appia.tistory.com/197

 

파이썬[Python] namedtuple - collections 모듈

이번 포스팅은 collection 모듈에 대해서 조금 더 알아보도록 하겠습니다. 이 전에 counter()라는 함수를 알아봤었습니다. 이번에는 클래스와 매우 유사하지만, 조금 더 쉽게 빠르게 만들 수 있는 named

appia.tistory.com

https://docs.python.org/ko/3/library/struct.html?highlight=struct#module-struct

 

struct — Interpret bytes as packed binary data — Python 3.9.1 문서

struct — Interpret bytes as packed binary data Source code: Lib/struct.py This module performs conversions between Python values and C structs represented as Python bytes objects. This can be used in handling binary data stored in files or from network c

docs.python.org

https://jacking75.github.io/python_binary/

 

Python - struct 모듈을 사용하여 Binary 읽고/쓰기 - jacking75

출처 struct 모듈 struct 모듈은 pack, unpack, calcsize 등의 기능이 있으며, 이것들을 사용하여 정수, 부동 소수점 숫자, 문자열(을 encode 메소드에서 인코딩 한 것)을 bytes 객체로 변환하거나 반대로 bytes

jacking75.github.io

End.