반응형

1번 문제

Person class 를 정의하고

조건

• name, id, age, height, weight 변수선언

• __str__(self) 메서드 재정의(overriding)

 각 항목에 Person class 의 객체를 갖는 리스트 정의

 각각 객체의 필드 name, 에 “을지문덕”, “계백”, “김유신”, “강감찬“, “이순신”을 대입

 각각의 age, height, weight 대입 4. 각 인물의 이름과 나이 키 몸무게 순서로 5명의 데이터를 출력

 

class Person:
    name=""
    id=""
    age=0
    height=0
    weight=0

    def __init__(self,name,id,age,height,weight):
        self.name = name
        self.id= id
        self.age = age
        self.height = height
        self.weight = weight
        
    def __str__(self):
        return "이름: " + self.name +  "나이: " + str(self.age) + "키: " + str(self.height) + "몸무게: " + str(self.weight)
    

def main():
    manyperson = [Person("을지문덕","1",20,60,174),Person("계백","2",23,80,194),Person("김유신","3",18,59,174),Person("강감찬","4",25,78,180),Person("이순신","5",24,67,184)]
    for i in range(0,5):
        print(manyperson[i])


if  __name__ == "__main__":
    main()

 person 클래스를 생성하고 init 함수를 생성하여 변수값들을 초기화 해줍니다.( 생성자)

__str__ 메소드를 함수오버라이딩 하여 사용합니다. 객체에 대한 반환값을 문자열로 전달하는 것입니다. 

그 이후 리스트를 생성하고 반복문을 통해서 출력해주면 됩니다. 

 

 

2번 문제 

원을 나타내는 Circle라는 클래스를 설계,

 반지름 radius와  중심 좌표 cx와 cy를 통하여

 원의 넓이를 반환하는 메소드 area()와

 원의 중심을 반환하는 메소드 center () 를 구현 클래스를 완성하고 객체를 생성하여 임의의 값을 대입하여 원의 넓이와 그 중심 좌표값을 화면에 출력하시오.

 

import math


class Circle:
    radius =0
    cx=0
    cy=0

    def __init__(self, radius, cx, cy):
        self.radius = radius
        self.cx = cx
        self.cy = cy
    def area(self):
        return self.radius*self.radius*math.pi
    def center(self):
        return self.cx,self.cy
    

def main():
    radius =0
    cx=0
    cy=0
    print("정보를 입력하세요")
    radius=int(input("반지름:"))
    cx=int(input("x좌표:"))
    cy=int(input("y좌표:"))
    circle = Circle(radius,cx,cy)

    #함수호출
    print("원의 넓이: "+str(circle.area()))
    print("중심좌표: "+str(circle.center()))


if  __name__ == "__main__":
    main()

 circle 클래스를 생성하고 init 함수를 생성하여 변수값들을 초기화 해줍니다.( 생성자)

area, center 메소드를 생성해서 값을 전달해줍니다. 

main 메소드에서는 int(input())의 형태로 int형 숫자를 입력받습니다. 

math 라이브러리에 pi값을 사용하였습니다.

 

 

3번 문제 

주사위 클래스 Dice를 설계하는데 메소드에는 roll()을 구현하여 주사위를 던져 나온 숫자를 화면에 출력하는 프로그램을 작성하시오.

-단, 난수의 발생은 다음을 이용하라. -face = random.randint(1, 6)

 

import random as rd

class Dice:

    face = 0
    def __init__(self):
        self.face = 0
    
    @classmethod
    def roll(self):
        self.face = rd.randint(1,6)
        return self.face


def main():
    print("주사위를 굴리려먼 아무값이나 입력하세요")
    input()
    print("주사위값: " + str(Dice().roll()))



if  __name__ == "__main__":
    main()

 

random 라이브러리의 randint 메소드를 사용하여 난수를 생성하였습니다. 

 

 

반응형
반응형

 

upper_bound 와 lower_bound 함수는 정렬된 배열에서 원하는 값의 위치의 인덱스를 반환하는 함수 입니다.

 

#include <algorithm> 라이브러리에 존재합니다. 

 

사용 예시입니다. 선행조건은 꼭 정렬되어있는 배열을 넣어야합니다.

int val = lower_bound(arr, arr + n, num ) - arr ;
int val = upper_bound(arr, arr + n, num ) - arr ;

