Presentation is loading. Please wait.

Presentation is loading. Please wait.

Spring, 2019 School of CSE Pusan National University

Similar presentations


Presentation on theme: "Spring, 2019 School of CSE Pusan National University"— Presentation transcript:

1 Spring, 2019 School of CSE Pusan National University
문자열(string) 활용하기 Spring, 2019 School of CSE Pusan National University

2 학습목표 문자열을 다루는 방법을 배운다. 주어진 문자열 좌우 대칭인지 확인하기
일반적으로 주어진 문제를 푸는 방법은 여러 가지가 있을 수 있음을 배우게 된다. 문자를 컴퓨터 안에서 나타내는 방법을 배운다. 주어진 값을 오름 차순으로 간추려본다.

3 len (str1), substring str1[n1:n2+1]
len, substring, right, left 등을 구하기 str1 = "abc123XYZ" len(str1) : 9 str1[0] : a str1[len(str1)-1] : Z str1[0:0 + 1] : a str1[4:6 + 1] : 23X str1[4:7 + 1] : 23XY str1[6:8 + 1] : XYZ str1[0:2 + 1] : abc str1[0:4 + 1] : abc12 str1[len(str1)-3:len(str1)] XYZ # right 3 chars str1[6:8 + 1] XYZ # right 3 chars str1[len(str1)-5:len(str1)] 23XYZ #right 5 chars str1[4:8 + 1] 23XYZ #right 5 chars

4 len (str1), substring str1[n1:n2+1]
substring, right, left 등을 구하는 함수 def left_n (str1, n): return (str1[0:n]) def right_n (str1, n): return (str1[len(str1)-n:len(str1)]) def mid_st_num (str1, st_pos, num_chars): return (str1[st_pos:st_pos + num_chars]) def mid_st_end (str1, st_pos, end_pos): return (str1[st_pos:end_pos + 1])

5 len (str1), substring str1[n1:n2+1]
str1 = "abc123XYZ" mid_st_num (str1, 0, 1) : a mid_st_num (str1, 4, 3) : 23X mid_st_num (str1, 4, 4) : 23XY mid_st_num (str1, 6, 3) : XYZ mid_st_end (str1, 0, 0) : a mid_st_end (str1, 4, 6) : 23X mid_st_end (str1, 4, 7) : 23XY mid_st_end (str1, 6, 8) : XYZ

6 len (str1), substring str1[n1:n2+1]
str1[0:2 + 1] : abc str1[0:4 + 1] : abc12 left_n[str1, 3] : abc left_n[str1, 5] : abc12 str1[6:8 + 1] : XYZ str1[4:8 + 1] : 23XYZ right_n(str1, 3) : XYZ right_n(str1, 5) : 23XYZ

7 str2 = "abcdef"의 str2 [2:4]를 "xx"로 바꾸기
substring의 값을 바꾸기 substring의 값을 바꾸기 str2 = "abcdef"의 str2 [2:4]를 "xx"로 바꾸기 str2 [2:4] = "xx" # 안 됨 str2 [2] = "x"; str2 [3] = "x" # 안 됨 str2 = str2[:2] + "xx" + str2[4:] str3 = "abcdef"의 첫 글자 (a)와 마지막 글자(f) 맞바꾸기 결과: fbcdea strtmp=str3[0]; str3[0]=str3[5]; str3[5]=strtmp --> 안 됨. str3=str3[len(str3)-1]+str3[1:len(str3)-1]+str3[0]

8 palindrome (좌우 대칭인 문자열)
aaa, aba, abba, x, mum palindrome 이 아닌 보기: abc, abab, abcabc 주어진 문자열이 좌우 대칭인지 확인하기 종이와 연필로 하면 어떻게 할까?

