♨_♨

1️⃣ 포맷문자열(%x)(%02x)

포맷 문자열 %x%02x는 모두 정수를 16진수로 표현하는 데 사용됩니다. 그러나 이들의 차이점은 출력 결과의 형식입니다.

%x는 주어진 정수를 16진수로 변환하고 출력하는데, 만약 변환된 16진수가 한 자리 수라면 그대로 출력됩니다. 예를 들어, 정수 10은 16진수로 'a'로 표현되며, %x 포맷 문자열을 사용하면 'a'가 출력됩니다.

반면에 %02x는 주어진 정수를 16진수로 변환하고 출력하는데, 변환된 16진수가 한 자리 수라면 앞에 0을 붙여 두 자리로 표현합니다. 따라서, 정수 10은 16진수로 '0a'로 표현되며, %02x 포맷 문자열을 사용하면 '0a'가 출력됩니다.

  • example
number = 10
print("%x" % number)   # 출력: a
print("%02x" % number) # 출력: 0a

따라서, %x와 %02x는 동일한 값을 16진수로 표현하지만 출력 결과의 자릿수가 다르다는 점에서 차이가 있습니다.


b1=bin(97)
b2=bin(98)
ret1=b1+b2
print(ret1)
print(type(ret1))


a=int(b1,2)
b=int(b2,2)
ret2=a+b
print(ret2)
print(bin(ret2))

🧡 a=int(b1,2) 가뭐야 ?

a=int(b1,2)는 문자열로 표현된 이진수인 b1을 십진수로 변환하는 과정입니다.

bin(97)은 정수 97을 이진수로 표현한 문자열을 반환합니다. 따라서 b1의 값은 '0b1100001'입니다. 여기서 '0b'는 이진수를 나타내는 접두사입니다.

int(b1, 2)는 문자열 b1을 이진수로 해석하여 해당하는 십진수 값을 반환합니다. 두 번째 인자로 2를 전달하여 이진수임을 명시합니다. 이 경우 int(b1, 2)는 문자열 '0b1100001'을 이진수로 해석하여 정수 값 97을 반환합니다.

따라서, a=int(b1,2)는 이진수 문자열인 b1을 십진수로 변환하여 변수 a에 할당하는 것을 의미합니다.


bnum = 0b11110000  # 이진수 (2진수)
bstr = '0b111100000'  # 이진수 문자열 (2진수)

onum = 0o360  # 8진수
ostr = '0o360'  # 8진수 문자열

hnum = 0xf0  # 16진수
hstr = '0xf0'  # 16진수 문자열

b1 = int(bnum)  # 이진수를 십진수로 변환
b2 = int(bstr, 2)  # 이진수 문자열을 십진수로 변환

o1 = int(onum)  # 8진수를 십진수로 변환
o2 = int(ostr, 8)  # 8진수 문자열을 십진수로 변환

h1 = int(hnum)  # 16진수를 십진수로 변환
h2 = int(hstr, 16)  # 16진수 문자열을 십진수로 변환

print(b1)  # 출력: 240
print(b2)  # 출력: 480
print(o1)  # 출력: 240
print(o2)  # 출력: 240
print(h1)  # 출력: 240
print(h2)  # 출력: 240

각 변수에 할당된 값을 int() 함수를 사용하여 해당 진법에 맞게 십진수로 변환할 수 있습니다. int() 함수의 두 번째 인자로 진법을 지정하면 해당 진법으로 해석됩니다. 예를 들어, int(bstr, 2)에서 두 번째 인자로 2를 전달하여 이진수임을 명시했습니다. 따라서 '0b111100000'은 이진수로 해석되어 십진수 값 480을 반환합니다.

마지막으로, 각 변수의 값을 출력하면 해당 값을 십진수로 변환한 결과가 출력됩니다.


2️⃣filter()

🧡소수 구하기(1)

def getPrime(x):
    if x % 2 == 0:
        return

    for i in range(3, int(x/2), 2):
        if x % i == 0:
            break
    else:
        return x

listdata = [117, 119, 1113, 11113, 11119]
ret = filter(getPrime, listdata)
print(list(ret))  # 출력: [11113, 11119]

getPrime 함수는 주어진 숫자 x가 소수인지 확인하는 함수입니다. 함수 내부에서는 다음과 같은 절차를 따릅니다:

x가 짝수인 경우, 즉 x % 2 == 0인 경우 함수에서 바로 리턴합니다. 짝수는 소수가 될 수 없기 때문입니다.
x가 홀수인 경우, for 루프를 사용하여 3부터 x/2까지 홀수만 확인합니다. 이 범위에서 숫자를 나누어 나머지가 0인지 확인합니다.
만약 어떤 숫자 i로 x를 나누었을 때 나머지가 0인 경우, x는 소수가 아니므로 루프를 중단합니다.
소수인 경우, 루프를 모두 거치고 else 절에 도달하여 x를 반환합니다.
listdata 리스트의 각 요소에 대해 getPrime 함수를 적용하여 소수인 요소만 필터링하여 결과 리스트를 생성합니다. filter() 함수를 사용하여 getPrime 함수를 listdata의 각 요소에 적용하고, list() 함수를 사용하여 필터링된 결과를 리스트로 변환합니다.

최종적으로, listdata에서 소수인 요소들만 출력합니다.

output:

[11113, 11119]

🧡소수 구하기(2)

def getPrime(n):
    ret=[2]
    if n<=2:
        return ret
    
    for i in range(3,n+1,2):
        for k in range(3,int(i/2),2):
            a=i%k
            if a==0:
                break
        else:
            ret.append(i)
    return ret

ret=getPrime(10)
print(ret)

3부터 n까지의 홀수에 대해 소수를 판별하는 for 루프입니다. range(3, n + 1, 2)는 3부터 n까지 2씩 증가하는 홀수 범위를 나타냅니다.
내부 for 루프에서는 3부터 i/2까지의 홀수에 대해 i를 나누어 나머지를 계산합니다.
a가 0인 경우, 즉 i가 k로 나누어 떨어진다면 i는 소수가 아니므로 내부 for 루프를 break하여 종료합니다.
내부 for 루프가 정상적으로 종료되었다면, i는 소수로 판별되어 ret.append(i)를 통해 ret 리스트에 i 값을 추가합니다.

🧡 짝수 확인하기

def is_even(n):
    return n % 2 == 0

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

filtered_numbers = filter(is_even, numbers)
even_numbers = list(filtered_numbers)

print(even_numbers)

위의 예시 코드에서 is_even 함수는 주어진 숫자가 짝수인지 확인하는 함수입니다. filter() 함수를 사용하여 is_even 함수를 numbers 리스트의 각 요소에 적용합니다. filter() 함수는 is_even 함수의 결과가 True인 요소들로 이루어진 이터레이터를 반환합니다.

filter() 함수의 결과를 리스트로 변환하기 위해 list() 함수를 사용하여 filtered_numbers를 리스트인 even_numbers로 변환합니다.

output:

[2, 4, 6, 8, 10]

3️⃣ & 연산자

a=107
b=a&0x0f
print(b)

c=(a>>4)&0x0f
print(c)

& 연산자를 사용하여 a와 0x0f (16진수로 표현된 15)를 비트 단위논리 AND 연산합니다.
0x0f는 4비트에서 하위 4비트가 1로 설정된 값입니다.
a의 이진 표현과 0x0f의 이진 표현에서 같은 위치의 비트를 비교하고, 둘 다 1인 경우에만 결과의 해당 비트는 1이 됩니다.
따라서, b는 a의 하위 4비트에 해당하는 값이 됩니다.

a 변수를 오른쪽으로 4비트 시프트하여 값을 계산합니다.
연산자는 이진수를 오른쪽으로 지정된 비트 수만큼 이동시킵니다.
이동된 비트는 버려지고, 왼쪽에는 0이 추가됩니다.
(a >> 4)는 a의 이진 표현을 오른쪽으로 4비트 이동시킨 값을 나타냅니다.
그 다음, & 연산자를 사용하여 이동된 결과와 0x0f를 비트 단위로 논리 AND 연산합니다.
결과적으로 c는 a의 상위 4비트에 해당하는 값이 됩니다.
c를 출력합니다.

따라서, 위의 코드는 107를 이진수로 표현했을 때의 하위 4비트인 11을 b에 저장하고 출력하며, 상위 4비트인 0110을 c에 저장하고 출력합니다.


4️⃣ 문자열 슬라이싱

