Spring, 2019 School of CSE Pusan National University

Slides:



Advertisements
Similar presentations
Ⅰ. 연산자 Ⅱ. 제어 구조. 연산자 : 할당 연산자 - 사용자가 정의한 변수에 임의의 값을 저장하는 기능 strvar = strVar1+ “ Hello ”
Advertisements

파이썬 (Python). 1 일 : 파이썬 프로그래밍 기초 2 일 : 객체, 문자열 3 일 : 문자인코딩, 정규표현식, 옛한글 4 일 : 파일 입출력 5 일 : 함수와 모듈 6 일 : 원시 말뭉치 다루기 실습 7 일 : 주석 말뭉치 다루기 실습 8 일 : 웹 데이터로.
변수와 조건문 빛나리 36 호 박승운. 파이썬 쉽게 사용하기 Python IDLE 사용 FILE - New File 로 파일 만들기 Run – Run Module 로 실행하기.
6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
1/44 엑셀에서 제공하는 함수는 300 개가 넘으며, 이 함수들 중에는 매우 전문적인 분야에서만 사용되거나 자주 사용되지 않는 것들도 많다. 여기서는 일상에서 자주 사용되는 통계 함수, 수학 / 삼각 함수, 논리 함수, 날짜 함수, 찾기 / 참조 함수를 학습해보자. 06_.
컴퓨터 개론 및 실습 강의 6 서울대학교 기계항공공학부 담당 : 김 찬 중.
이진 나무 구조 강윤섭 2008년 5월 23일.
재료수치해석 HW # 박재혁.
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
Lesson 6. 형변환.
Heesang kim PL/SQL 3 Heesang kim.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
6장. printf와 scanf 함수에 대한 고찰
2007 1학기 11 프로젝트 기초 실습.
Tail-recursive Function, High-order Function
Chapter 07. 기본 함수 익히기.
11장. 1차원 배열.
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
JA A V W. 03.
어서와 C언어는 처음이지 제14장.
인터넷응용프로그래밍 JavaScript(Intro).
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
Lesson 4. 수식과 연산자.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
ROC curve Receiver-Operating Characteristic curve.
Java의 정석 제 5 장 배 열 Java 정석 남궁성 강의 의
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
연산자 (Operator).
에어 조건문.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
Regular Expression 1 Powerful pattern matching with regular expression to a string while () { if ( /ab*c/ ) { print $_; } } substitute operator s/abc*c/def/;
도형의 닮음 Ⅵ-1 도형의 닮음 (1) 닮음과 닮은 도형 닮음
8주차: Strings, Arrays and Pointers
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
약식 진리표  ∧ ∨ → ↔  =.
문자열 컴퓨터시뮬레이션학과 2015년 봄학기 담당교수 : 이형원 E304호,
Files and Exceptions Byoungjun Kim
2014년 가을학기 손시운 지도 교수: 문양세 교수님 데이터 프레임 2014년 가을학기 손시운 지도 교수: 문양세 교수님.
과제 1 4bit x 4 SRAM이 있다 아래 (1), (2) 두 입력에 대한 출력값 [3:0] Dout을 나타내시오 (1)
객체기반 SW설계 팀활동지 4.
2nd day Indexing and Slicing
Regular Expression 1 Powerful pattern matching with regular expression to a string while () { if ( /ab*c/ ) { print $_; } } substitute operator s/abc*c/def/;
제 15 강 문자와 코드 shcho.pe.kr.
에어 PHP 입문.
Excel 일차 강사 : 박영민.
2장 PHP 기초 PHP의 시작과 끝을 이해한다. 주석문에 대하여 이해한다. echo 문을 이용하여 화면에 출력하
Chapter 1 단위, 물리량, 벡터.
05. General Linear List – Homework
Chapter 1 단위, 물리량, 벡터.
Chapter 10 데이터 검색1.
함수, 모듈.
11장 배열 1. 배열이란? 1.1 배열의 개요 1.2 배열의 선언과 사용.
Summary of Pointers and Arrays
제 22 강 논리식 및 논리 값 shcho.pe.kr.
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
Excel 일차 강사 : 박영민.
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
Spring, 2019 School of CSE Pusan National University
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
어서와 C언어는 처음이지 제21장.
4 다문화 및 탈북학생 멘토링 진행.
수학10-나 1학년 2학기 Ⅱ.부등식의 영역 3. 부등식의 영역에서 최대, 최소(5/5) 부등식 영역 수업계획 수업활동.
C++ Espresso 제15장 STL 알고리즘.
6 객체.
Spring, 2019 School of CSE Pusan National University
제 10 강 문자 입출력.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

Spring, 2019 School of CSE Pusan National University 문자열(string) 활용하기 Spring, 2019 School of CSE Pusan National University http://yeols.com/80072448118

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

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

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])

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

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

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]

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

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, ... 이면?

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: ...

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

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: ...

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

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: ...

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 아닌 것의 수를 찍는다.

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

ASCII table ASCII ASCII table american standard code for information interchange

문자열 다루기 주어진 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가 차례대로 나옴

문자열을 정수로 바꾸기 십진 숫자 네 개인 char. str.을 정수로 바꾸기 문자열을 정수로 바꾸기 과정: (((2 * 10) + 3 ) * 10 + 4) * 10 +5 =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

정수를 문자열로 바꾸기 십진 수를 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

스스로 해보기 스스로 해보기 10진 수에 필요한 숫자: 0, 1, ..., 9 -- 10 개 스스로 해보기 십진 수 문자열을 십육진 수 문자열로 바꾸기. 십육진 수 문자열을 십진 수 문자열로 바꾸기. 10진 수에 필요한 숫자: 0, 1, ..., 9 -- 10 개 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

정렬하기 (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;

정렬하기 (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

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

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

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

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

연습문제 연습문제 while_max_31_filenames.txt

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