위처럼 사용하고 lower_bound는 arr배열의 0~n까지중  num값인덱스 중 제일 작은 값을 반환 합니다. 

upper_bound는 arr배열의 0~n까지중 num보다 큰 가장작은 값의 인덱스 값을 반환합니다.

 

 

즉 1 2 3 3 3 3 4 배열에서 num=2인 lowerbound는 1을 반환, upperbound는 2를 반환하는 형태입니다. (2값의 인덱스 1, 3값의 인덱스 2)

 

 

연습문제 링크:https://www.acmicpc.net/problem/3020

 

3020번: 개똥벌레

문제 개똥벌레 한 마리가 장애물(석순과 종유석)로 가득찬 동굴에 들어갔다. 동굴의 길이는 N미터이고, 높이는 H미터이다. (N은 짝수) 첫 번째 장애물은 항상 석순이고, 그 다음에는 종유석과 석순이 번갈아가면서 등장한다. 아래 그림은 길이가 14미터이고 높이가 5미터인 동굴이다. (예제 그림) 이 개똥벌레는 장애물을 피하지 않는다. 자신이 지나갈 구간을 정한 다음 일직선으로 지나가면서 만나는 모든 장애물을 파괴한다. 위의 그림에서 4번째 구간으로 개똥벌레

www.acmicpc.net

직접 이분탐색을 구현해서 풀어도 되지만 upper_bound, lower_bound 을 사용하는데 좋은 예제이기 때문에 가져왔습니다. 

 

문제 해설:https://gusdnr69.tistory.com/59

 

[백준] 3020-개똥벌레(C++)

문제링크:https://www.acmicpc.net/problem/3020 3020번: 개똥벌레 문제 개똥벌레 한 마리가 장애물(석순과 종유석)로 가득찬 동굴에 들어갔다. 동굴의 길이는 N미터이고, 높이는 H미터이다. (N은 짝수) 첫 번째..

gusdnr69.tistory.com

화이팅입니다! :)

반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

c++ 우선순위 큐 priority_queue 사용법  (0) 2020.07.29
C++ sort함수 invalid comparator 오류  (0) 2020.05.04
C++ memset 사용법  (0) 2020.05.03
C++ math사용법 총정리  (0) 2020.03.13
sort함수 사용법  (0) 2020.03.13
반응형

파이썬을 사용할 때 기본으로 제공되는 라이브러리만 사용되지 않고 많은 기능을 제공하는 라이브러리들을 추가 하여 사용하게 됩니다. 이러한 라이브러리가 특정 프로젝트에서만 사용되거나 프로젝트를 배포할 때 필요한 라이브러리만 포함시켜 배포하고 싶을 경우가 있을 것입니다.

 

이럴때 사용할 수 있는것이 가상환경(virtualenv) 입니다. 가상환경을 만들고, 그 가상환경에서 라이브러리를 추가하면 추가된 라이브러리는 그 가상환경에서만 사용 되어집니다.

 

