• 이번에는 기초 부분 중에서 특이한 부분만 언급하도록 하겠다.
  • 다른 언어와 완전히 동일한 기초 내용은 다루지 않는다.

 

논리 연산자

  • and, or, not 연산자가 &&, ||, ! 형태로 사용되지 않고 and, or, not 표현 그대로 사용된다.

 

[Source Code]

print(True and True)
print(True and False)
print(False and False)

print(True or True)
print(True or False)
print(False or False)

print(not True)
print(not False)

 

[결과]

True
False
False
True
True
False
False
True

Process finished with exit code 0

 

 

음수 인덱스 사용

  • 특이하게, 시퀀스 자료형에서 인덱스로 음수를 사용할 수 있다.

 

[Source Code]

sequenceData = “This is sequence data!!”

print(sequenceData[1])
print(sequenceData[-1])
print(sequenceData[-33])

 

[결과]

h
!
a

Process finished with exit code 0

 

 

슬라이싱

  • 시퀀스 자료형에서 슬라이싱을 통해 특정 범위의 값만 다시 시퀀스로 가져올 수 있다.
  • 변수명[여기] <- 여기에 자를 범위를 인덱스로 설정해주면 된다.
    • 시작:끝 -> 시작 ~ 끝전까지
    • :끝 -> 처음부터 명시된 곳 전까지
    • 시작: -> 명시된 곳부터 끝까지
    • ::숫자 -> 해당 숫자 간격으로 잘라서 하나씩 가져옴
  • 마찬가지로 음수 인덱스를 사용할 수 있다.

 

[Source Code]

sequenceData = “This is sequence data!!”

cutData = sequenceData[5:7]
print(cutData)
cutData = sequenceData[:4]
print(cutData)
cutData = sequenceData[-6:]
print(cutData)
cutData = sequenceData[::3]
print(cutData)

 

[결과]

is
This
data!!
Tsseeea!

Process finished with exit code 0

 

 

+ 연산자로 시퀀스 자료형 합치기

  • String 뿐만 아니라 다른 시퀀스 자료형도 +로 합칠 수 있다.

 

[Source Code]

array1 = [1,2,3]
array2 = [4,5,6]
print(array1 + array2)

 

[결과]

[1, 2, 3, 4, 5, 6]

Process finished with exit code 0

 

 

* 연산자로 시퀀스 자료형 반복

  • sequence * n 형태로 자료형을 반복해서 새로운 시퀀스를 만들 수 있다.

 

[Source Code]

array1 = [1,2,3]
print(array1 * 3)

 

[결과]

[1, 2, 3, 1, 2, 3, 1, 2, 3]

Process finished with exit code 0

 

 

in으로 시퀀스 안에 해당 값이 들어있는지 파악하기

  • in을 통해 간단하게 시퀀스 안에 해당 값이 있는지를 파악할 수 있다.
  • 값 in 시퀀스 형태로 사용할 수 있다.
  • 해당 구문은 Boolean 형태의 결과로 동작한다.

 

[Source Code]

array1 = [1,2,3]
print(1 in array1)
print(5 in array1)

if 2 in array1:
    print('2가 array 안에 있습니다.')

 

[결과]

True
False
2가 array 안에 있습니다.

Process finished with exit code 0

 

 

문자열 안에 변수 출력하기

  • print할 때 문자열 안에 변수를 함께 출력할 수 있다.
  • C언어의 printf와 비슷하다.
  • %c(캐릭터), %s(String), %f(실수), %d(정수), %%(그냥 %) 를 사용할 수 있다.
  • print(‘%x’,%(변수명)) 형태로 뒤에 %를 쓰고 괄호 안에 변수 명을 적어준다.
  • 변수를 여러개 출력할 경우, 뒤에 %(변수명1, 변수명2, …) 형태로 사용하면 된다.

 

[Source Code]

str = '파이썬'
num1 = 123
num2 = 111
num3 = 3.141592

