[카테고리:] Programming

  • 23년 1회 정보처리기사 실기 해설

    23년 1회 정보처리기사 실기 해설

    1회 정보처리기사 실기 해설

    1번 문제

    class Static{
     
        public int a = 20;
        static int b = 0;
        
    }
     
    public class Main{
        public static void main(String[] args) {
            
            int a;
            a = 10;
            Static.b = a;
     
            Static st = new Static();
     
            System.out.println(Static.b++);
            System.out.println(st.b);
            System.out.println(a);
            System.out.print(st.a);
        }
    }

    Static 클래스에는 2개의 정수 변수가 있음. 인스턴스 변수 a는 초기 값 20. 정적 변수 b는 초기 값 0.

    main 메소드에서 정적 변수 a가 선언 되고 값이 10이 할당 됨.

    Static 클래스의 인스턴스가 생성되어 참조 변수 st에 할당 됨

    System.out.println(Static.b++); => Static 클래스 정적 변수 b값을 출력하고 그 값을 1 증가 시킴. 10.

    System.out.println(st.b); => b값이 증가되어서 11

    System.out.println(a); => 로컬 변수 a값 10이 출력

    System.out.print(st.a); => Static 클래스의 인스턴스인 인스턴스 변수 a의 값을 출력함. 20이 출력.

    10
    11
    10
    20

    2번 문제

    #include <stdio.h>
     
    int main(){
    
        char a[] = "Art";
        char* p = NULL;
        p = a;
     
        printf("%s\n", a);
        printf("%c\n", *p);
        printf("%c\n", *a);
        printf("%s\n", p);
     
        for(int i = 0; a[i] != '
    #include <stdio.h>
    int main(){
    char a[] = "Art";
    char* p = NULL;
    p = a;
    printf("%s\n", a);
    printf("%c\n", *p);
    printf("%c\n", *a);
    printf("%s\n", p);
    for(int i = 0; a[i] != '\0'; i++)
    printf("%c", a[i]);
    }
    
    '; i++) printf("%c", a[i]); }

    첫번째 printf 에서는 문자 배열 a에 저장된 문자열을 출력. %s (string) 이므로 Art

    두번째 printf 에서는 포인터 p가 가리키는 문자를 출력. 문자열 Art의 첫 번째 문자인 A

    세번째 printf 에서는 문자 배열 a의 첫 번째 요소의 값을 출력, A

    네번째 printf에서는 포인터 p가 가리키는 문자열을 출력, Art

    for 루프문에서는 \0에 도달할 때까지 a 배열의 각 문자를 반복해서 출력함. 참고로 \n은 없기 때문에 줄바꿈 없이 출력됨. Art

    출력 결과:

    Art
    A
    A
    Art
    Art

    3번 문제

    #include <stdio.h>
     
    int main(){
     
        char* a = "qwer";
        char* b = "qwtety";
     
        for(int i = 0; a[i] != '
    #include <stdio.h>
    int main(){
    char* a = "qwer";
    char* b = "qwtety";
    for(int i = 0; a[i] != '\0' ; i++){
    for(int j = 0; b[j] != '\0'; j++){
    if(a[i] == b[j]) printf("%c", a[i]);
    }
    }
    }
    ' ; i++){ for(int j = 0; b[j] != '
    #include <stdio.h>
    int main(){
    char* a = "qwer";
    char* b = "qwtety";
    for(int i = 0; a[i] != '\0' ; i++){
    for(int j = 0; b[j] != '\0'; j++){
    if(a[i] == b[j]) printf("%c", a[i]);
    }
    }
    }
    '; j++){ if(a[i] == b[j]) printf("%c", a[i]); } } }

    main 함수에서 두 개의 문자 포인터 a, b가 선언되고 각각 문자열 “qwer”, “qwtety” 을 가리키도록 초기화됨

    외부 루프와 내부 루프는 포인터 a와 b가 가리키는 문자열의 각 문자를 반복함. a를 기준으로 공통된 문자만 출력하므로

    qwe 가 출력됨

    4번 문제

    – 해당 설명과 관련한 용어

    • 비동기적 web application의 제작을 위해 JavaScript와 XML을 이용한 비동기적 정보 교환 기법
    • 필요한 데이터만을 웹 서버에 요청해서 받은 후 클라이언트에서 데이터에 대한 처리를 할 수 있음
    • 보통 SOAP이나 XML 기반의 웹 서비스 프로토콜이 사용되며, 웹 서버의 응답을 처리하기 위해서 클라이언트 쪽에서는 자바스크립트를 씀
    • Google Map과 Google pages에서 사용한 기술에 기반하여 제작되었다.

    AJAX(Asynchronous Javascript and XML)

    5번 문제

    • 회선교환 방식과 데이터그램 방식의 장점을 결합한 통신 기술
    • 처음 패킷으로 최적의 경로를 고정하고 경로가 고정되면 그 다음은 패킷으로 나누어 고속으로 전송할 수 있다.
    • 통신기술에는 ATM이 있으며, 정해진 시간 안이나 다량의 데이터를 연속으로 보낼 때 적합

    가상회선

    • 패킷교환 방식으로 동작하면서 IP 주소를 사용하는 인터넷을 의미
    • 각 전송패킷을 미리 정해진 경로 없이 독립적으로 처리하여 교환하는 방식
    • 특정 교환기의 고장 시 모든 패킷을 잃어버리는 가상회선과 달리, 그 경로를 피해서 전송할 수 있으므로 더욱 신뢰가 가능
    • 짧은 메시지의 패킷들을 전송할 때 효과적이고 재정렬 기능이 필요

    데이터그램

    6번 문제

    • 2 계층(데이터링크 계층)에서 구현되는 터널링 기술 중 하나
    • L2F와 PPTP가 결합된 프로토콜로 VPN과 인터넷 서비스 제공자(ISP)가 이용
    • IPsec을 함께 사용하면 PPTP 보다 훨씬 안전하지만 보안보다 익명화에 더 적합

    L2TP

    7번 문제

    • 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해주는 응용 프로그램 또는 그 프로토콜을 가리킨다.
    • 보안 접속을 통한 rsh, rcp, rlogin, rexec, telnet, ftp 등을 제공하며, IP spoofing 을 방지하기 위한 기능을 제공한다
    • 기본 포트는 22번

    SSH (Secure Shell)

    8번 문제

    (1)

    • 이메일, 공유폴더 p2p네트워크를 이용해서 스스로 전파
    • 자가 복제 가능하다

    웜(worm)

    (2)

    • 사용자가 의도치 않는 소스코드 속에 숨어 있음.
    • 감염된 후에 스스로를 복제하는 능력은 없다

    트로이목마

    (3)

    • 자기 복제 능력이 있음
    • 자가 전파는 되지 않음

    바이러스

    9번 문제

    #include
    int main() {
    
    	int input = 101110;
    	int di = 1;
    	int sum = 0;
    
    	while (1) {
    		if(input == 0) break;
    		else {
    			sum = sum + (input {1} {2}) * di;
    			di = di * 2;
    			input = input / 10;
    		}
    	}
    	printf("%d", sum);
            return 0;
    
    }

    {1} -> %

    {2} -> 10

    10번 문제

    • TCP/IP에서 IP 패킷을 처리할 때 발생되는 문제를 알려주는 프로토콜
    • ping 명령어를 통한 해당 패킷을 연속적으로 계속 보내어 서버의 요청에 응답으로 인한 다른 작업을 하지 못하도록 하는 공격이 해당 Flooding이다

    ICMP

    11번 문제

    객체의 대리인, mediate라고도 함. 을 이용하여 원래 객체 작업을 대신 처리하는 패턴을 무엇이라고 하는가

    Proxy

    12번 문제

    (1)

    • 테이블에서의 행을 가리킴. 중복허용

    Tuple

    (2)

    • 릴레이션의 외연Relation Extension 이라고도 한다

    Relation Instance

    (3)

    • 특정 데이터 집합의 unique한 값의 개수

    Cardinality

    (참조)

    relation : 데이터를 2차원 표로 나타낸 것

    relation schema : 데이터 구조

    relation instance: 해당 구조에 들어가 있는 값

    tuple: 각각의 행을 의미

    domain : 각 속성이 가지는 값의 집합

    degree : 속성의 수 : 학번, 이름, 학년, 신장, 학과 총 5개

    13번 문제

    delete from 학생 wherer 이름=”민수”;

    14번 문제

    #include
    void swap(int a[], int idx1, int idx2) {
    	int t = a[idx1];
    	a[idx1] = a[idx2];
    	a[{1}] = t;
    }
    void sort(int a[], int len) {
    	for(int i=0; i
    		for(int j=1; j
    			if(a[j] > a[j+1])
    				swap(a, j, j+1);
    		}
    	}
    }
    int main() {
    	int nx = 5;
    	int a[] = {5, 15, 7, 20, 11};
    	sort(a, {2});
    	for(int i=0; i
    		printf("%d ", a[i]);
    	}
    }

    {1} -> idx2

    {2} -> nx

    15번 문제 python set 문제

    a = {'한국', '중국', '일본'}
    a.add('베트남')
    a.add('중국')
    a.remove('일본')
    a.update({'홍콩', '한국', '태국'})
    print(a)

    중복값 제거하는 문제. 해당 문제 풀이는 Pass

    16번 문제

    select 과목 이름, min(점수) as 최소점수, max(점수) as 최대점수

    from 성적

    group by 과목이름

    having avg(점수) >=90;

    17번 문제

    abstact class Vehicle {
     
        String name;
        abstract public String getName(String val);
     
        public String getName() {
                return "Vehicle name: " + name;
        }
    }
     
    class Car extends Vehicle {
     
        public Car(String val) {
                name=super.name=val;
        }
        public String getName(String val) {
                return "Car name:" + val;
        }
        public String getName(byte val[]) {
                return "Car name:" + val;
        }
    }
     
     
    public class Main {
        public static void main(String[] args) {
            Vehicle obj = new Car("Spark");
            System.out.println(obj.getName());
     
        }
    }

    해석:

    public class main 을 보면 이 메소드는 이름이 “Spark”인 Car 클래스의 인스턴스를 생성하고 이것을 참조 변수인 Vehicle에 할당함.

    그런 다음 이 객체에서 getName() 메소드를 호출 함. Car 클래스의 인스턴스를 생성할 때 name=super.name=val 이므로 name은 Spark인 채로 Vehicle 상위 클래스에 할당되고 getName()을 하면 Vehicle name: Spark가 됨…

    출력값:

    Vehicle name: Spark

    18번 문제

    (1)

    • 서브 스키마라고 함
    • 하나의 데이터베이스 시스템에는 여러개의 외부 스키마가 존재
    • 하나의 외부 스키마를 여러 개의 응용 프로그램 혹은 사용자가 공유

    외부 스키마

    (2)

    • 데이터베이스 파일에 저장되는 데이터의 형태
    • 기관이나 조직체의 관점에서 데이터베이스를 정의

    개념 스키마

    (3)

    • 물리적인 저장장치 입장에서 데이터가 저장되는 방법
    • 저장 데이터 항목의 표현방법, 내부 레코드의 물리적 순서, 인덱스 유/무 등을 나타냄

    내부 스키마

    19번 문제

    화이트박스 분기 커버리지

    1 2 3 4 5 6 1

    1 2 4 5 6 7

    20번 문제

    class Parent {
    	int x = 100;
    	Parent() {
    		this(500);
    	}
    	Parent(int x) {
    		this.x = x;
    	}
    	int getX() {
    		return this.x;
    	}
    }
    class Child extends Parent {
    	int x = 1000;
    	Child() {
    		this(5000);
    	}
    	Child(int x) {
    		this.x = x;
    	}
    }
    public class Main {
    	public static void main(String[] args) {
    		Child obj = new Child();
    		System.out.println(obj.getX());
    	}
    }

    해석:

    이 메소드는 Child 클래스의 인스턴스를 생성 obj. 인수가 없는 생성자가 호출됨. Child() 이기 때문에 this(5000)을 호출. 그런데 이 생성자는 x 필드에 값을 할당하기 전에 먼저 Parent 클래스의 인수가 없는 생성자를 호출 Parent() . this(500)을 호출하여 이 생성자는 x 필드에 500을 할당. 코드에서 getX() 메소드를 호출하면 이건 Parent 클래스에서 정의된 x를 의미함. Child에서는 x는 5000임. getX()는 Parent 클래스의 x를 호출하기 때문에 따라서 Parent에서 인수 없이 불러진 this(500) 이 x 값으로 할당되어, 부모 클래스에서 정의된 x필드의 값을 출력하니 500임.

    new Child();로 해당 자식 객체가 생성될 때 부모 클래스의 생성자가 먼저 호출되어 x값이 할당하는 것…

    출력:

    500

  • exact p-value – Python 으로 구하기. normal distribution 구현

    exact p-value – Python 으로 구하기. normal distribution 구현

    잊어버리기 전에 다시 정리…

    python으로 normal distribution 공식과 공식을 통해 해당 값의 frequency를 구해봤다.

    공식을 변형해서,

    python으로 구현하면 다음과 같다.

    import math
    import numpy as np
    
    def normal_distribution(x , mean , standard_deviation):
        frequency = (1/(math.sqrt(np.pi*2)*standard_deviation)) * np.exp(-0.5*((x-mean)/standard_deviation)**2)
        return frequency

    z-score가 2.45가 나올 때 해당 frequency값을 구하면,

    z-score는 평균이 0이고, 표준편차가 1일 때를 기준으로 하기 때문에 다음과 같이 집어넣어서 구할 수 있다.

    normal_distribution(2.45, 0, 1)

    그럼 값은

    0.019837354391795313

    이 나오고,

    지난번 포스팅에서 “해당 값을 표준화 했더니 z값이 2.45, 해당 값이 일어날 확률이 p=.0142가 나왔다.”는

    -> “해당 값을 표준화 했더니 z값이 2.45, 해당 값이 일어날 확률이 p=.0198가 나왔다.”로 수정해야한다.

    뭔가 계속 찜찜해서 결국 직접 구해봤다.

    추가로,

    실제 랜덤 데이터로 생성해서 구현했다.

    random_number = np.random.normal(0, 1, 100000000)
    print(np.mean(random_number))
    print(np.std(random_number))

    1억 개 정도 normal distribution 정규 분포 형태의 랜덤 데이터를 만들어서 평균값과 표준 편차 값을 확인했다.

    1억개 정도 하니 평균은 0, 표준편차는 1에 가까운 값이 나온다. 소숫점 이하의 오차는 갯수가 클 수록 더 작아진다.

    import seaborn as sb
    from scipy.stats import norm
    
    pdf = norm.pdf(random_number , loc = 0 , scale = 1 )
    sb.lineplot(random_number, pdf , color = 'red')

    이건 1억개 정도 돌리려고 했는데 램 용량 부족으로 못돌려서 1만개 정도만 돌린 그래프,

    pdf는 Probability density function 으로 확률 밀도 함수를 구해서 그래프로 그린 것,

    plt로 그래프 그린다고 해도 동일함

    import matplotlib.pyplot as plt
    
    count, bins, ignored = plt.hist(random_number, 100, density=True)
    plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) * np.exp(-(bins-mu)**2 / (2 * sigma**2) ), linewidth=2, color='r')
    plt.show()

    여기에서 cdf 값, Cumulative distribution fuction으로.

    누적값으로 z값 2.45까지의 면적 값을 구해보면,

    # Library
    from matplotlib import pyplot as plt
    import numpy as np
    from scipy.stats import norm
    
    fig, ax = plt.subplots()
    
    # for distribution curve
    x= np.arange(-4,4,0.001)
    ax.plot(x, norm.pdf(x))
    
    ax.set_title("Normal distribution")
    ax.set_xlabel('x')
    ax.set_ylabel('pdf(x)')
    ax.grid(True)
    
    # for fill_between
    px=np.arange(-4, 2.45,0.01)
    ax.set_ylim(0,0.5)
    ax.fill_between(px,norm.pdf(px),alpha=0.5, color='g')
    
    # cdf(x) 값 구하기
    cdf_x = round(norm.cdf(x=2.45, loc=0, scale=1), 5)
    
    # for text
    ax.text(-1, 0.1, cdf_x, fontsize=20)
    plt.show()

    으로,

    z-score가 2.45를 기준으로 좌측 끝 부분부터 해당 값까지의 누적 면적 값… Cumulative 값은 0.993정도가 된다는 것을 추가로 확인했다.

  • computer science 강의 – CS50 추천

    computer science 강의 – CS50 추천

    하버드 대학교에서 컴퓨터 사이언스 101 같은 강의가 있는데,

    CS50 이라고 부르는 것 같습니다. 왜 CS50 인지는 아직 검색 안 해봤습니다.

    C, array, algorithm, memory, Python, JAVA, 등 다양한 베이스를 들어볼 수 있습니다.

    꼭 듣는다고 코딩 스킬이 좋아지거나 하는 부분보단, 좀 더 빠르게 이해하고 언어를 학습하는데 도움을 줄 수 있다고 하니.

    유튜브에 검색해서 들어보면 좋을 것 같습니다.

    뭔가 독학으로 가다가 막혔을 때 들어보면 좋을 것 같습니다. 베이스는 탄탄하게 다지면 다질 수록 좋은 거니깐요.

  • Mac) anaconda 설치

    Mac) anaconda 설치

    뭔가 맥에 아나콘다가 설치가 잘 되지 않습니다. 이유를 모르겠군요… 설치는 되는데 작동이 잘 되지 않는 듯한,

    설치 과정을 일단 기록했습니다.

    1. 아나콘다 사이트에서

    해당 맥 파일을 다운로드 받고,

    https://www.anaconda.com/products/distribution

    2. 허용하고 그대로 쭉 설치 과정 진행

    확인

    3. 여기서 부터 문제

    설치해 실패했습니다 라고 뜹니다.

    설치는 실패했지만 깔려있긴 하니.

    업데이트도 있어서

    업데이트도 해주고,

    주피터 노트북도 돌려봤는데 localhost: 8888인 상태에서 돌아갑니다.

    일단, 당장 주피터 노트북을 사용할 일은 없어서 몇 번 써보고 말긴 했지만.

    뭔가 찜찜하게 설치가 되고 끝났습니다.

    이렇게 설치 실패하면 라이브러리 설치할 때 꼭 문제가 생기던데,

    흠. 원인을 모르겠네요.

    약간의 추정은 m1과 관련한 이슈가 아닐런지. miniforge로 설치하는 분들이 많아서…

  • ubuntu22.04 visual studio code 설치 /의존성이 맞지 않습니다.

    중간에 설치가 안되어서,

    해당 과정도 기록했습니다.

    1. 일단 visual studio code 웹사이트에 가서 deb파일 ubuntu용 64 바이트 부분 다운로드를 받고,

    2. 해당 다운로드 받은 파일 경로로 가서

    cd Download/
    sudo apt get install 다운로드 받은 파일 이름

    으로 쳤는데 에러가 났습니다.

    의존성이 맞지 않습니다. 패키지 없이 ~을 시도해보십시오. 라고 떠서.

    3. apt에 문제가 있는 것 같아서 –fix-broken install로 설치했습니다.

    sudo apt --fix-boken install

    앞에 sudo라고 치지 않으면 해결되지 않음.

    그럼 잘 돌아갑니다.

    다시 2번으로 돌아가서

    설치를 해줍니다.

    sudo apt get install 파일 이름~

    그럼 설치가 완료되고, visual studio code를 볼 수 있습니다.

    터미널 창에 code라고 쳐도 뜹니다.

    끝!

  • GO-linked list와 array

    GO-linked list와 array

    https://go.dev/play/ 로 들어가면 go 언어로 테스트 해볼 수 있다.

    이건 단방향 노드 링크드 리스트 코드인데, 테스트 해봤음. 그래프의 일종이다.

    // You can edit this code!
    // Click here and start typing.
    package main
    
    import "fmt"
    
    type Node[T any] struct {
    	next *Node[T]
    	val  T
    }
    
    func main() {
    	root := &Node[int]{nil, 10}
    	root.next = &Node[int]{nil, 20}
    	root.next.next = &Node[int]{nil, 30}
    
    	for n := root; n != nil; n = n.next {
    		fmt.Printf("node val: %d\n", n.val)
    	}
    }

    양방향으로 추가하려면 next뿐만 아니라 prev도 존재해야 한다. root 설정도 미리 해둬야 하고, prev는 root next는 새로운 노드 값으로 설정하는 것.

    해당 관련해서는 나중에 따로 정리해야 할 듯.

    이 부분은 새로운 숫자를 중간에 추가해주어야 할 때. array 로 만들고 중간에 넣으려고 하면 다음과 같이 뒷 부분은 따로 저장해서 넣어야 하는 단점이 있음.

    package main
    
    import "fmt"
    
    func main() {
    	var a [10]int = [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    	var b [11]int
    
    	copy(b[0:], a[0:5])
    	b[5] = 1234
    	copy(b[6:], a[5:])
    
    	fmt.Println(a)
    	fmt.Println(b)
    }

  • RAM 용량 건으로 Colab Pro 결제

    RAM 용량 건으로 Colab Pro 결제

    코랩 유료 버전은 어디에서 사용할 수 있냐는 faq에서 한국인 없길래 한국에선 안 된다고 생각하고 테스트 삼아 결제했는데 잘 돌아간다

    코랩 pro를 쓴 이유는 RAM 용량 때문에 뭘 좀 돌렸는데 램이 부족해서 코랩에서도 돌아가지 않아서 프로로 결제하고,

    옵션에서 고용량 RAM 선택해서 돌렸더니 잘 돌아갔다

    저 위의 코드를 돌려보면 GPU 이름과, NVIDIA-SMI, CUDA version 등을 확인할 수 있다. GPU 버전 아니면 GPU에 연결할 수 없다라고 뜸.

    문제의 데이터셋. 무료 코랩을 쓸 때는 이 부분을 아예 볼 수 없었다. 중간에 다 끊겨서. 프로를 쓰니 볼 수 있었다. 데이터가 크면 이런 문구를 띄어 주는 것 같다.

    이 데이터셋트는 507만 개 정도 된다. 507만 개 정도 for문으로 돌리면 RAM 용량 초과로 코랩으로 돌리면 안 돌아가집니다.

    문제 해결!

  • M1 tensorflow와 keras 설치 실패

    M1 tensorflow와 keras 설치 실패

    이것은 실패 기록입니다. 실패 로그도 남깁니다.

    tensorflow와 keras는 m1 맥북에는 miniforge를 통해서 설치해야 하는 것 같다. 아직, miniforge로 못해보고 conda 로만 시도해봤는데

    tensorflow가 깔리지 않는다. conda install -c 설치채널이름 패키지이름 순으로 작성하면 윈도우는 되는 것 같다. 그런데

    맥북 터미널에서,

    conda install -c conda-forge tensorflow

    conda install -c conda-forge keras

    로 설치시도 했는데 m1 맥북엔 안 먹힘.

    tensorboard를 보기 위해서 직접 설치해보려고 했는데…

    miniforge로 설치하는 방법이 있다고 한다. 그건 나중에. 일단 코랩으로 해결했다.

  • python) TypeError: ‘int’ object is not callable – sum(list)

    python) TypeError: ‘int’ object is not callable – sum(list)

    이런 에러가 생겼다. 타입 에러. ‘int’ object is not callable

    sum() 으로 리스트 내의 요소들을 전부 더해주려고 했는데 아무리 돌려도 타입에러가 났는데,

    그럴 리가 없었다. sum(리스트 이름) 이면 요소 값이 전부 더해지는 건데,

    그리고 알아낸 게. for문 써서 합계 구하는 거 테스트 하고, 그 다음 리스트 컴프리헨션으로 어찌저찌 뭘 만들어보다가. sum 을 쓴 거였는데.

    for 문 구문 앞에 썼을 때 sum을 변수 명으로 썼었다…..

    예약어였지 하면서 total 로 바꿨지만 sum을 변수명으로 썼던 건 계속 남아있었으니…

    midterm_class_a = [70, 60, 55, 75, 95, 90, 80, 80, 85, 100]
    total = 0
    for i in midterm_class_a:
      total += i
    
    avg = total / len(midterm_class_a)
    print(avg)

    del sum

    으로 돌려주고,

    다시 돌리면 리스트 내의 요소들을 합칠 수 있었다.

    혹시나 해서… 포스팅…

  • AttributeError: ‘Series’ /’DataFrame’ object has no attribute ‘~’ /

    AttributeError: ‘Series’ /’DataFrame’ object has no attribute ‘~’ /

    AttributeError: ‘DataFrame’ object has no attribute ‘difference’ 혹은 AttributeError: ‘Series’ object has no attribute ‘difference’

    에러를 보고, 얼른 Pandas 라이브러리로 pd로 만들어서 어찌저찌 했는데도 여전히

    에러가 뜨길래 다시 확인해보니

    difference라는 변수명을 가진 열 자체가 없었다. 알고 보니!

    변수명을 만들어주어야 한다!

    data[‘difference’] = data[‘열 이름’] + data[‘열 이름’]

    이런 식으로 만들어주고 호출해주면 된다….고 생각했는데 value error가 떴다.

    ValueError: Data must be at least length 3.

    오… 이 부분은 data.diff로 호출하는지. 아니면 data[‘diff’]로 호출하는지에 따라서 에러가 나는 것 같다.

    data[‘해당 열 이름’]

    으로 호출해주면 돌아간다.

error: Content is protected !!