쌀국수가 코딩배우며 개발일기 쓰는곳 RSS 태그 관리 글쓰기 방명록
전체 글 (39)
2021-12-10 00:13:50

 

컴파일 용어

→ 사람의 말을 컴퓨터가 알아들을 수 있도록 하기 위한 과정들이 있다.

 

용어 설명
소스코드(Source Code) - 원시 코드
- 프로그래머에 의해 작성된 프로그램 문장들 (컴퓨터는 이해 못함)
- ex) test.c
컴파일(Compile) - 원시 코드를 목적 코드로 변환하는 작업
- Compiler = 변환 프로그램
오브젝트 코드(Object Code) - 목적 코드
- 소스 코드를 컴파일한 파일 (컴퓨터가 알아 볼 수 있음)
- ex) test.obj
어셈블리어(assembly language) - 컴퓨터와 일대일 대응이 가능한 언어
- 컴파일 된 파일을 어셈블리어 과정을 통해 기계어로 변환한다.
링크(Link(ing)) - 실행 가능한 형태인 모듈을 만들어내는 작업
- Linkage Editor = 처리 프로그램
로드 모듈(Load module) - 파티션에 저장된 실행 가능한 형태
- ex) test.exe
- Loader = 실행 파일을 메모리에 적재하여 CPU가 처리할 수 있도록 이동시켜주는 역할

 


 

대표 언어별 컴파일 과정

 

언어 컴파일 과정
C
- 조상격 언어, 컴파일(compile) 언어
- 운영체제끼리 호환이 되지 않아서 프로그램을 각 운영체제에 맞춰 짜야한다는 문제점이 있었다.
- 타 언어에 비해 어려운 편이지만 코드를 한 번에 번역하여 전달하는 구조라 속도가 빠르다.
- 시스템 프로그래밍에 잘 어울리는 언어이다.
- 그 외 참고자료
Python
- 인터프리터(Interpreter) 언어
- 중간 과정을 생략하고 인터프리터를 통해 소스코드를 한 줄씩 읽고 해석하며 실행한다.
- 코드가 간결하여 사용하기 쉽다.
- 그 외 참고자료
Java
- 객체 지향 언어
- 자바 가상 머신(JVM)을 사용하여 어느 운영체제에서도 같은 형태로 사용 가능
- Write Once, Run Anywhere
- 자바 컴파일러(javac)를 이용하여 컴파일 후 목적 코드를 만든다. (Test.class = byte code (반 기계어))
- JVM을 거쳐야 하는 문제로 C언어에 비해서 속도가 느리다.
- 그 외 참고자료

 

 

2021-12-07 02:11:00

 

프로그램을 왜 만들까?

→ 자료(Data)를 처리(Process) 해서 정보(Information)를 만들기 위해 (정보화를 하기 위해)

 

정보화

자료(Data) - 세상에 존재하는 모든 것
- 사물은 유형의 데이터이며 본능적인 행동은 직관적인 데이터이다.
처리(Process) - 연산, 수행
정보(Information) - 의사결정에 직접적 또는 간접적으로 영향을 주는 모든 것 (옳고 그름을 따지지 않음)
환원(Feedback) - 정보가 다시 데이터로 돌아가는 것 (정보는 영원하지 않음)
- 시간, 공간, 환경의 영향을 받아서 정보가 다시 데이터로 돌아간다.
✓ 자료의 처리를 더 효율적이고 빠르게 하기 위하여 컴퓨터를 만들었다. (전산화)
✓ 정보화가 전산화보다 더 큰 개념이다.
✓ 데이터가 있는데 모르는 것을 '데이터의 부재'라고 한다.
✓ 컴퓨터를 만들었으나 이진수밖에 하지 못하며 통역이 불가능하자 새로운 언어를 만든 것이 '프로그래밍 언어'이다.

 

원시인 마을과 공룡 이야기는 재밌었다!

 


 

정보화 속 파벌

과거, 정보화의 구조가 생기면서 파벌이 나누어졌다.

 