print('이것은 %s 예제입니다.' %(str))
print('%d + %d는 %d입니다.' %(num1, num2, num1+num2))
print('파이는 %f입니다.' %(num3))

 

[결과]

이것은 파이썬 예제입니다.
123 + 111는 234입니다.
파이는 3.141592입니다.

Process finished with exit code 0

'Python' 카테고리의 다른 글

Python 기초 2  (0) 2019.06.10
Python 기초 1  (0) 2019.06.09
파이썬 함수 사용  (0) 2017.05.03
파이썬 변수 사용  (0) 2017.05.03
파이썬 문자열 출력  (0) 2017.05.03

중괄호 대신 들여쓰기

  • python에서는 중괄호 대신에 들여쓰기로 블럭을 구분한다.
  • if문, 함수 등등 중괄호를 사용하는 것들에 대해 들여쓰기를 사용한다.
  • 만약 들여쓰기를 제대로 맞추지 않고, 덜 들여쓰거나 더 들여쓰면 에러가 발생하게 된다.
  • 다른 프로그래밍 언어를 생각할 때, 들여쓰기를 한다면 중괄호를 연 것이고 한칸 들여쓰기를 덜 한다면 중괄호를 닫은 것으로 생각하면 된다. 갑자기 중괄호를 닫거나 열면 에러가 나는 것이니까 동일하게 생각하면 된다.
  • main 부분 코드의 시작은 들여쓰기가 되지 않은 상태여야 한다.

 

[Source Code]

data = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]

if ‘e’ in data:
    print(‘data에서 e를 찾았습니다.’)
else:
    print(‘e가 data에 없습니다.’)

 

[결과]

data에서 e를 찾았습니다.

Process finished with exit code 0

 

 

조건문

  • 조건문의 기본 개념과 동작 원리는 다른 언어들과 비슷하다.
  • 특이한 점은 조건문의 조건을 작성할 때, 괄호를 사용하지 않는다는 점이다. 이는 swift와 비슷하다고 보면 된다.
  • 중괄호가 없기 때문에 조건 뒤에는 콜론(:)을 붙여주며, 조건문의 블록에 해당하는 부분에는 들여쓰기를 적용해주어야 한다.
  • else if의 경우는 python에서는 elif로 사용한다.

 

[Source Code]

a = 7
b = 2

if a/b == 2:
    print('a/b는 2입니다.')
elif a/b == 3:
    print('a/b는 3입니다.')
else:
    print('a/b는 2가 아닙니다.')

 

[결과]

a/b는 3입니다.

Process finished with exit code 0

 

 

반복문 - for문

  • for문의 경우도 C언어보다 높은 레벨의 다른 프로그래밍 언어들과 비슷하다.
  • for-in 구문을 사용할 수 있고, continue와 break도 사용할 수 있다.
  • for 변수 in 범위 형태로 사용할 수 있다.
  • 위에 언급한 범위로 사용할 수 있는 항목들은 다음과 같다.
    • 문자열
    • 리스트/튜플/딕셔너리
    • range()
    • 반복 가능한 객체
  • 특이한 문법으로는 for-else문이 있는데, 이는 밑에서 따로 다루도록 하겠다. 우선 기본 예제만 작성해보았다.

 

[Source Code - 1]

str = ‘plus lab python’
for character in str:
    print(character)

 

[결과 - 1]

p
l
u
s

l
a
b

p
y
t
h
o
n

Process finished with exit code 0

 

[Source Code - 2]

for num in range(10):
    print(num)

 

[결과 - 2]

0
1
2
3
4
5
6
7
8
9

Process finished with exit code 0

 

[Source Code - 3]

numSet = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

for num in numSet:
    if num%2 == 0:
        continue
    elif num > 8:
        break
    print(num)

 

[결과 - 3]

1
3
5
7

Process finished with exit code 0

 

 