9 palindrome (좌우 대칭인 문자열)
방법1: palinQ(좌우_대칭)이라는 변수를 쓴다 처음에 palinQ(좌우_대칭) 변수를 True로 만듦. 대응하는 글자가 다르면 palinQ(좌우_대칭)라는 변수를 False로 바꿈. 대응하는 글자가 같으면 아무 일도 하지 않음 ([중요] 이 때 palinQ(좌우_대칭)라는 변수를 True로 바꾸면 안 됨) 대응하는 글자를 모두 견준 뒤에 [마지막에], palinQ(좌우_대칭)이 True이면 좌우_대칭, palinQ(좌우_대칭)이 False이면 좌우_대칭 아님 몇 번 견주어야 하나? (되풀이해야 하나?) len (str1)/2 (또는 len(str1) // 2) 만큼 되풀이 aba: a-a 만 견주면 됨 (b 는 견줄 필요 없음): 길이가 1, 3, 5, ...이면? abba: a-a, b-b 를 견주어야 함: 길이가 2, 4, 6, 8, ... 이면?

10 palindrome (좌우 대칭인 문자열)
한 글자만 있을 때: 무조건 좌우 대칭 글자가 없을 때: 좌우 대칭 판정을 할 수 없음 input_str = "abcabc" len1 = len(input_str); num_iter = len1 / 2 left_pos = 0; right_pos = len1 - 1 palinQ = True for j in range(0, num_iter): if (input_str[left_pos] <>input_str[right_pos]): palinQ = False left_pos = left_pos + 1 right_pos = right_pos - 1 if (palinQ): ... else: ...

11 palindrome (좌우 대칭인 문자열)
방법 2: num_diff(다른_회수)라는 변수를 쓴다 처음에 num_diff(다른_회수)를 0으로 만듦. 견주면서 대응하는 글자가 다르면 num_diff(다른_회수) 변수 값을 1씩 올림. 대응하는 글자를 모두 견준 뒤에 [마지막에], num_diff(다른_회수) == 0이면 좌우_대칭이고, num_diff(다른_회수) <> 0 이면 좌우_대칭 아님

12 palindrome (좌우 대칭인 문자열)
input_str = "abcabc" len1 = len(input_str); num_iter = len1 / 2 left_pos = 0; right_pos = len1 - 1 num_diff = 0 for j in range(1,num_iter +1): if (input_str[left_pos] <>input_str[right_pos]): num_diff = num_diff + 1 left_pos = left_pos + 1 right_pos = right_pos - 1 if (num_diff == 0): ... else: ...

13 palindrome (좌우 대칭인 문자열)
방법 3: num_same(같은_회수)이란 변수를 씀 처음에 num_same(같은_회수)을 0으로 만듦. 견주면서 대응하는 글자가 같으면 num_same(같은_회수) 변수 값을 1씩 올림. 대응하는 글자를 모두 견준 뒤에 [마지막에], . num_same(같은_회수) 값이 num_iter(견줌_회수)와 같으면 좌우_대칭이고, . num_same(같은_회수) 값이 num_iter(견줌_회수)보다 작으면 좌우_대칭 아님.

14 palindrome (좌우 대칭인 문자열)
input_str = "abccba" len1 = len(input_str); num_iter = len1 / 2 left_pos = 0; right_pos = len1 - 1 num_same = 0 for j in range(1,num_iter +1): if (input_str[left_pos] ==input_str[right_pos]): num_same = num_same + 1 left_pos = left_pos + 1 right_pos = right_pos - 1 if (num_same == num_iter): ... else: ...

15 palindrome (좌우 대칭인 문자열)
"abcabc" 경우에, a 와 c 가 다른 것을 알면 대칭이 아니므로, "곧바로" 멈춤 방법 1에서 고칠 점 (PalinQ 변수): while ((j <= (max_num_iter - 1)) and (palinQ)): 방법 2에서 고칠 점(num_diff(다른_회수) 변수) while ((j <= (max_num_iter - 1)) and (num_diff == 0)): 방법 3에서 고칠 점(num_same(같은_회수) 변수 while ((j <= (max_num_iter - 1)) and (num_same == j)): 파일에서 char. string을 하나씩 읽어서 각 문자열이 좌우 대칭인지 아닌지 확인한다. 프로그램 마지막에 1) empty string, 2) palindrome인 것과 3) palindrome 아닌 것의 수를 찍는다.

16 chr ( ) 함수 chr ( ) 함수 ord ( ) 함수 chr ( ) 함수
0 ~ 255 값에 대응하여 글자 한 자(char)를 되돌려 준다 ord ( ) 함수 글자 한 자(String)에 대응하여 0 ~ 255의 정수를 되돌려 준다 str21 = chr (65) # "A": 65 (dec), 0x41 str22 = chr (0x42) # "B": 0x42, 66 (dec) print str21, str22, chr(0x30), chr(57) 결과: A B 0 9 = ord("A") -> 0x41=65; ord("b")=0x62=98 ord("0") -> 0x30=48; ord("9")=0x39=57

17 ASCII table ASCII ASCII table
american standard code for information interchange

18 문자열 다루기 주어진 char.str.의 오른쪽부터 네 자씩 떼어냄 문자열 다루기 str1 = "99123477778888"
while (len(str1) > 0): len1 = len(str1) if (len1 >= 4): # 4/5/6/ ... chars print str1[len1-4:len1] str1 = str1[0: len1 - 4] else: # 1/2/3 chars print str1 str1 = "" // 결과: 8888, 7777, 1234, 99가 차례대로 나옴