정보화 파벌
자료처리 (SE, NE, DBA, Security 등) 정보처리 (Programmer 등)

- 자료와 처리를 중요하게 여겼다.
- ex) 요리의 결과가 어떻던 재료가 좋아야 한다.

- 처리와 정보를 중요하게 여겼다.
- ex) 재료가 어떻던 맛있게 하면 된다.
✓ 2000년대 이후 두 파벌의 경계가 모호해지며 하나로 합쳐졌다.
✓ 디자이너와 개발자를 따로 채용하다가 퍼블리셔를 채용하는 개념과 비슷

 


 

체계화

 정보에서 더 발전한 영역을 뭐라 부르나요? 체계화가 맞나요?

 

체계화
사물인터넷(IOT) - 인터넷에 연결되어 IoT 애플리케이션이나 네트워크에 연결된 장치
- 사물이 데이터를 수집한다.
빅데이터(Big data) - 정형, 비정형 등 무수한 데이터들
- 데이터로부터 가치를 추출하고 결과를 분석하는 기술
클라우드(Cloud) - 무수한 데이터들을 수집했으니 저장하자!
지식(Knowledge) - 옳고 그름을 따지며 체계화된 정보를 얻기 위해 빅데이터를 모아 분석하여 나온 정보를 지식이라 한다. (아마도?)
기계학습(인공지능 / AI) - 사람이 가르쳐준 지식을 넘어선 새로운 지식들을 무한하게 만들어내기 위함
- 인공지능 의사 '왓슨(Watson)'이 이에 해당한다.
지혜(Wisdom) - 지식이 아무리 많아도 활용을 못하면 안 되므로 사람의 지혜가 필요하다.
✓ 대표적인 소셜커머스 업체인 쿠팡과 아마존은 빅데이터를 활용하여 엄청난 효율과 이익을 창출해냈다.
✓ 관련 기사 : https://www.ajunews.com/view/20170501000009164

 


 

언어의 정립

 세상에 데이터가 많지만 컴퓨터에게 알려주는 것은 불가능에 가까워 컴퓨터도 알고 있는 '숫자(이진수)'를 바탕으로 정립한다.

 

분류 자료형 타입 부가 설명 
기본 자료형 논리 boolean - True (0을 제외한 모든 수), False (0)
- Java에서는 참은 0000 0001, 거짓은 0000 0000 이다. (즉, 0과 1)
문자 char - ANSI 단체에서 아스키코드(ASCII code)를 정의했다.
- 아스키코드 = 7bit = 2^7 = 0~127 = 총 128개 (하나 남는 숫자는 통신 및 검증용)
- 하지만 서유럽의 문자 수는 127개보다 많기 때문에 ISO에 요청하였고, ISO는 비트를 늘려 서유럽코드(ISO-8859-1)를 정의했다.
- 서유럽코드 = 8bit = 2^8 = 0~255 = 총 256개
- 이후 중국의 천자문과 한국의 팔만대장경으로 인해 2byte로 늘어나며 문자의 표준인 유니코드(Unicode)가 생겼다.
- 유니코드 = 2byte = char = 16bit = 2^16 = 0~65535 = 총 65536개
정수 byte - Java에서 integer는 클래스(Wrapper) 타입이고, int는 원시형 자료이므로 헷갈리지 말자.
short
int
long
실수 float - 소수점 마지막 자리까지의 정밀한 데이터를 얻어내다 보니 자료형의 크기가 커진다.
double
참조 자료형 배열 [] - 동일한 자료형의 데이터들을 묶어놓은 자료 구조
- 구현이 쉽고 성능이 빠르다는 장점이 있다.
- 자료 삽입 및 삭제의 비효율성, 크기의 제약, 자료형의 제약, 메모리 재사용 불가 등의 단점이 있다.
크기의 제약 해결 배열은 생성할 때 지정한 크기를 바꿀 수 없기 때문에 적게 잡으면 공간 부족, 많이 잡으면 공간 낭비의 문제점이 있다.