🧡 [::2]vs[:2]

문자열의 슬라이싱에서 ::2:2는 서로 다른 동작을 합니다.

::2: 이 표현은 문자열의 처음부터 끝까지 전체 문자열을 선택하되, 스텝(step) 값을 2로 설정하여 2칸씩 건너뛰며 선택하는 것을 의미합니다. 즉, 문자열에서 홀수 인덱스(0을 기준으로 홀수 번째)에 해당하는 문자들만 선택하여 반환합니다.
:2: 이 표현은 문자열의 시작부터 1번 인덱스(두 번째 문자)까지 선택하는 것을 의미합니다. 슬라이싱의 끝 인덱스가 포함되지 않으므로, 0번 인덱스와 1번 인덱스에 해당하는 두 개의 문자가 선택되어 반환됩니다.

예를 들어, 문자열이 'Hello, World!'인 경우:

'Hello, World!'[::2]는 'Hlo ol!'를 반환합니다. 시작부터 끝까지 스텝 2로 선택하므로 홀수 인덱스에 해당하는 문자들이 선택됩니다.
'Hello, World!'[:2]는 'He'를 반환합니다. 시작부터 1번 인덱스까지 선택하므로 0번 인덱스와 1번 인덱스에 해당하는 'H'와 'e'가 선택됩니다.
따라서, ::2와 :2는 문자열의 슬라이싱 동작에서 서로 다른 결과를 반환합니다.


🧡[::-1]

txt = 'abcdefghikklmnop'
ret = txt[::-1]

txt[::-1]은 문자열을 뒤집는 슬라이싱 기법을 사용합니다. [::-1]은 문자열의 처음부터 끝까지 전체 문자열을 선택하되, 스텝(step) 값을 -1로 설정하여 역순으로 선택하는 것을 의미합니다.

output:

'ponmlkkikjhgfedcba'

🧡[::-2]

txt = 'abcdefghikklmnop'
ret = txt[::-1]

txt[::-2]는 문자열을 역순으로 선택하되, 스텝(step) 값을 -2로 설정하여 2칸씩 건너뛰며 선택하는 것을 의미합니다.
따라서, txt의 모든 문자를 역순으로 선택하면서 2칸씩 건너뛰어 선택합니다.

output:

'pomkmigeca'

🧡[-2::-2]

txt = 'abcdefghikklmnop'
ret = txt[::-1]

txt[-2::-2]는 문자열을 뒤에서 2번째 문자부터 역순으로 선택하되, 스텝(step) 값을 -2로 설정하여 2칸씩 건너뛰며 선택하는 것을 의미합니다.
즉, -2 인덱스부터 시작하여 문자열을 뒤로 이동하면서 2칸씩 건너뛰어 선택합니다.

output:

'oljifdb'

5️⃣ 문자열 공백 지우기: lstrip(),rstrip(),strip()

txt = " 양쪽에 공백이 있는 문자열입니다. "
ret1 = txt.lstrip()
ret2 = txt.rstrip()
ret3 = txt.strip()

print('<' + ret1 + '>')
print('<' + ret2 + '>')
print('<' + ret3 + '>')

lstrip() 메서드를 사용하여 문자열의 왼쪽에 있는 공백을 제거합니다.
rstrip() 메서드를 사용하여 문자열의 오른쪽에 있는 공백을 제거합니다.
strip() 메서드를 사용하여 문자열 양쪽에 있는 공백을 제거합니다.

output:

<양쪽에 공백이 있는 문자열입니다. >
< 양쪽에 공백이 있는 문자열입니다.>
<양쪽에 공백이 있는 문자열입니다.>

각 결과 문자열 앞 뒤에 <, >가 추가되었고, lstrip()는 왼쪽의 공백을 제거하고, rstrip()는 오른쪽의 공백을 제거하며, strip()은 양쪽의 공백을 제거한 것을 확인할 수 있습니다.

문자열의 모든 공백을 없애기 위해서는 replace() 메서드를 사용할 수 있습니다. replace() 메서드는 문자열 내의 특정 패턴을 다른 문자열로 대체하는 역할을 합니다.

🧡 문자열 모든 공백을 없애려면?~?

txt = " 양쪽에 공백이 있는 문자열입니다. "
ret = txt.replace(" ", "")

print(ret)

output:

"양쪽에공백이있는문자열입니다."

replace(" ", "")에서 첫 번째 인자로는 대체할 패턴을 지정하고, 두 번째 인자로는 대체할 문자열을 지정합니다. 위의 예시에서는 공백을 빈 문자열 ""로 대체하였습니다.

따라서, replace() 메서드를 활용하여 모든 공백을 제거할 수 있습니다.


6️⃣ 문자열 조합하기

🧡 분리하기 : split()

url = "http://www.naver.com/news/today=20230524"
log = 'name:이감자 age:8 sex:남자 nation:한국'

ret1 = url.split('/')
print(ret1)

ret2 = log.split()
print(type(ret2))
for data in ret2:
    d1, d2 = data.split(':')
    print('%s -> %s' % (d1, d2))

split() 메서드를 사용하여 url 문자열을 /을 기준으로 분리한 결과를 ret1 변수에 할당합니다. ret1은 분리된 문자열들을 원소로 갖는 리스트가 됩니다.
print(ret1)을 통해 ret1 리스트를 출력하면 분리된 각 부분은 리스트의 원소로 출력됩니다.

output:

['http:', '', 'www.naver.com', 'news', 'today=20230524']
<class 'list'>
name -> 이감자
age -> 8
sex -> 남자
nation -> 한국

🧡 결합하기 :join()

loglist = ["2023/05/24 14:43:??", '500', "no", '이 또한 지나가리라~_~']
bond = ';'
log = bond.join(loglist)
print(log)
print(type(log))

join() 메서드를 사용하여 loglist의 각 요소들을 bond 구분자로 결합한 결과를 log 변수에 할당합니다.

output:

2023/05/24 14:43:??;500;no;이 또한 지나가리라~_~
<class 'str'>

log 변수에는 loglist의 요소들이 ";"로 구분되어 결합된 문자열이 저장되어 있습니다.
type(log)를 통해 log의 데이터 타입을 확인하면 <class 'str'>로 문자열임을 알 수 있습니다.


7️⃣ encode()

a_txt = "I love Gamja"
b_txt = a_txt.encode()

print(a_txt)
print(b_txt)
print(type(b_txt))
ret1 = 'I' == a_txt[0]
ret2 = 'I' == b_txt[0]
print(ret1)
print(ret2)

encode() 메서드를 사용하여 a_txt 문자열을 바이트로 인코딩한 결과를 b_txt 변수에 할당합니다.
print(type(b_txt))를 통해 b_txt의 데이터 타입을 출력합니다. b_txt는 바이트 객체이므로 <class 'bytes'> 가 출력됩니다.

output:

I love Gamja
b'I love Gamja'
<class 'bytes'>
True
False

'I' == btxt[0]는 b_txt의 첫 번째 바이트가 'I'인지를 비교하여 False를 반환합니다. 이는 'I'가 바이트 형태로 인코딩되었기 때문입니다._


8️⃣ 문자열 정렬하기

🧡 sorted()

strdata=input("정렬할 문자를 입력하세요>")
ret1=sorted(strdata)
ret2=sorted(strdata,reverse=True)

print(ret1)
print(ret2)

ret1=''.join(ret1)
ret2=''.join(ret2)
print("오름차순으로 정렬된 문자열은 <"+ret1+"> 입니다.")
print("내림차순으로 정렬된 문자열은 <"+ret2+"> 입니다.") 

sorted() 함수를 사용하여 strdata 문자열을 오름차순으로 정렬한 결과를 ret1 변수에 저장합니다. 이때, sorted() 함수의 reverse 매개변수를 기본값인 False로 설정하여 오름차순 정렬을 수행합니다.
sorted() 함수를 사용하여 strdata 문자열을 내림차순으로 정렬한 결과를 ret2 변수에 저장합니다. 이때, reverse 매개변수를 True로 설정하여 내림차순 정렬을 수행합니다.

join() 메서드를 사용하여 정렬된 문자열 리스트를 다시 하나의 문자열로 결합합니다.

output:

예시 입력: "openai"
['a', 'e', 'i', 'n', 'o', 'p']
['p', 'o', 'n', 'i', 'e', 'a']
오름차순으로 정렬된 문자열은 <aeinop> 입니다.
내림차순으로 정렬된 문자열은 <poniea> 입니다.