우선 패스설정이 완료되었다는 가정하에 진행하겠습니다. (path설정을 통해 파이썬이 다른 경로 폴더의 .py들을 실행시킬 수 있게 만드는 과정입니다. 

 

C:\>esay_install pip

 

파이썬 패키지 관리자인 pip.exe 파일을 Python 3.4 버전부터 미리 포함되어 있습니다. 이전 버전을 사용한다면 easy_install 프로그램을 이용해서 pip.exe 를 먼저 설치합니다.

 

여러개의 파이썬 프로젝트를 관리하면서 각 프로젝트마다 사용되는 라이브러리가 충돌을 한다던가 하는 경우에도 가상환경을 사용하여 분리할 수 있습니다.

 

가상 환경 없이 설치한 파이썬 라이브러리는 전역으로 설치됩니다. 이렇게 설치한 라이브러리는 모든 사용자와 모든 프로젝트에서 사용할 수 있습니다.

 

가상환경을 다음과 같이 설치합니다.

 

C:\>pip install virtualenv

 

이제 가상환경을 만들어 봅니다. 가상환경 파일이 생성될곳을 C:\>workspace\python 으로 하겠습니다. 다음 명령을 실행합니다.

 

C:\>workspace\python>virtualenv ProjectEnv

 

이 명령은 새 환경 ProjectEnv 를 만듭니다. 만든 새 환경을 사용하려면 먼저 활성화해야 합니다. 새환경 폴더 아래 Scripts 폴더 아래에 activate.bat 파일을 실행합니다.

 

C:\>workspace\python>cd ProjectEnv\Scripts

C:\>workspace\python\ProjectEnv\Scripts>activate

 

환경을 활성화하면 환경의 이름이 명령 프롬프트에 표시되어 현재 가상 환경에 있음을 알립니다. 가상 환경에서 라이브러리를 설치하거나 스크립트를 실행하면 그 환경에만 영향이 있습니다.

 

(ProjectEnv) C:\workspace\python\ProjectEnv\Scripts>python

>>>^Z

 

deactivate 명령으로 환경에서 떠날 수 있습니다. 다시 가상환경으로 들어가기 위해서는 activate 명령을 다시 실행하면 됩니다.

 

(ProjectEnv) C:\workspace\python\ProjectEnv\Scripts>deactivate



출처: https://offbyone.tistory.com/74 [쉬고 싶은 개발자]


 

요약정리

 

가상환경 설치 & 실행
python - m venv (가상환경 이름)
source (가상환경이름)/scrips/activate

<->deactivate

 

라이브러리 설치시 

pip install ~~ 

반응형
반응형

Python은 1991년 프로그래머인 귀도 반 로섬(Guido van Rossum)이 발표한 고급 프로그래밍 언어로, 플랫폼 독립적이며 인터프리터식, 객체지향적, 동적 타이핑(dynamically typed) 대화형 언어이다. 파이썬이라는 이름은 귀도가 좋아하는 코미디 〈Monty Python’s Flying Circus〉에서 따온 것입니다. 

 

즉 프로그래밍 언어입니다. 

 

가장 큰 특징은 인터프리터 언어라는 것입니다.

소스 코드를 기계어로 컴파일해서 실행파일을 만들고 실행하는 컴파일 언어와는 다르게 인터프러터 언어는 코드를 한 줄씩 읽어 내려가며 실행하는 프로그래밍 언어입니다. 인터프리터 방식을 쓰는 프로그래밍 언어는 많은데 대표적인 것이 Python입니다. 파이썬은 그 외에도 정적타입, 동적타입 모두 사용가능하다는 특성이 있습니다.

 

인터프리터 언어의 장단점

인터프리터는 실행 시마다 소스 코드를 한 줄씩 기계어로 번역하는 방식이기 때문에 실행 속도는 컴파일 언어보다 느리다. 그렇다면 왜 사용할까? 인터프리터 언어는 프로그램 수정이 간단하다는 장점이 있습니다. 컴파일러는 소스 코드를 번역해서 실행 파일을 만들기 때문에 프로그램에 수정 사항이 발생하면 소스 코드를 다시 컴파일해야 한다. 하지만 인터프리터는 소스 코드를 수정해서 바로 실행시킬 수 있습니다.

 

장점

  • 배우기 쉬워서 학습용으로 좋다.
  • 공동 작업과 유지 보수가 아주 쉽고 편해서 생산성이 높고 실사용률도 높다.
  • 읽고 쓰기 쉽다.

단점

  • 느리다.

Python 동작절차

Python의 구현체 CPython

일반적으로 python이 C로 구현되어 있다고 알려져있는데 그 구현체가 CPython이다. 가장 처음 만들어진 python의 구현체이고 Python.org 에서 다운 받으면 CPython을 받는 것입니다. 다른 구현체들과 비교해서 언급할 때 주로 CPython이라고 표기하는데 Python을 C언어로 구현한 구현체를 의미합니다.

CPython은 인터프리터 이면서 컴파일러 입니다. 우리가 작성하는 Python 코드를 bytecode로 컴파일 하고 실행합니다. 다시 말해, python 코드를 C언어로 바꾸는 것이 아니라 컴파일하여 bytecode로 바꾸고 그 다음에 interpreter(virtual machine)가 실행합니다.

(CPython 인터프리터 실행 중에 단점이 있는데 GIL(global interpreter lock)을 사용한다는 것이다. bytecode를 실행할 때에 여러 thread를 사용할 경우, 전체에 lock 을 걸어서 한번에 단 하나의 thread 만이 python object에 접근하도록 제한한 것이다. 하지만 single thread일 때는 문제가 없고 GIL의 단점을 보안하기 위한 방법들이 존재하고 있어서 GIL로 인한 불편함을 느낄 가능성은 거의 없다고 한다.)

 

Jython

python 코드를 java 바이트코드로 만들어 JVM에서 실행할 수 있도록 한다. .py 파일을 .class파일로 컴파일 한다.

 

pypy

python 자체로 구현. JIT 컴파일 도입하여 CPython 보다 빠르다.

 

(JIT(just-in-time) 컴파일 이란 프로그램을 실행하기 전에 컴파일 하는 대신, 프로그램을 실행하는 시점에서 피료한 부분을 즉석으로 컴파일하는 방식. 보통 인터프리터 언어의 성능 향상을 목적으로 도입하는 경우가 많다. 인터프리트 하면서 자주 쓰이는 코드를 캐싱하기 때문에 인터프리터의 느린 실행 속도를 개선할 수 있다. JVM에서도 바이트코드를 기계어로 번역할 때 JIT 컴파일러를 사용한다.)

 

 

 

출처:https://cjh5414.github.io/about-python-and-how-python-works/

 

Python에 대하여, Python은 어떻게 동작하는가? Python의 장단점

Jihun's Development Blog

cjh5414.github.io

 

반응형
반응형

아래 그림처럼 사용을 한다.

cmath는 c++에서의 표준라이브러리로 각종 수학함수들을 가지고 있다. (math.h 를 사용해서 구현해도 괜찮다.)

특이하게 min, max는 algorithm 라이브러리에 존재하는 것을 주의 하자.

 

반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

c++ 우선순위 큐 priority_queue 사용법  (0) 2020.07.29
C++ sort함수 invalid comparator 오류  (0) 2020.05.04
C++ memset 사용법  (0) 2020.05.03
C++ upper_bound, lower_bound 사용하기  (0) 2020.03.21
sort함수 사용법  (0) 2020.03.13
반응형

1. 헤더 선언 #include <algorithm>

 

2. sort( start, end) or sort( start, end, compare)

 

ex) sort(arr, arr+n)  sort(arr, arr+n,cmp)

 