→ Java의 무한 데이터를 통해서 해결한다. (Java Collection Framework)
→ C의 동적할당자료구조(Stack, Queue, Linked list, ・・・)를 활용한다.
자료형의 제약 해결 서로 다른 자료형을 같이 사용할 수 없다는 문제점이 있다.

→ C의 구조체를 활용한다. (구조체는 메모리를 따로 쓰기에 메모리 관리 문제를 해결할 아래의 방법이 등장한다.)
→ C++의 객체(Object)를 활용한다. (OOP)

- 관념적, 쌀국수가 먹고 싶다. (현재 내 앞에 쌀국수가 없다.) = 객체(Object)
- 쌀국수를 만드는 냄비 = 클래스(Class)
- 주문하여 만들어진 실제 쌀국수 = 개체(객체, Instance)

✓ 자료형과 관련된 내용은 아래 글에서 참고 바란다.

기본자료형의 종류(Primitive Data Types)

기본자료형 & 참조자료형

연산자와 제어문

 


 

저장의 필요성

학생 관리 프로그램을 만들어도 데이터가 저장되지 않으면 컴퓨터를 재부팅할 때마다 데이터가 초기화된다.

 

저장의 필요성
파일 저장(File I.O) - 파일에 데이터를 저장하면 동시 사용이 불가능하다는 단점이 있다.
데이터베이스(Database) - 여러 사람이 공유하며 사용할 목적으로 체계화해 통합 및 관리하는 데이터의 집합이다.
- 한 컴퓨터에 작업과 DB를 함께 두면 CPU와 메모리를 많이 잡아먹는다.
- 작업용 컴퓨터가 아닌 다른 컴퓨터에 DB를 설치하는것이 좋다. (한 여름에 음료 시원하게 마시려고 냉장고 들고다니지 말고 편의점가서 음료 사먹으라는 얘기)
네트워크(Network) - 분산되어 있는 컴퓨터(2대 이상)를 통신망으로 연결한 것.
스레드(Thread) - 컴퓨터는 하나의 작업밖에 처리하지 못하여 네트워크 사용의 어려움을 보완하기 위해 만들어졌다. (요리 하는 사람이 마트를 가면 주방이 비니까 다른 사람을 보내는 얘기)
- 모든 프로세스에는 하나 이상의 스레드가 존재하여 동시에 여러개의 작업을 처리한다.
예외처리(Exception) - 일반적으로 프로그램이 처리되는 동안 특정한 문제가 일어났을 때 처리를 중단하고 다른 처리를 하는 것 (마트로 심부름을 갔으나 재고 부족 등의 문제가 일어났을 때의 해결 방안을 만든다는 얘기)
✓ 연결 구조(? 작업과정 ?) : 파일 저장 → 예외처리 → 스레드 → 네트워크 → 데이터베이스
✓ 그 외 화면 만드는 과정 (잘 안쓰는 것들임) : 파일 → AWT(GUI) → Event → Graphics → Applet → Swing(JFC) → SWT → Java FX
2021-12-07 01:56:33

IT 산업

SI 업체 System 통합 (SDS 등의 업체가 있음)
- 전문 : 1인 파견
- 일반 : 팀 단위 파견
SM 업체 System Management (운영, 관리)
- 전문 : 솔루션 판매 / 파견
- 일반 : 솔루션만 판매 / 솔루션 개발자 양성 등
Agency 홈페이지 제작
- 공공기관(구청), 학교, 교회, 개인사업자 등

✓ SI에서 SM으로 갈 수 있지만 SM에서 SI로 가는건 어렵다. (SI는 다양한 분야를 하는데 SM은 분야가 정해져 있기 때문(?))

✓ 예산 및 프로젝트를 받아서 작업하는 과정 중 바쁜 시기는 6~8월이다. (채용 공고가 많이 올라옴)

 