19 문자열을 정수로 바꾸기 십진 숫자 네 개인 char. str.을 정수로 바꾸기 문자열을 정수로 바꾸기
과정: (((2 * 10) + 3 ) * ) * =2345 # int(dec_str1) 함수를 쓰지 않고 직접 해봄 dec_str1 = "2048" num1 = 0 for i in range(0, 3 + 1): char1 = dec_str1[i] digit1 = ord (char1) - ord("0") num1 = num1*10 + digit1

20 정수를 문자열로 바꾸기 십진 수를 char. str.으로 바꾸기 정수를 문자열로 바꾸기
dec_dgt = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] num1 = 2748; dec_str1 = "" # empty string while (num1 > 0): rem1 = num1 % 10 # 10으로 나눈 나머지 dec_str1 = dec_dgt[rem1] + dec_str1 num1 = (num1 - rem1) / 10 print dec_str1

21 스스로 해보기 스스로 해보기 10진 수에 필요한 숫자: 0, 1, ..., 9 -- 10 개 스스로 해보기
십진 수 문자열을 십육진 수 문자열로 바꾸기. 십육진 수 문자열을 십진 수 문자열로 바꾸기. 10진 수에 필요한 숫자: 0, 1, ..., 개 16진 수에 필요한 숫자: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F (또는 a, b, c, d, e, f) hex A=dec 10, hex B=dec 11, hex C=dec 12, hex D=dec 13, hex E=dec 14, hex F=dec 15

22 정렬하기 (sort) 정렬하기 (sort) 정렬하기 (sort) 오름차순으로 간추린다.
원소 (1):(2) 견줌, (2):(3) 견줌, ... (n-1):(n) 견줌 따라서 맨처음에 (n-1) 번 견줌 그리고 견줄 회수가 1씩 줄어듦 seongjeog = [0 for i in range(101)] # num_ints # 정수의 개수 # seongjeog에 num_ints 개의 성적이 원소 [1] .. [num_ints]에 있다고 가정. seongjeog[1]=10; seongjeog[2]=40; seongjeog[3]=35; seongjeog[4]=25;

23 정렬하기 (sort) 정렬하기 (sort) for num_cmps in range((num_ints-1), 0, -1):
for i in range(1, num_cmps + 1): if (seongjeog[i] > seongjeog[i + 1]): tmp_val = seongjeog[i] seongjeog[i] = seongjeog[i + 1] seongjeog[i + 1] = tmp_val

24 정렬하기 (sort) 주어진 수 4 개를 sort 하는 중간 과정 주어진 수를 오름차순으로 간추린다 (정렬)
4 개의 수를 읽었습니다 주어진 수를 오름차순으로 간추린다 (정렬한다) 주어진 수를 오름차순으로 간추린다 (정렬) 10, 40, 35, 25 --> 10, 25, 35, 40 성적 (처음):

25 정렬하기 (sort) num_cmps= 3 … 정렬하기 (sort) 1 번째로 큰 수를 찾아서 4 번째 원소에 넣는다
i:1; sj[1]:10, sj[2]:40 X 맞바꾸지 않음 성적: i:2; sj[2]:40, sj[3]:35 O 맞바꿈 성적: i:3; sj[3]:40, sj[4]:25 O 맞바꿈 성적: !! 1 번째로 가장 큰 값 : 40

26 정렬하기 (sort) num_cmps: 2 ... 정렬하기 (sort) 2 번째로 큰 수를 찾아서 3 번째 원소에 넣는다.
i:1; sj[1]:10, sj[2]:35 X 맞바꾸지 않음 성적: i:2; sj[2]:35, sj[3]:25 O 맞바꿈 성적: !! 2 번째로 가장 큰 값 : 35

27 정렬하기 (sort) num_cmps: 1 ... 정렬하기 (sort) 3 번째로 큰 수를 찾아서 2 번째 원소에 넣는다
i:1; sj[1]:10, sj[2]:25 X 맞바꾸지 않음 성적: !! 3 번째로 가장 큰 값 : 25 !! 4 번째로 가장 큰 값 (= 가장 작은 값) : 10 ## bubble sort 결과 //

28 연습문제 연습문제 while_max_31_filenames.txt

29 요약 종이나 연필만으로 푸는 방법을 보았다. 문자열을 다루는 여러 가지 방법을 배웠다.
(컴퓨터나 프로그램은 생각하지 말고) 문자열을 다루는 여러 가지 방법을 배웠다. 주어진 문제를 푸는 방법이 여러 가지 있을 때는 빠르고 이해하기 쉬운 방법을 쓴다. 거품 정렬 방식으로 주어진 값을 오름차순으로 간추려보았다.


Download ppt "Spring, 2019 School of CSE Pusan National University"

Similar presentations


Ads by Google