Loading the catalog…
Loading the catalog…
파이썬 초보 탈출 - 코딩 면허시험 문제풀이 목차 Q1. 문자열 바꾸기 Q2. 딕셔너리 값 추출하기 Q3. 리스트 더하기와 extend() Q4. 리스트 총합 구하기 Q5. 피보나치 수열 Q6. 숫자의 총합 구하기 Q7. 한 줄 구구단 Q8. 파일 역순 저장 Q9. 총합과 평균 구하기 Q10. Calculator 클래스 Q11. 모듈 불러오기 Q12. 오류와 예외 처리 Q13. DashInsert Q16. 모스 부호 해독 Q17. 기초 메타 문자 Q18. 문자열 검색 Q19. 그루핑 Q20. 전방 탐색 Q1. 문자열 바꾸기 문자열 a:b:c:d 에서 : 을 기준으로 문자열을 나누고 다시 # 으로 연결한다. 풀이 a = "a:b:c:d" result = "#".join(a.split(":")) print(result) 실행 결과 a#b#c#d 동작 과정 먼저 a.split(":") 을 실행하면 ['a', 'b', 'c', 'd'] 가 된다. 그리고 "#".join(...) 을 사용하면 a#b#c#d 처럼 리스트의 요소 사이에 # 을 넣어 다시 문자열로 만든다. "a:b:c:d" ↓ split(":") ↓ ['a', 'b', 'c', 'd'] ↓ "#".join() ↓ "a#b#c#d" 핵심 split() → 문자열 나누기 join() → 문자열 연결하기 Q2. 딕셔너리 값 추출하기 딕셔너리에 존재하지 않는 Key를 a['C'] 처럼 조회하면 KeyError 가 발생한다. a = { 'A': 90, 'B': 80 } 이때 C 가 없다면 기본값 70 을 얻고 싶다. 풀이 get() 을 사용하면 간단하다. a = { 'A': 90, 'B': 80 } print(a.get('C', 70)) 실행 결과 70 get() 딕셔너리.get(Key, 기본값) 형태로 사용할 수 있다. a.get('A', 70) A 가 존재하므로 90 을 반환한다. 반면 a.get('C', 70) 에서는 C 가 없기 때문에 70 을 반환한다. 핵심 a['C'] → Key가 없으면 오류 a.get('C') → Key가 없으면 None a.get('C', 70) → Key가 없으면 70 Q3. 리스트 더하기와 extend() 다음 두 코드는 결과만 보면 동일하다. + a = [1, 2, 3] a = a + [4, 5] print(a) [1, 2, 3, 4, 5] extend() a = [1, 2, 3] a.extend([4, 5]) print(a) [1, 2, 3, 4, 5] 하지만 동작 방식에는 차이가 있다. + a = a + [4, 5] 은 기존 리스트를 수정하는 것이 아니라 새로운 리스트를 만들어 a 가 다시 가리키게 한다. a = [1, 2, 3] print(id(a)) a = a + [4, 5] print(id(a)) 두 id() 값이 달라진다. 기존 리스트 [1, 2, 3] + [4, 5] ↓ 새로운 리스트 [1, 2, 3, 4, 5] extend() a.extend([4, 5]) 는 기존 리스트 자체에 값을 추가한다. a = [1, 2, 3] print(id(a)) a.extend([4, 5]) print(id(a)) 객체의 id() 가 유지된다. 핵심 방법 동작 a + b 새로운 리스트 생성 a.extend(b) 기존 리스트 수정 Q4. 리스트 총합 구하기 점수 중에서 50점 이상인 값만 더한다. A = [20, 55, 67, 82, 45, 33, 90, 87, 100, 25] 풀이 A = [20, 55, 67, 82, 45, 33, 90, 87, 100, 25] result = 0 for score in A: if score >= 50: result += score print(result) 실행 결과 481 동작 과정 20 → X 55 → +55 67 → +67 82 → +82 45 → X 33 → X 90 → +90 87 → +87 100 → +100 25 → X 조금 더 간단하게 result = sum(score for score in A if score >= 50) 하지만 지금 단계에서는 for + if 방식의 흐름을 정확히 이해하는 것이 더 중요하다. Q5. 피보나치 수열 피보나치 수열은 앞의 두 값을 더해 다음 값을 만든다. 0, 1, 1, 2, 3, 5, 8, 13 ... 즉 0 + 1 = 1 1 + 1 = 2 1 + 2 = 3 2 + 3 = 5 ... 형태이다. n개의 피보나치 수 만들기 def fibonacci(n): result = [] a = 0 b = 1 for _ in range(n): result.append(a) a, b = b, a + b return result n = int(input("숫자 입력: ")) print(fibonacci(n)) 예를 들어 숫자 입력: 8 결과 [0, 1, 1, 2, 3, 5, 8, 13] 핵심 코드 a, b = b, a + b 예를 들어 a = 0 b = 1 이라면 a = 1 b = 1 이 되고 다음에는 a = 1 b = 2 가 된다. Q6. 숫자의 총합 구하기 사용자가 다음과 같이 입력한다고 해보자. 65,45,2,3,45,8 콤마를 기준으로 값을 나눈 후 숫자로 변환하여 합계를 구한다. 풀이 data = input("값을 입력하세요: ") numbers = map(int, data.split(",")) result = sum(numbers) print(result) 실행 결과 168 동작 과정 "65,45,2,3,45,8" ↓ split(",") ['65', '45', '2', '3', '45', '8'] ↓ map(int, ...) 65, 45, 2, 3, 45, 8 ↓ sum() 168 Q7. 한 줄 구구단 사용자로부터 2~9 중 하나를 입력받아 해당 구구단의 결과를 한 줄로 출력한다. 풀이 dan = int( input("구구단을 출력할 숫자를 입력하세요(2~9): ") ) for i in range(1, 10): print(dan * i, end=" ") 예를 들어 2 를 입력하면 2 4 6 8 10 12 14 16 18 이 출력된다. end=" " 기본적인 print() 는 출력이 끝나면 줄을 바꾼다. print(1) print(2) 1 2 하지만 print(1, end=" ") print(2, end=" ") 처럼 사용하면 1 2 한 줄로 출력할 수 있다. Q8. 파일 역순 저장 파일 내용이 다음과 같다고 해보자. AAA BBB CCC DDD EEE 이를 역순으로 변경한다. EEE DDD CCC BBB AAA 풀이 with open("abc.txt", "r", encoding="utf-8") as f: lines = f.readlines() lines.reverse() with open("abc.txt", "w", encoding="utf-8") as f: f.writelines(lines) readlines() f.readlines() 파일을 줄 단위로 읽어 리스트로 반환한다. 예를 들어 [ "AAA\n", "BBB\n", "CCC\n", "DDD\n", "EEE\n" ] 와 같은 형태이다. reverse() lines.reverse() 리스트의 순서를 실제로 뒤집는다. AAA EEE BBB DDD CCC → CCC DDD BBB EEE AAA 주의할 점 텍스트 파일의 마지막 줄에 \n 이 없다면 역순 저장 후 EEEDDD 처럼 두 줄이 붙는 문제가 생길 수 있다. 즉 파일에서 줄바꿈 문자 \n 도 데이터의 일부 라는 점을 기억하자. Q9. 총합과 평균 구하기 파일에 숫자가 한 줄에 하나씩 저장되어 있다고 해보자. 70 60 55 75 95 90 80 80 85 100 이 값을 읽어 총합 평균 을 계산하고 평균을 result.txt 에 저장한다. 풀이 with open( "sample.txt", "r", encoding="utf-8" ) as f: numbers = [ int(line.strip()) for line in f ] total = sum(numbers) average = total / len(numbers) print("총합:", total) print("평균:", average) with open( "result.txt", "w", encoding="utf-8" ) as f: f.write(str(average)) 실행 결과 총합: 790 평균: 79.0 result.txt 79.0 평균 공식 평균 = 전체 합계 / 데이터 개수 즉 790 / 10 = 79.0 이다. Q10. Calculator 클래스 숫자 리스트를 입력받아 sum() avg() 기능을 제공하는 클래스를 만든다. 풀이 class Calculator: def __init__(self, numbers): self.numbers = numbers def sum(self): return sum(self.numbers) def avg(self): return sum(self.numbers) / len(self.numbers) cal1 = Calculator([1, 2, 3, 4, 5]) print(cal1.sum()) print(cal1.avg()) cal2 = Calculator([6, 7, 8, 9, 10]) print(cal2.sum()) print(cal2.avg()) 실행 결과 15 3.0 40 8.0 왜 self.result 를 계속 누적하면 안 될까? 예를 들어 def sum(self): for i in self.numbers: self.result += i 를 실행한 뒤 다시 avg() 에서 self.result += i 를 하면 앞에서 계산했던 값이 남아 있어 중복으로 더해진다. 따라서 합계와 평균처럼 단순 계산은 매번 sum(self.numbers) 를 사용하는 것이 훨씬 깔끔하다. Q11. 모듈 불러오기 다음 위치에 C:\doit\mymod.py 모듈이 있다고 가정해 보자. 파이썬에서 import mymod 를 사용할 수 있도록 하는 대표적인 방법은 세 가지가 있다. 1. sys.path 추가 import sys sys.path.append(r"C:\doit") import mymod 파이썬이 모듈을 검색하는 경로에 C:\doit 을 추가한다. 2. PYTHONPATH Windows 명령 프롬프트에서 set PYTHONPATH=C:\doit 환경 변수를 설정한 후 python 을 실행하면 import mymod 를 사용할 수 있다. 3. 모듈이 있는 위치에서 실행 cd C:\doit python 이후 import mymod 를 실행한다. 핵심 파이썬은 모듈을 sys.path 에 등록된 경로에서 찾는다. 확인하려면 import sys print(sys.path) 를 사용할 수 있다. Q12. 오류와 예외 처리 다음 코드를 살펴보자. result = 0 try: [1, 2, 3][3] "a" + 1 4 / 0 except TypeError: result += 1 except ZeroDivisionError: result += 2 except IndexError: result += 3 finally: result += 4 print(result) 실행 과정 초기값 result = 0 먼저 [1, 2, 3][3] 이 실행된다. 리스트 인덱스는 0 1 2 ↓ ↓ ↓ 1 2 3 까지만 존재한다. 따라서 IndexError 가 발생한다. except 이동 except IndexError: result += 3 가 실행된다. 0 + 3 = 3 그리고 try 블록의 나머지 코드는 실행하지 않는다. 따라서 "a" + 1 과 4 / 0 은 실행되지 않는다. finally finally 는 오류 발생 여부와 관계없이 실행된다. finally: result += 4 따라서 3 + 4 = 7 최종 결과 7 이다. Q13. DashInsert 숫자로 이루어진 문자열에서 홀수 + 홀수 가 연속되면 - 를 넣고, 짝수 + 짝수 가 연속되면 * 을 넣는다. 예를 들어 4546793 을 처리하면 454*67-9-3 이 된다. 풀이 data = "4546793" numbers = list(map(int, data)) result = [] for i, num in enumerate(numbers): result.append(str(num)) if i == len(numbers) - 1: continue next_num = numbers[i + 1] if num % 2 == 1 and next_num % 2 == 1: result.append("-") elif num % 2 == 0 and next_num % 2 == 0: result.append("*") print("".join(result)) 실행 결과 454*67-9-3 enumerate() for i, num in enumerate(numbers): 을 사용하면 인덱스 + 값 을 동시에 가져올 수 있다. 예를 들어 numbers = [4, 5, 4] 이면 i=0, num=4 i=1, num=5 i=2, num=4 순서로 반복한다. 홀수 판별 num % 2 == 1 나머지가 1 이면 홀수이다. 짝수 판별 num % 2 == 0 나머지가 0 이면 짝수이다. Q14 / Q15 참고한 게시글에는 Q13 다음이 바로 Q16으로 이어져 있어 Q14와 Q15 문제 및 풀이가 포함되어 있지 않다. Q16. 모스 부호 해독 모스 부호를 영어 문자로 변경하려면 모스 부호 → 알파벳 형태의 딕셔너리를 만들 수 있다. 모스 부호 딕셔너리 morse_code = { '.-': 'A', '-...': 'B', '-.-.': 'C', '-..': 'D', '.': 'E', '..-.': 'F', '--.': 'G', '....': 'H', '..': 'I', '.---': 'J', '-.-': 'K', '.-..': 'L', '--': 'M', '-.': 'N', '---': 'O', '.--.': 'P', '--.-': 'Q', '.-.': 'R', '...': 'S', '-': 'T', '..-': 'U', '...-': 'V', '.--': 'W', '-..-': 'X', '-.--': 'Y', '--..': 'Z' } 해독 함수 def morse(src): result = [] words = src.split(" ") for word in words: chars = word.split() decoded = "" for char in chars: decoded += morse_code[char] result.append(decoded) return " ".join(result) 즉 모스 부호 ↓ 단어 단위 분리 ↓ 문자 단위 분리 ↓ 딕셔너리 조회 ↓ 영어 문자 변환 ↓ 다시 합치기 순서로 처리한다. Q17. 기초 메타 문자 정규식 a[.]{3,}b 를 해석해 보자. [.] 실제 점(.) 문자 를 의미한다. {3,} 앞의 패턴이 3번 이상 이라는 의미이다. 따라서 전체적으로 a + 점(.) 3개 이상 + b 이다. 보기 중 a....b 가 조건을 만족한다. 정답 2번 코드 확인 import re p = re.compile(r"a[.]{3,}b") print(p.match("acccb")) print(p.match("a....b")) print(p.match("aaab")) print(p.match("a.cccb")) a....b 만 정상적으로 매치된다. Q18. 문자열 검색 import re p = re.compile(r"[a-z]+") m = p.search("5 python") print(m.start() + m.end()) 패턴 분석 [a-z]+ 는 영문 소문자가 1개 이상 연속 이라는 의미이다. 따라서 5 python 에서 python 이 매치된다. 인덱스 문자 5 공백 p y t h o n 인덱스 0 1 2 3 4 5 6 7 따라서 m.start() 은 2 이고, m.end() 는 마지막 문자의 다음 위치이므로 8 이다. 따라서 2 + 8 = 10 정답 10 Q19. 그루핑 다음과 같은 데이터가 있다고 해보자. park 010-9999-9998 kim 010-9909-7789 lee 010-8789-7768 전화번호의 마지막 네 자리를 #### 로 변경한다. 정규식 작성 전화번호의 앞부분을 그룹으로 만든다. r"(\d{3}-\d{4})-\d{4}" 해석하면 ( 숫자 3개 - 숫자 4개 ) ↓ 그룹 1 - 숫자 4개 이다. 풀이 import re data = """ park 010-9999-9998 kim 010-9909-7789 lee 010-8789-7768 """ pattern = re.compile( r"(\d{3}-\d{4})-\d{4}" ) result = pattern.sub( r"\g<1>-####", data ) print(result) 결과 park 010-9999-#### kim 010-9909-#### lee 010-8789-#### \g<1> 첫 번째 그룹에서 매치된 문자열 을 의미한다. 따라서 010-9999 부분은 그대로 유지하고 9998 부분만 #### 로 변경한다. Q20. 전방 탐색 이메일 주소 중에서 마지막 도메인이 .com .net 인 경우만 매치하도록 만든다. 기본 패턴 .*[@].*[.].*$ 대략적으로 문자들 @ 문자들 . 문자들 형태의 이메일을 찾는다. 긍정형 전방 탐색 (?=...) 은 뒤에 특정 패턴이 있는지 확인하지만 해당 문자열 자체는 소비하지 않는다. 이를 이용하면 r".*[@].*[.](?=com$|net$).*$" 처럼 작성할 수 있다. 코드 import re pattern = re.compile( r".*[@].*[.](?=com$|net$).*$" ) print( pattern.match("test@gmail.com") ) print( pattern.match("test@daum.net") ) print( pattern.match("test@myhome.co.kr") ) 결과는 개념적으로 test@gmail.com → Match O test@daum.net → Match O test@myhome.co.kr → Match X 가 된다. 핵심 부분 (?=com$|net$) 을 해석하면 뒤에 com으로 끝나거나 또는 net으로 끝나야 한다. 라는 의미이다. (?=...) → 긍정형 전방 탐색 | → OR $ → 문자열 끝 📌 코딩 면허시험 핵심 정리 이번 문제들을 통해 지금까지 배운 파이썬 문법을 전체적으로 복습할 수 있다. 문제 핵심 개념 Q1 split() , join() Q2 딕셔너리 get() Q3 리스트 + , extend() Q4 for , if , 누적 Q5 함수, 피보나치 Q6 split() , map() , sum() Q7 range() , print(end=) Q8 파일 입출력, readlines() Q9 파일 입출력, 합계, 평균 Q10 클래스, 생성자, 메서드 Q11 모듈, sys.path Q12 try , except , finally Q13 enumerate() , 홀짝 판별 Q16 딕셔너리, 함수, 문자열 분리 Q17 정규식 [.] , {m,} Q18 search() , start() , end() Q19 그룹, sub() Q20 긍정형 전방 탐색 ⭐ 전체 학습 흐름 파이썬 기초 ↓ 자료형 ↓ 문자열 / 리스트 / 딕셔너리 ↓ if / while / for ↓ 함수 ↓ 파일 입출력 ↓ 클래스 ↓ 모듈 ↓ 예외 처리 ↓ 정규 표현식 ↓ 종합 문제 풀이 이번 문제에서 특히 다시 확인하면 좋은 부분은 split / join get extend map enumerate 파일 입출력 클래스 try-except-finally 정규 표현식 이다. 코딩 문제를 풀 때는 바로 정답 코드를 작성하려고 하기보다 입력값 → 필요한 처리 → 출력값 으로 문제를 먼저 나눈 뒤, 지금까지 배운 문법 중 무엇을 사용할지 생각하는 습관을 들이는 것이 중요하다.
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
점프 투 파이썬 DAY17(파이썬 초보 탈출 - 코딩 면허시험 문제풀이). 파이썬 초보 탈출 - 코딩 면허시험 문제풀이 목차 Q1. 문자열 바꾸기 Q2. 딕셔너리 값 추출하기 Q3. 리스트 더하기와 extend() Q4. 리스트 총합 구하기 Q5. 피보나치 수열 Q6. 숫자의 총합 구하기 Q7. 한 줄 구구단 Q8. 파일 역순 저장 Q9. 총합과 평균 구하기 Q10. Calculator 클래스 Q11. 모듈 불러오기 Q12. 오류와 예외 처리 Q13. DashInsert Q16. 모스 부호 해독 Q17. 기초 메타 문자 Q18. 문자열 검색 Q19. 그루핑 Q20. 전방 탐색 Q1. 문자열 바꾸기 문자열 a:b:c:d 에서 : 을 기준으로 문자열을 나누고 다시 # 으로 연결한다. 풀이 a =…
Open source