9️⃣ index()

solarsys=["화성",'태양',"지구",'금성',"목성",'토성']
planet="지구"
pos=solarsys.index(planet)
solarsys[pos]="천왕성"
print(solarsys)

index() 메서드를 사용하여 solarsys 리스트에서 "지구"의 위치를 찾습니다. index() 메서드는 해당 원소가 리스트에서 처음으로 등장하는 인덱스를 반환합니다. 이 인덱스를 pos 변수에 저장합니다.
pos 변수를 사용하여 solarsys 리스트에서 "지구"를 "천왕성"으로 변경합니다. 리스트의 해당 위치에 새로운 값을 대입하여 변경합니다.

output:

  ['화성', '태양', '천왕성', '금성', '목성', '토성']

🔟 리스트 슬라이싱

🧡 리스트[1::2]

🧡 리스트[1:2]

listdata=list(range(1,21))
evenlist=listdata[1::2]
eeeelist=listdata[1:2]
print(evenlist)
print(eeeelist)

listdata는 1부터 20까지의 숫자로 구성된 리스트입니다.
evenlist는 listdata에서 짝수 인덱스에 해당하는 원소들로 이루어진 새로운 리스트입니다. 이를 위해 슬라이싱을 활용하였는데, listdata[1::2]인덱스 1부터 끝까지의 원소들을 2의 간격으로 선택하는 것을 의미합니다. 따라서 evenlist에는 listdata의 1, 3, 5, ..., 19번 인덱스에 해당하는 원소들이 저장됩니다.
eeeelist는 listdata에서 인덱스 1부터 2까지의 원소들로 이루어진 새로운 리스트입니다. 슬라이싱을 활용하여 listdata[1:2]를 선택하였는데, 이는 인덱스 1부터 1번 인덱스까지의 원소를 선택하는 것입니다. 따라서 eeeelist에는 listdata의 1번 인덱스에 해당하는 원소가 저장됩니다.

output:

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
[2]

evenlist에는 listdata의 짝수 번째 원소들이 저장되어 있고, eeeelist에는 listdata의 1번 인덱스에 해당하는 원소만 저장되어 있음을 확인할 수 있습니다.


🔟 + 1️⃣ 리스트 순서 뒤집기

🧡 reverse 🆚 reversed

reverse와 reversed는 리스트의 순서를 뒤집는 데에 사용되는 기능이지만 사용 방식과 동작 방식에서 차이가 있습니다.

reverse리스트의 메서드로, 리스트를 원본을 변경하며 역순으로 뒤집습니다. reverse 메서드는 리스트를 직접 수정하여 뒤집는 것이기 때문에 원본 리스트가 변경됩니다. 따라서 reverse 메서드를 호출한 후에는 해당 리스트의 원소들이 역순으로 변경되며 반환값은 없습니다.

  • 예시: list.reverse()

reversed내장 함수로, 리스트를 변경하지 않고 새로운 이터레이터를 반환합니다. 이 이터레이터는 원본 리스트의 역순으로 순회할 수 있도록 합니다. reversed 함수를 사용하여 리스트를 역순으로 순회하려면 list 함수로 변환하여 사용하거나, for 루프 등에서 직접 이터레이터를 활용해야 합니다.

  • 예시: reversed_list = list(reversed(my_list)) 또는 for item in reversed(my_list):

요약하면, reverse는 원본 리스트를 직접 변경하고 반환값이 없으며, reversed는 원본 리스트를 변경하지 않고 역순으로 순회할 수 있는 이터레이터를 반환합니다. 따라서 사용 목적과 상황에 맞게 선택하여 사용해야 합니다.

listdata1=list(range(5))
listdata1.reverse()

listdata2=list(range(5))
ret1=reversed(listdata2)
print("원본 리스트",end="")
print(listdata2)
print("역순 리스트",end='');print(list(ret1))

ret2=listdata2[::-1]
print('슬라이싱 이용',end='');print(ret2)