초급 개발자 - 컴공과 4년제 졸업
- 정보처리 산업기사 이상 취득
- 평균 월급 186.4
중급 개발자 - 초급 이후 3년 경력 (Business Day(미근무일 제외))
- 컴퓨터 공학 석사
- 평균 월급 253.6
고급 개발자 - 중급 이후 3년 경력 (Business Day)
- 컴퓨터 공학 박사
- 평균 월급 336.4
특급 개발자 - 고급 이후 3년 경력 (Business Day)
- 평균 월급 436.5
2021-09-27 22:19:37

별찍기_기초

  j0 j1 j2 j3 j4
i0 * * * * *
i1 * * * * *
i2 * * * * *
i3 * * * * *
i4 * * * * *

 

위의 사진을 표로 나타내었다.

j는 하나의 별을 반복 출력 하기위한 내부 틀이며

ij를 몇 줄 출력할지 반복하기 위한 외부 틀이 될것이다.

 

#include <stdio.h>
int main()
{
    int i, j;

    for(i=0; i<5; i++) //외부 반복 틀 (총 5번 반복)
    {
        for(j=0;j<5;j++) //내부 반복 틀 (총 25번 반복(내부*외부))
        {
        printf("*");
        }
        printf("\n"); //내부 반복이 끝나면 한 줄 띄어쓰기
    }
    return 0;
}

별찍기_비스듬한 계단

  j0 j1 j2 j3 j4 j5
i0 * *        
i1 공백 * *      
i2 공백 공백 * *    
i3 공백 공백 공백 * *  
i4 공백 공백 공백 공백 * *

 

위의 표에서 규칙을 찾아보자.

공백 먼저 출력 후 별을 출력해야하는 규칙과,

공백은 0~4까지 순차적으로 늘어난다는 규칙을 알 수 있다.

그리고 아래 코드와같이 반복문 외부에서 변수를 출력할 일이 없을땐 반복문 초기식 안에서 변수를 선언해주어도 된다.

j, k는 i처럼 타 변수와 비교할 일이 없으므로 k를 j로 써줘도 되지만 헷갈릴까봐 변수 이름을 3개 사용했다.

 

#include <stdio.h>
int main()
{
    for(int i=0; i<5; i++) //총 5줄이 반복 출력된다.
    {
        for(int j=0; j<i; k++) //공백은 0부터 시작해서 i보다 작을때까지 반복한다. (i2(3번째 줄)면 j0,j1 2번 출력)
        {
            printf(" ");
        }
        for(int k=0; k<2; k++) //별은 k0, k1 두 번 출력을 반복한다.
        {
            printf("*");
        }
        printf("\n"); //내부 반복문들이 끝나면 한 줄 띄운다.
    }
}

별찍기_피라미드 (정방향)

  j0 j1 j2 j3 j4 j5 j6 j7 j8
i0 공백 공백 공백 공백 *        
i1 공백 공백 공백 * * *      
i2 공백 공백 * * * * *    
i3 공백 * * * * * * *  
i4 * * * * * * * * *

 

공백은 4~0순으로 감소하면 된다.

별의 규칙을 살펴보자. '1, 3, 5, 7, 9' 즉, 2씩 늘어난다.

처음엔 감을 못잡았다. '어떻게 i 값에 따라 첫줄에 1개만 쓰고 이후 2개씩 늘어나게 하지??' 하고..

i 값에 따라 늘어나야 하므로 아래와 같이 i*2+1을 해주었다.

*첫 줄은 별을 1개만 출력해야 하므로 i0일땐 0*2+1 = 1

 

#include <stdio.h>
int main()
{
    for(int i=0; i<5; i++) //외부 반복문 (5번 반복)
    {
        for(int j=0; j<5-i; j++) //공백 반복 (i0 = j<5-0 = 4번 반복)
        {
            printf(" ");
        }
        for(int k=0; k<i*2+1; k++) //별 반복 (i0 = k<0*2+1 = 0번 반복)
        {
            printf("*");
        }
        printf("\n"); //내부 반복이 끝나면 한 줄 띄어쓰기
    }
}

별찍기_피라미드 (역방향)

  j0 j1 j2 j3 j4 j5 j6 j7 j8
