void swap(int *a, int *b){
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
return;
}
// 또는 더 간단하게
void swap(int *a, int *b){
*a += *b;
*b = *a - *b;
*a -= *b;
return;
}
1. 방법은 간편하지만 추가로 변수를 생성해야 한다는 단점이 존재하고 (메모리 관점에서 손해) 2. 방법과 3. 방법은 변수를 생성할 필요가 없지만, 사람이 직관적으로 이해하기에는 다소 무리가 있다는 단점이 있다. (가독성 측면에서 손해) 하지만 2. 방법에서는 xor이라는 생소한 개념을 사용하는 반면, 3. 에서는 우리에게 익숙한 + 연산을 사용하므로 구현하기에 무리가 없다.
c++에서 독립적인 함수를 만든다는 가정하에 void형 반환 타입과 포인터 변수를 사용했다.
만약 독립적인 함수가 아닌 다른 함수 내부에서 구현한다고 하더라도, 다음과 같이 a와 b 자리에 값을 바꾸고자 하는 변수를 위치시키면 된다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
int i;
cin >> n;
string number = to_string(n);
for (i = 0; i < number.length(); i++)
cout << number[i];
return 0;
}
string 헤더 include
to_string 메서드를 이용해 string 포인터에 전달 (to_string 함수는 string 객체를 반환)
* 단, 부동소수점 리터럴을 to_string 함수에 전달 시 값이 잘리는 문제 발생 가능
- 사용 예시 >
결과 >
앞의 0은 잘리고 나머지 1234만 출력되는 모습을 볼 수 있다.
2. string -> int로 변환 방법
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
int i;
cin >> n;
string number = to_string(n);
n = stoi(number);
cout << n;
return 0;
}
마찬가지로, string 헤더를 include 해주고
stoi 함수를 사용해준다. (string to int를 줄인 것)
3. 그럼 char -> int는?
char형을 int로 변환해주면, 일단 c++에서는 문자열은 string형을 쓰기 때문에 char을 int로 바꾼다는 건 보통 한 글자 내에서 연산이 이루어진다는 것이다.
따라서 char형을 int형에 저장하면 그 문자의 아스키코드값 ('1' -> 49)이 나오게 되는데, 여기서 그냥 '1'을 빼고 1을 더해 주면 된다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
int i;
cin >> n;
string number = to_string(n);
n = number[0] - '1' + 1;
cout << n;
return 0;
}
- 혹시나 해서 각 메서드들의 반환값의 표현형을 type() 메서드를 이용해 봤는데 다음과 같다.
만들기
- 리스트/튜플로도 딕셔너리를 만들 수 있다.
- dict.fromkeys() 메서드를 이용해 키 리스트로 딕셔너리를 만들 수 있다.
- 이때, 값을 지정하지 않으면 값은 모두 None이 된다.
# 리스트로 딕셔너리 만들기
keys = ['one', 'two', 'three', 'four']
x = dict.fromkeys(keys)
print(x) # {'one': None, 'two': None, 'three': None, 'four': None}
# 값을 지정했을 때
x = dict.fromkeys(keys, 100)
print(x) # {'one': 100, 'two': 100, 'three': 100, 'four': 100}
반복문 이용하기
- for 반복문 이용하기
# 모든 키 출력하기
x = {'one' : 1, 'two' : 2, 'three' : 3, 'four' : 4}
for i in x:
print(i, end = ' ')
# one two three four , 키만 출력됨.
# 키와 값 모두 출력하기
for key, value in x.items():
print(key, value)
# one 1
# two 2
# three 3
# four 4
# 같은 방법으로, 키만 출력하기
for key in x.keys():
print(key, end = ' ') # one two three four
# 값만 출력하기
for value in x.values():
print(value, end = ' ') # 1 2 3 4
word = 'python is great'
word.replace('python', 'c')
print(word) #c is great
- 만약 문자열이 일치하지 않는 경우 ->
word.replace('bython', 'c')
print(word) # python is great
=> 바꿀 문자를 찾지 못하고 그대로 출력된다.
응용 => 문자열 A가 있을시에 A를 문자열 B로 바꾸는 프로그램을 만들 때 A가 있는지부터 검사할 필요 없이 바로. replace('A', 'B') 하면 된다.
- 문자 바꾸기
- translate(str.maketrans('aeiou', '12345'))으로 사용.
- table = str.maketrans('aeiou', '12345')), apple.translate(table) 으로도 사용 가능.
word = 'python is great'
word.translate(str.maketrans('pt', '12'))
print(word) # 1y2hon is grea2
- 문자열 분리하기
'arr1'.split() 사용
# 그냥 빈칸만 있을 때 구분
'apple pear grape pineapple orange'.split()
# ['apple', 'pear', ..., 'orange']
# 컴마도 있을 때 구분
'apple, pear, grape, pineappple, orange'.split(', ')
# ['apple, 'pear', ..., 'orange']
- 문자열 연결하기
'문자열 사이 들어갈문자'.join(['arr1', 'arr2', ...]) 형태로 사용.
# 그냥 문자열을 합칠 때
' '.join(['apple', 'pear', 'grape', 'pineapple', 'orange'])
# 'apple pear grape pineapple orange'
# 문자열 사이에 특정 문자를 넣을 때
'-'.join(['apple', ..., 'orange'])
# 'apple-pear-grape-pineapple-orange'
- 소문자 -> 대문자 (모든 소문자는 대문자로, 대문자는 그대로)
.upper() 사용
'python'.upper()
# PYTHON
- 대문자 -> 소문자 (위의 규칙과 동일)
.lower() 사용
'PYTHON'.lower()
# python
- 좌우 특정 문자 삭제하기
# 문자 왼쪽에 있는 특정 문자 삭제
' python '.lstrip()
# 'python ', 왼쪽 공백만 삭제
# 문자 오른쪽 삭제
' python '.rstrip()
# ' python', 오른쪽 공백만 삭제
# 양쪽 문자 삭제
' python '.strip()
# 'python', 양쪽 공백 삭제
# 괄호 안에 특정 문자 넣어주면 해당 문자 삭제
# '문자열1'.strip(',.') 이면
# 문자열 양쪽에서 ','와 '.' 문자 삭제
- 문자열 정렬하기
ljust(길이) -> 좌측 정렬, 남는 공간 공백으로, 만약 길이가 현재 문자열 길이보다 짧으면 실행 x
rjust(길이) -> 우측 정렬
center(길이) -> 가운데 정렬, 남는 공백 길이가 홀수면 왼쪽에 공백 한 칸이 더 들어감
# 자릿수 앞에 0을 채워야 할 때
'35'.zfill(4)
# '0035'
# 그냥 문자열도 가능(당연하지만)
'hello'.zfill(10)
# '0000hello'
- 문자열 위치 찾기
특정 문자열의 인덱스를 찾을 때(왼쪽에서부터 찾음)
-> find('찾을 문자열')
오른쪽에서부터 찾을 때
-> rfind('찾을 문자열')
* 없을 시 -1 반환
또는
-> index('특정 문자열')
-> rindex('특정 문자열')
* 없을 시 에러 발생
- 문자열 개수 세기
count('특정 문자열')
- 문자열 만들기
1. 문자열 서식 지정자
2. 문자열 포메팅(f-string)
1 - 문자열 서식 지정자
# 문자열 넣기
'I am %s' % 'james' # 'I am james'
# 숫자 넣기
'This watch is %d dollars' # 'This watch is 5 dollars'
# 소숫점 표현하기
'%f' % 3.5 # '3.500000', 소숫점 이하 6자리까지 표현
'%.2f' % 3.5 # '3.50', .nf 형태 -> n자리까지 표현
# 문자열 정렬하기
'%10s' % 'python' # ' python'
# 왼쪽 정렬
'%-10s' % 'python' # 'python '
# 정수 자릿수 맞추기
'%5d' % 15 # ' 15'
'%5d' % 100 # ' 100'
# 소숫점으로 자릿수와 소숫점 이하 자릿수 표현하기
'%10.2f' % 2000.3 # ' 2000.30'
# 한 번에 여러 개 서식 지정자 사용하기
'Today is %d %s' % (3, 'April') # 'Today is 3 April'
2 - 문자열 포매팅
- 서식 지정자보다 더 간단한 방법이라는 문자열 포매팅이다.
- {} 안에 포매팅을 지정하고, format메서드로 값을 넣는다.
'hello, {0}'.format('world!') # 'hello, world!' 출력
# 이처럼 문자열 안에 {}을 넣고, 인덱스를 지정한다.
# format()부분에는 {}부분에 넣을 값을 지정한다.
# 값 여러 개 넣기
'Hello, {0} {2} {1}'.format('Python', 'Script', 3.6) # 'Hello, Python 3.6 Script'
'{0} {0} {1} {1}'.format('Python', 'Script') # 'Python Python Script Script'
# 인덱스 생략 -> 지정한 순서대로 값이 들어감
'Hello, {} {} {}'.format('Python', 'Script', 3.6) # 'Hello, Python Script 3.6'
# 또는 이름 지정 가능.
'Hello, {language} {version}'.format(language = 'Python', version = 3.6) # 'Hello, Python 3.6'
# Python 3.6부터는 앞에 f를 붙이고 중괄호 안에 바로 변수 입력 가능
language = 'Python'
version = 3.6
print(f'Hello, {language} {version}') # Hello, Python 3.6
# 문자열 정렬하기
print('{0:<10}'.format('Python')) # Python
# '{인덱스 : 방향 길이}'.format() 형식으로 작성
# 인덱스는 없을 시 생략 가능
# 숫자 개수 맞추기
# 1. 서식 지정자
print('%03d' % 15) # '015' , 문자열로 나옴
# 2. format메서드
print('{:03d}'.format(15)) # 015, 정수로 나옴
# 실수
print('{0:08.2f}'.format(150.37)) # 00150.37
# 결론 : format은 '{인덱스 : 채우기 정렬 길이 .자릿수}'.format 형식으로 사용.
print('{:0<10}'.format(15)) # 1500000000
# 팁, 금액에서 천 단위로 ','을 넣는 것을 format함수를 이용해 할 수 있다.
print(format(1493500, ',')) # 1,493,500