listdata1은 0부터 4까지의 숫자로 구성된 리스트입니다.
reverse() 메서드를 사용하여 원본 리스트를 역순으로 뒤집습니다. listdata1.reverse()를 호출하면 listdata1 리스트가 원본을 변경하며 역순으로 저장됩니다.
listdata2는 0부터 4까지의 숫자로 구성된 리스트입니다.
reversed() 함수를 사용하여 리스트를 역순으로 순회하는 이터레이터를 반환합니다. 이를 ret1 변수에 저장합니다.
list(ret1)을 사용하여 이터레이터를 리스트로 변환합니다. 이때 역순으로 뒤집힌 리스트가 생성됩니다.

🧡 리스트[::-1]

ret2는 슬라이싱을 사용하여 리스트를 역순으로 뒤집은 결과입니다.
listdata2[::-1]을 사용하여 리스트의 모든 원소를 역순으로 선택합니다. 이를 ret2 변수에 저장합니다.

output:

원본 리스트[0, 1, 2, 3, 4]
역순 리스트[4, 3, 2, 1, 0]
슬라이싱 이용[4, 3, 2, 1, 0]
  • reverse() 메서드, reversed() 함수, 슬라이싱을 이용한 방법 모두 원본 리스트의 순서를 역순으로 바꾸는 역할을 수행합니다.


🔟 + 2️⃣ 리스트 값 추가하기

🧡 append()

listdata=[]
for i in range(3):
    txt=input('리스트에 추가할 값을 입력하세요[%d/3]:'%(i+1))
    listdata.append(txt)
    print(listdata)

listdata는 빈 리스트로 초기화됩니다.
반복문을 통해 3번의 입력을 받습니다.
input() 함수를 사용하여 사용자로부터 값을 입력받습니다. 입력된 값은 txt 변수에 저장됩니다.
listdata.append(txt)를 사용하여 입력받은 값을 리스트에 추가합니다.
현재까지의 리스트 상태를 출력하기 위해 print(listdata)를 사용하여 리스트를 출력합니다.

output:

리스트에 추가할 값을 입력하세요[1/3]:Hello
['Hello']
리스트에 추가할 값을 입력하세요[2/3]:World
['Hello', 'World']
리스트에 추가할 값을 입력하세요[3/3]:OpenAI
['Hello', 'World', 'OpenAI']

반복문을 통해 사용자로부터 입력받은 값들이 순차적으로 리스트에 추가되는 것을 확인할 수 있습니다.


🧡 index()

solarsys=["지구",'태양','금성',"목성",'화성',"해왕성"]
pos=solarsys.index('목성')
solarsys.insert(pos,"소행성")
print(solarsys)

index() 메서드를 사용하여 '목성' 원소의 위치를 찾습니다. pos 변수에 해당 위치가 저장됩니다.
insert() 메서드를 사용하여 '목성' 원소의 위치에 '소행성'을 삽입합니다. solarsys.insert(pos, "소행성")을 호출하면 '목성' 앞에 '소행성'이 추가됩니다.

output:

  ['지구', '태양', '금성', '소행성', '목성', '화성', '해왕성']

🔟 + 3️⃣ 리스트 값 빼기

🧡 del()

solarsys=["지구",'태양','금성',"목성",'화성',"해왕성"]
del solarsys[0]
print(solarsys)
del solarsys[-2]
print(solarsys)


solarsys=["지구",'태양','금성',"목성",'화성',"해왕성"]
solarsys.remove("지구")
print(solarsys)

del 키워드를 사용하여 인덱스를 지정하여 원소를 제거하는 방법:
del solarsys[0]를 호출하여 첫 번째 원소를 삭제합니다.
결과를 출력합니다.
del 키워하여드를 사용 음수 인덱스를 지정하여 원소를 제거하는 방법:
del solarsys[-2]를 호출하여 뒤에서 두 번째 원소를 삭제합니다.
결과를 출력합니다.

🧡 remove()

remove() 메서드를 사용하여 값을 기준으로 원소를 제거하는 방법:
solarsys.remove("지구")를 호출하여 "지구" 원소를 삭제합니다.
결과를 출력합니다.

output:

['태양', '금성', '목성', '화성', '해왕성']
['태양', '금성', '목성', '화성']
['태양', '금성', '목성', '화성', '해왕성']

세 가지 방법을 사용하여 리스트에서 원소를 제거한 결과를 확인할 수 있습니다. 첫 번째 방법과 두 번째 방법은 인덱스를 기준으로 원소를 삭제하고, 세 번째 방법은 값을 기준으로 원소를 삭제합니다.

0개의 댓글