for-else문

  • for문 안에서 break가 동작하지 않고, for문이 모두 끝난 후에 else문에 있는 코드가 실행되는 특이한 구문이다.

 

[Source Code - 1]

# for문에서 break가 동작했을 때
numSet = [1, 2, 3, 4, 5, 6, 7, 8]

for num in numSet:
    if num > 5:
        break
else:
    print(‘break문 동작하지 않음’)

 

[결과 - 1]

Process finished with exit code 0

 

[Source Code - 2]

# for문이 break가 동작하지 않았을 때
numSet = [1, 2, 3, 4, 5]

for num in numSet:
    if num > 5:
        break
else:
    print('break문 동작하지 않음')

 

[결과 - 2]

break문 동작하지 않음

Process finished with exit code 0

 

 

반복문 - while문

  • while문도 다른 언어들과 비슷하다.
  • for문과 마찬가지로 continue와 break를 사용할 수 있다.

 

[Source Code]

# 1~10까지의 합을 구해보자
num = 1
result = 0

while num <= 10:
    result += num
    num += 1

print(result)

 

[결과]

55

Process finished with exit code 0

'Python' 카테고리의 다른 글

Python 기초 3  (0) 2019.06.11
Python 기초 1  (0) 2019.06.09
파이썬 함수 사용  (0) 2017.05.03
파이썬 변수 사용  (0) 2017.05.03
파이썬 문자열 출력  (0) 2017.05.03