i0 * * * * * * * * *
i1 공백 * * * * * * *  
i2 공백 공백 * * * * *    
i3 공백 공백 공백 * * *      
i4 공백 공백 공백 공백 *        

 

정방향도 했는데 역방향은 쉽지 않을까? 했지만 내 머리로는 쉽지 않았다.

공백은 i 값과 동일하게 늘어나면 된다지만 별은..

별의 왼쪽이 n개가 없어지면 오른쪽도 n개가 없어진다. 또한 i의 값과 왼쪽, 오른쪽의 별이 사라지는 수는 동일하다.

별의 최대 출력수는 9개다. 고로 9개에서 i*2를 빼주면 된다.

 

#include <stdio.h>
int main()
{
    for(int i=0; i<5; i++) //외부 반복문
    {
        for(int j=0; j<i; j++) //공백 반복 (i2 = j<2 = j0,j1 = 2번 반복)
        {
            printf(" ");
        }
        for(int k=0; k<9-i*2; k++) //별 반복 (i2 = k<9-2*2 = k<5 = k0,k1,k2,k3,k4 = 5번 반복)
        {
            printf("*");
        }
        printf("\n"); //내부 반복이 끝나면 한 줄 띄어쓰기
    }
}

 

 

 

 

2021-09-15 23:26:27

오늘 아침에 백신을 맞고왔다. 어깨가 아프다.

그래도 풀었던 문제에 대한 글은 써야지..

 

입력은 2번 받고 출력은 4번 해야한다.

(3)은 472*5, (4)는 472*8, (5)는 472*3, (6)은 472*385

 

아하! 나머지와 나누기를 이용해서 385를 쪼개주자!

 

 

 

A = int(input())
B = int(input())
print((B%10)*A)
print(((B%100)//10)*A)
print((B//100)*A)
print(A*B)
  • 입력 1 : A를 입력받고 정수로 전환한다.
  • 입력 2 : B를 입력받고 정수로 전환한다.
  • 출력1 : 385를 10으로 나눈 값의 나머지 5를 472와 곱해준다! (385/10 = 38(몫)...5(나머지))
  • 출력2 : 385를 100으로 나눈 값의 나머지 85를 10으로 나누어 몫 8을 472와 곱해준다! (385/100 = 3...85) ▸ (85/10 = 8...5)
  • 출력3 : 385를 100으로 나눈 값의 몫 3을 472와 곱해준다! (385/100 = 3...85)
  • 출력4 : 385와 472를 곱해준다!

 

 

몸이 안좋아서 오늘은 이만 쉬어야겠다.

'코딩테스트 > 백준(Baekjoon)' 카테고리의 다른 글

[Baekjoon] 10430_나머지 (Python)  (0) 2021.09.14
[Baekjoon] 10869_사칙연산 (Python)  (0) 2021.09.14
[Baekjoon] 1008_A/B (Python)  (0) 2021.09.14
[Baekjoon] 10998_AxB (Python)  (0) 2021.09.14
[Baekjoon] 1001_A-B (Python)  (0) 2021.09.14
2021-09-14 22:15:59

문제에 답이 다 나와있군

 

input()으로 입력받은 문자열을 .split()을 이용해 공백으로 나눠준 후

리스트로 반환하여 각 변수에 저장해주고,

map을 이용해 한번에 int(정수)로 바꿔주는거야!

 

 

 

 

A, B, C = map (int, input().split())
print((A+B)%C)
print(((A%C)+(B%C))%C)
print((A*B)%C)
print(((A%C)*(B%C))%C)

'코딩테스트 > 백준(Baekjoon)' 카테고리의 다른 글

[Baekjoon] 2588_곱셈 (Python)  (0) 2021.09.15
[Baekjoon] 10869_사칙연산 (Python)  (0) 2021.09.14
[Baekjoon] 1008_A/B (Python)  (0) 2021.09.14
[Baekjoon] 10998_AxB (Python)  (0) 2021.09.14
[Baekjoon] 1001_A-B (Python)  (0) 2021.09.14