시작주소와 끝주소 그리고 cmp함수가 필요합니다.

 

sort( start, end) -> 이형태는 단순 오름차순으로 정렬해줍니다.

 

sort함수를 퀵정렬법을 사용하기 때문에 O(nlgn) 입니다.

 

cmp 구현방법입니다.

left<right return true; -> 오름차순

left>right return true; -> 내림차순

 

사용예제입니다.

bool cmp(info a, info b) {
	if (a.korean > b.korean)  //1
		return true;
	else if(a.korean == b.korean){
		if (a.english < b.english) return true; //2
		else if(a.english == b.english){
			if (a.math > b.math) return true; //3
			else if(a.math == b.math) {
				if (a.name < b.name)return true; //4
			}
		}
	}

	return false;
}

문제 링크:https://www.acmicpc.net/problem/10825

 

10825번: 국영수

첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 100보다 작거나 같은 자연수이다. 이름은 알파벳 대소문자로 이루어진 문자열이고, 길이는 10자리를 넘지 않는다.

www.acmicpc.net

저렇게 사용하는 방법은 단순한 규칙입니다. 퀵정렬방법을 아시는 분들이 왜 저렇게 사용하는지 이해하시겠지만, 이해가 안된다면 방식으로 외워서 사용하는 것도 우선은 괜찮습니다..

 

 

정답코드입니다.

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
struct info {
	string name;
	int korean;
	int english;
	int math;
};

info arr[100001];
int n = 0;

/*
국어 점수가 감소하는 순서로
국어 점수가 같으면 영어 점수가 증가하는 순서로
국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)
*/
bool cmp(info a, info b) {
	if (a.korean > b.korean)  //1
		return true;
	else if(a.korean == b.korean){
		if (a.english < b.english) return true; //2
		else if(a.english == b.english){
			if (a.math > b.math) return true; //3
			else if(a.math == b.math) {
				if (a.name < b.name)return true; //4
			}
		}
	}

	return false;
}
int main() {

	cin >> n;

	for (int i = 0; i < n; i++)
		cin >> arr[i].name >> arr[i].korean >> arr[i].english >> arr[i].math;

	sort(arr, arr + n, cmp);

	for (int i = 0; i < n; i++)
		cout << arr[i].name <<'\n';

}
반응형

+ Recent posts