기본 출력, 변수 설정

  • print 함수는 일반적인 사용 방법과 비슷하다.
  • String을 지정할 때 특이한 게 쌍따옴표(“)가 아닌, 일반 따옴표(')를 사용한다.
  • 변수를 설정할 때 var나 let을 사용하지 않고 바로 사용하면 자동 선언과 동시에 값이 할당된다.

[Source Code]

print('Hello World')
print('String은 작은 따옴표로!')
a = 1
b = 2
print(a + b)
print('var나 let을 사용하지 않아도 변수 출력 가능')

 

[결과]

Hello World
String은 작은 따옴표로!
3
var나 let을 사용하지 않아도 변수 출력 가능

Process finished with exit code 0

 


변수 작명

  • 파이썬의 변수명 규칙은 다른 언어와 비슷하다.
  • 변수명의 첫 글자는 영문자나 언더바(_)로 시작해야 한다.
  • 변수명은 대소문자를 구분한다.
  • 예약어(if, while, for, def, class 등등..)는 변수명으로 사용할 수 없다.
  • 특이한 점은 파이썬의 기본 라이브러리 함수명을 변수명으로 선언하게 되면, 선언은 할 수 있지만 해당 함수를 사용할 수 없게 된다.

[Source Code 1]

print(abs(-1))

 

[결과 1]

1

Process finished with exit code 0

 

[Source Code 2]

abs = 3
print(abs(-1))

 

[결과 2]

Traceback (most recent call last):
  File "XXXXXXXXXX", line 4, in <module>
    print(abs(-1))
TypeError: 'int' object is not callable

Process finished with exit code 1
기본 함수를 변수명으로 선언하게 되면 사용은 가능하지만 기존 함수를 사용하려고 한다면 위와 같이 에러가 발생한다.

 

 

 

변수 생성

  • C/C++ 언어와는 다르게 변수의 타입을 지정해주지 않아도 된다.
  • 심지어 Kotlin, Swift처럼 var, let을 사용하지 않아도 변수를 선언할 수 있다.
  • 변수에 값을 대입해주면 해당 변수의 타입이 알아서 정해진다.
  • Swift는 var를 사용하여 선언했어도 타입이 한 번 정해지면 다른 타입을 저장하지는 못 하지만, 파이썬의 경우는 처음에 정수를 받았지만 나중에 string을 넣는 것도 가능하다.

[Source Code]

num = 3
print(num)
num += 1
print(num)
num = ‘hello num’
print(num)

 

[결과]

3
4
hello num

Process finished with exit code 0

 


주석

  • 파이썬에서는 주석을 ‘#’으로 처리한다.
  • 여러줄을 주석처리할 때는 쌍따옴표(“)를 세번(“””)사용해서 시작과 끝을 지정해서 처리해준다.

[Source Code]

# 주석 부분!!
num = 3
print(num)
“”” 이 사이는 통째로 주석
num += 1
print(num)
“””
num = ‘hello num’
print(num)

 

[결과]

3
hello num

Process finished with exit code 0

 

'Python' 카테고리의 다른 글

Python 기초 3  (0) 2019.06.11
Python 기초 2  (0) 2019.06.10
파이썬 함수 사용  (0) 2017.05.03
파이썬 변수 사용  (0) 2017.05.03
파이썬 문자열 출력  (0) 2017.05.03

문제 : https://www.acmicpc.net/problem/2747


#include <stdio.h>
 
int nums[46];
 
int get(int n) {
    if(n<=0return 0;
    else if(nums[n] != 0return nums[n];
 
    nums[n] = get(n-1+ get(n-2);
    return nums[n];
}
 
int main(void) {
    int n;
    scanf("%d"&n);
    nums[1= 1;
 
    printf("%d\n", get(n));
 
    return 0;
}
cs


'C & C++ > Baekjoon' 카테고리의 다른 글

백준 1463 - 1로 만들기  (0) 2017.12.29
백준 10430 - 나머지  (0) 2017.12.28
백준 10172 - 개  (0) 2017.12.27
백준 9498 - 시험 성적  (0) 2017.12.27
백준 8958 - OX퀴즈  (0) 2017.12.27

Selection Sort (선택 정렬)

[예시 코드]
#include <cstdio>
#include <cstdlib>
 
using namespace std;
 
void selection_sort(int *nums, int N) {
    int min, min_idx;
    
    for(int i=0; i<N-1; i++) {
        min_idx = i;
        min = nums[i];
        for(int j=i+1; j<N; j++) {
            if(min > nums[j]) {
                min = nums[j];
                min_idx = j;
            }
        }
        nums[min_idx] = nums[i];
        nums[i] = min;
    }
}
 
int main(void) {
    int N, *nums;
    scanf("%d"&N);
 
    nums = (int*)malloc(sizeof(int)*N);
 
    for(int i=0; i<N; i++)
        scanf("%d"&nums[i]);
 
    selection_sort(nums, N);
 
    for(int i=0; i<N; i++)
        printf("%d ", nums[i]);
 
    printf("\n");
 
    free(nums);
 
    return 0;
}
cs


[내용]

N개의 숫자를 정렬할 때, index를 0~N-2 에서부터 N-1 까지 보면서, 가장 작은 수를 선택해서 맨 앞과 바꿔주면서 정렬해 나가는 방식이다.

맨 처음부터 마지막 중 가장 작은 수를 찾아서 첫 번째와 바꿔주고,

두 번째부터 마지막 중 가장 작은 수를 찾아서 두 번째와 바꿔주는 식으로 진행한다.


[특징]

- 비교 연산이 많이 사용된다.

- 값을 실제로 교환하는 횟수는 상대적으로 적다.



Bubble Sort (버블 정렬)

[예시 코드]

#include <cstdio>
#include <cstdlib>
 
using namespace std;
 
void bubble_sort(int *nums, int N) {
    int temp;
 
    for(int i=0; i<N-1; i++) {
        for(int j=1; j<N-i; j++) {
            if(nums[j-1> nums[j]) {
                temp = nums[j-1];
                nums[j-1= nums[j];
                nums[j] = temp;
            }
        }
    }
}
 
int main(void) {
    int N, *nums;
    scanf("%d"&N);
 
    nums = (int*)malloc(sizeof(int)*N);
 
    for(int i=0; i<N; i++) {
        scanf("%d"&nums[i]);
    }
 
    bubble_sort(nums, N);
 
    for(int i=0; i<N; i++)
        printf("%d ", nums[i]);
 
    printf("\n");
 
    free(nums);
 
    return 0;
}
cs



[내용]

앞쪽부터 뒷쪽까지 2개의 숫자씩을 비교해가며, 오른쪽이 더 작은 경우 값을 교환해준다.

이를 N번 진행하면 전체 숫자의 정렬이 완료된다.


[특징]

- 비교와 값의 교환이 많이 발생한다.



Insertion Sort (삽입 정렬)

[예시 코드]
#include <cstdio>
#include <cstdlib>
 
using namespace std;
 
void insertion_sort(int *nums, int N) {
    int t, idx;
 
    for(int i=1; i<N; i++) {
        t = nums[i];
        idx = i;
        while(nums[idx-1> t && idx > 0) {
            nums[idx] = nums[idx-1];
            idx--;
        }
        nums[idx] = t;
    }
}
 
int main(void) {
    int N, *nums;
    scanf("%d"&N);
 
    nums = (int*)malloc(sizeof(int)*N);
 
    for(int i=0; i<N; i++) {
        scanf("%d"&nums[i]);
    }
 
    insertion_sort(nums, N);
 
    for(int i=0; i<N; i++)
        printf("%d ", nums[i]);
 
    printf("\n");
 
    free(nums);
 
    return 0;
}
cs


[내용]

idx를 1부터 N-1까지 실행하며, 해당 인덱스에 있는 숫자를 그 앞쪽에서 맞는 위치에 삽입해준다.


[특징]

- 다른 정렬 알고리즘들에 비해서빠른 편이다.

- 정렬해야 할 숫자의 개수가 적은 경우에 유용하다.



Indirection을 이용한 Insertion Sort (삽입 정렬)

[예시 코드]

#include <cstdio>
#include <cstdlib>
 
using namespace std;
 
void insertion_sort(int *nums, int *idx, int N) {
    int t, tIdx;
 
    for(int i=0; i<N; i++)
        idx[i] = i;
 
    for(int i=1; i<N; i++) {
        t = idx[i];
        tIdx = i;
        
        while(nums[idx[tIdx-1]] > nums[t] && tIdx > 0) {
            idx[tIdx] = idx[tIdx-1];
            tIdx--;
        }
 
        idx[tIdx] = t;
    }
}
 
int main(void) {
    int N, *nums, *idx;
    scanf("%d"&N);
 
    nums = (int*)malloc(sizeof(int)*N);
    idx = (int*)malloc(sizeof(int)*N);
 
    for(int i=0; i<N; i++) {
        scanf("%d"&nums[i]);
    }
 
    insertion_sort(nums, idx, N);
 
    for(int i=0; i<N; i++)
        printf("%d ", nums[idx[i]]);
 
    printf("\n");
 
    free(nums);
    free(idx);
 
    return 0;
}
cs


[내용]

- Insertion Sort에서 값을 하나씩 복사시키지 않고, 인덱스용 배열을 따로 생성하고 인덱스만 정렬한다.


[특징]

- 원래 값이 있는 배열은 자료가 변하지 않고 그대로 유지된다.

- sorting된 순서대로 접근하려면, 인덱스 배열을 순서대로 접근하며 이를 인덱스로 사용하여 숫자 배열을 사용하면 된다.



Shell Sort (쉘 정렬)

[예시 코드]

#include <cstdio>
#include <cstdlib>
 
using namespace std;
 
void shell_sort(int *nums, int N) {
    int v, k;
 
    for(int h = N/2; h>0; h/=2) {
        for(int i=0; i<h; i++) {
            for(int j=i+h; j<N; j+=h) {
                v = nums[j];
                k = j;
                while(k > h-1 && nums[k-h] > v) {
                    nums[k] = nums[k-h];
                    k -= h;
                }
                nums[k] = v;
            }
        }
    }
}
 
int main(void) {
    int N, *nums;
    scanf("%d"&N);
 
    nums = (int*)malloc(sizeof(int)*N);
 
    for(int i=0; i<N; i++)
        scanf("%d"&nums[i]);
 
    shell_sort(nums, N);
 
    for(int i=0; i<N; i++)
        printf("%d ", nums[i]);
 
    printf("\n");
 
    free(nums);
 
    return 0;
}
cs


[내용]

- 기본적인 접근법은 insertion sort와 동일하다.

- h는 스텝 사이즈이다.

- 처음부터 2개씩 비교를 하는 것이 아니라, 스텝 사이즈만큼 떨어트려서 있는 것들끼리만 비교하여 insertion sort 방식으로 정렬을 하고, 스텝 사이즈를 줄이며 이를 반복한다.




[특징]

- 정렬하려는 숫자의 개수와 관계 없이 속도가 빠른 편이다.

- 추가적인 메모리가 필요하지 않다.



Quick Sort (퀵 정렬)

[예시 코드]

#include <cstdio>
#include <cstdlib>
 
void quick_sort(int *nums, int N) {
    int i, j, v, temp;
 
    if(N > 1) {
        v = nums[N-1];    // Pivot
        i = -1;
        j = N-1;
 
        while(true) {
            while(nums[++i] < v);
            while(nums[--j] > v);
 
            if(i >= j)
                break;
 
            temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }
 
        temp = nums[i];
        nums[i] = nums[N-1];
        nums[N-1= temp;
 
        quick_sort(nums, i);
        quick_sort(nums+i+1, N-i-1);
    }
}
 
int main(void) {
    int N, *nums;
    scanf("%d"&N);
 
    nums = (int*)malloc(sizeof(int)*N);
 
    for(int i=0; i<N; i++)
        scanf("%d"&nums[i]);
 
    quick_sort(nums, N);
 
    for(int i=0; i<N; i++)
        printf("%d ", nums[i]);
 
    printf("\n");
 
    free(nums);
 
    return 0;
}
cs


[내용]

- quick sort는 나눠서 정렬하는 것이다.

- 인덱스 i는 왼쪽에서 오른쪽으로, 인덱스 j는 오른쪽에서 왼쪽으로 이동한다.

- 우선, 현재 주어진 숫자 배열의 범위에서 가장 오른쪽에 있는 값을 pivot으로 설정한다.

- 인덱스 i를 오른쪽으로 이동하며 가장 먼저 나오는 pivot보다 큰 값의 인덱스까지 이동한다.

- 인덱스 j는 왼쪽으로 이동하며 가장 먼저 나오는 pivot보다 작은 값의 인덱스까지 이동한다.

- 만약에 i가 j의 오른쪽에 있다면 (i와 j가 이동하다가 서로 지나쳤다면) 그만하고, 그렇지 않으면 계속하여 i와 j를 구해서 서로 값을 바꿔준다.

- 이렇게 하면 현재 i가 있는 곳을 기준으로 왼쪽은 pivot보다 작은 값들이, 오른쪽은 pivot보다 큰 값들이 위치하게 된다.

- recursion으로 현재 i보다 왼쪽과 오른쪽을 각각 한번씩 호출해준다.

- 다 끝나고나면 정렬이 된다.

- cf. recursion termination 조건은 if(N > 1)이다. (N이 1이 되면 종료)


[특이 사항]

- 이미 정렬된 경우에는 별로 좋지 않기 때문에 pivot을 랜덤으로 지정해주는 방법도 있다.

- 간격이 클 때는 quick sort를 사용하고, 작으면 insertion sort를 사용하여 병행하는 방법도 있다.




'C & C++ > Reference' 카테고리의 다른 글

C/C++ - 파일 입출력  (0) 2018.04.05
C++ string 정리  (3) 2018.01.23

+ Recent posts