호록이
로그인 후 게시글을 볼 수 있습니다.
그린
> [모구모구 수리연구소 - 여름방학 응용수리 무료특강 (7월 9일 ~)](https://www.mogumath.co.kr/goods/lecture_info/27) ## 오늘의 수업 방향 오늘은 여름방학 응용수리 무료특강 3회차에서 풀었던 문제를 복기해 보겠다. ## 복기 이번 특강에서는 최단경로, 역증가율, 가중평균 등을 중심으로 문제를 풀었다. 고등학교 때 `최단경로` 문제를 풀던 기억도 나고 간단히 이동할 수 있는 경우의 수를 차례대로 더해 나가는 방식이라 어렵지 않은 유형이었다~ 저번 특강에서도 풀었던 `일률` 문제도 어김없이 등장했는데 일의 양을 적절한 숫자로 정한 뒤, 공통으로 나누어지는 수를 기준으로 잡는 방법을 다시 정리해볼 수 있었다. 후반부에는 `가중평균`과 비율 문제를 풀면서, 합/불합격자의 평균 점수, 남녀 비율 등의 조건을 가중치와 거리비를 이용하여 긴 방정식을 세우지 않고 푸는 방법을 익혔다. 이렇게 두 집단의 비율을 같은 기준으로 통일한 뒤 차이를 비교하는 방식이 여러 문제로 공통으로 적용되니 많은 문제를 접해보는 게 중요할 것 같다. 모구쌤이 말씀했듯이 강의가 끝나도 끝난게 아닌게 복습이 제일 중요하므로 각 풀이법을 외울 정도로 여러 번 풀어보고 실전에서 바로 활용할 수 있도록 해야겠다.
그린
> [모구모구 수리연구소 - 여름방학 응용수리 무료특강 (7월 9일 ~)](https://www.mogumath.co.kr/goods/lecture_info/27) # 모구모구 응용수리 특강을 듣게 된 계기 요즘 NCS를 준비하면서 가장 부담스럽게 느껴졌던 영역이 응용수리였다. 문제를 읽고 어떤 공식을 적용해야 할지 고민하는 데 시간이 오래 걸렸고, 풀이 방향을 잡아도 계산 과정에서 자주 막혔다. 특히 실제 시험에서는 한 문제에 많은 시간을 사용할 수 없기 때문에 응용수리를 어떻게 공부해야 할지 고민이 많았다. 그러던 중 NCS 응용수리는 모구모구 강의를 들으면 좋다는 말을 풍문으로 들었고, 마침 오구오구 강의를 듣고 있던 중, 바로 다음 단계인 보구보구의 풀이 방식을 실전으로 체험할 수 있는 기출문제 특강이 열린다는 소식을 듣고 신청하게 됐다. 보구보구는 수강 기한이 있어 오구오구를 모두 들은 뒤 결제하려고 했는데, 이번 특강을 통해 미리 수업 방식을 경험해 볼 수 있다는 점도 좋았다. 특강은 7월 9일부터 매주 목요일 오후 7시 30분부터 9시 30분까지 총 8회차로 진행된다. 공식적인 수업 시간은 두 시간이지만, 실제로는 내용을 충분히 설명해 주셔서 예정된 시간보다 조금 더 길게 진행되기도 했다. 또한 총 8회차 강의 수강 인증을 인스타그램에 올리면 추후 모구모구 수리연구소 사이트에서 현금처럼 사용할 수 있는 포인트를 인증 횟수에 따라 차등적으로 지급하는 챌린지도 함께 진행된다. 하지만 나는 인스타그램을 하지 않아서 포인트는 포기하고 ‘그냥 강의나 열심히 듣자’는 마음으로 첫 주 강의를 들었고, 2회차 특강에서 많은 문의가 들어왔는지 인스타그램뿐만 아니라 블로그 인증도 가능해졌다는 모구쌤의 말씀을 듣고 이렇게 후기를 작성하게 됐다. 그전에 한 가지 확인할 부분이 있었다. 무분별한 가계정 참여를 방지하기 위해 인증에 사용하는 인스타그램과 블로그 계정에 일정한 제한이 있었기 때문이다. 내 블로그는 다른 사람들과 활발하게 소통하기보다는 나만 사용하는 개인 기록용에 가까워서, 이런 블로그에 후기를 올려도 혜택을 받을 수 있는지 확신이 서지 않아서 모구쌤에게 직접 문의를 드렸다. 2회차 특강이 끝난 직후라 아주 늦은 시간이었는데도 빠르고 친절하게 답변해 주셨다. 인증만 제대로 부탁드린다며 개인 블로그에 작성해도 괜찮다고 해주셔서 안심할 수 있었다 ㅎㅎ 그럼 이제 지난주에 진행된 1회차 강의와 바로 어제 들은 2회차 특강에 대한 이야기를 해보겠다! --- ## 여러 공기업의 실제 기출문제를 다룬다 강의에서는 문화재단, 국민연금공단, 건강보험심사평가원, 보건산업진흥원, 중소벤처기업진흥공단, 코레일, 한국철도공사 등 여러 기관의 기출문제를 활용했다. 한 기관의 문제만 집중적으로 푸는 것이 아니라 여러 공기업의 문제를 함께 살펴볼 수 있어서 좋았다. 기관은 서로 달라도 응용수리 문제가 완전히 다르게 출제되는 것은 아니며, 자주 반복되는 대표 유형이 있다는 점을 확인할 수 있었다. 일반적인 연습문제보다 실제 기출문제를 통해 풀이 방법을 익히니 강의 내용이 더 현실적으로 다가왔다. 이런 문제가 실제 시험에 나오는구나 하며 문득문득 정신이 번쩍 드는 기분도 들었다. 또한, 문제를 모두 정석대로 풀기보다는 구조를 먼저 파악하고, 계산을 최대한 줄이는 방향으로 풀이가 진행됐다. 다음은 1회차와 2회차 강의에서 다룬 내용 중 특히 기억에 남았던 문제 유형과 풀이 방법을 복기해 보려고 한다. --- ### 1. 인수분해 인수분해는 중학교 과정에서 배우는 비교적 단순한 공식이다. 하지만 수학에 손을 놓은 지 꽤 오래돼서 처음에는 잠시 머뭇거리기도 했다. 그래도 분배법칙과 연결해서 다시 설명을 들으니 생각보다 금방 이해할 수 있었다. 머리로는 잊고 있었지만 손은 기억하고 있었던 것 같다. NCS에서 인수분해를 활용하는 문제는 계산하기 어려운 큰 수가 길게 나열되는 경우가 많았다. 처음 문제를 보면 큰 수를 모두 직접 계산해야 할 것처럼 느껴지지만, 공통된 부분을 묶거나 완전제곱식의 형태를 찾으면 계산 과정이 크게 줄어들었다. 예전 같았으면 숫자를 보자마자 곱셈부터 시작했겠지만, 강의를 듣고 나서는 먼저 식의 구조를 살펴봐야겠다는 생각이 들었다. 결국 계산형 문제에서도 중요한 것은 계산 속도 자체보다, 계산하지 않아도 되는 부분을 찾아내는 능력인 것 같았다. ### 2. 몰아넣기 조를 구성하거나 조건에 맞는 인원수를 구하는 문제는 경우를 하나씩 나누기 시작하면 계산이 복잡해지기 쉽다. 이번 강의에서는 이런 문제를 ‘몰아넣기’ 방식으로 정리하는 방법을 배웠다. 예를 들어 6명, 7명, 8명으로 구성된 조를 일정 개수 만들어야 하는 문제라면, 각각의 경우를 처음부터 따로 계산하지 않는다. 우선 모든 조를 특정 인원수로 구성했다고 가정한 뒤, 주어진 조건에 맞게 인원을 이동시키며 차이를 조정하는 방식으로 접근했다. 이 방법을 사용하니 복잡한 표나 긴 방정식을 만들지 않고도 필요한 조의 개수를 빠르게 찾을 수 있었다. 서로 다른 조건을 하나씩 처리하는 것이 아니라, 우선 하나의 기준으로 통일한 뒤 차이만 조정한다는 사고방식이 신선했다. 앞으로 비슷한 문제가 나오면 경우의 수를 무작정 나누기보다 먼저 한쪽으로 몰아넣을 수 있는지를 살펴봐야겠다. ### 3. 원화·달러·유로 단위 문제 환율 문제는 계산 자체보다 단위를 잘못 적용해서 틀리는 경우가 많다. 원화, 달러, 유로가 한 문제에 함께 나오면 무엇을 곱하고 무엇으로 나눠야 하는지 순간적으로 헷갈리기 일쑤다. 강의에서는 공식을 외우는 대신 단위를 하나씩 지우며 계산하는 방식으로 설명했다. 예를 들어 유로를 원화로 바꾼 뒤 다시 달러로 환전하는 문제라면, 각 환율을 순서대로 적용하면서 계산 과정에서 어떤 단위가 없어지고 최종적으로 어떤 단위가 남는지를 확인했다. 최종적으로 구하려는 것이 달러라면 계산식에도 달러 단위만 남아야 한다. 이렇게 생각하니 단순히 숫자만 보고 곱하거나 나누는 것보다 훨씬 덜 헷갈렸다. ### 4. 리그전과 조합 리그전 문제도 NCS 응용수리에서 자주 등장하지만, 리그전과 토너먼트가 한 문제에 함께 나오면 순간적으로 헷갈리곤 했다. 강의에서는 리그전의 경우 각 팀이 다른 팀과 한 번씩 경기한다는 구조를 조합으로 계산했다. 반면 토너먼트는 한 경기마다 한 팀이 탈락하므로 전체 경기 수가 ‘팀 수-1’이 된다는 원리로 접근했다. 공식을 무작정 암기하기보다 왜 그런 결과가 나오는지 그림으로 확인할 수 있어 기억에 더 잘 남았다. 리그전과 토너먼트가 함께 출제되더라도 각각의 경기 수를 구한 뒤 합하면 된다는 흐름도 명확해졌다. 조합 역시 팩토리얼을 길게 전개하기보다, 계산에 필요한 부분만 남기고 약분하는 방식으로 접근해 시간을 줄였다. 문제를 보자마자 공식을 적기보다는 순서를 고려하는 문제인지부터 판단하는 습관이 필요할 것 같다. ### 5. 일률과 거리비 일률 문제는 사람마다 일하는 속도가 다르고 작업 기간까지 함께 주어져 개인적으로 어려워했던 유형이다. 이번 강의에서는 같은 일을 기준으로 볼 때 일률과 시간은 서로 반비례한다는 관계를 중심으로 설명했다. 일률이 높은 사람은 같은 일을 더 짧은 시간에 끝내고, 일률이 낮은 사람은 더 오랜 시간이 걸린다. 따라서 일률의 비가 주어졌다면 시간의 비는 그 역수 관계가 된다. 이 관계를 먼저 잡고 나니 사람별 작업 시간을 모두 미지수로 놓고 복잡한 방정식을 세울 필요가 없었다. 거리비 문제도 마찬가지였다. 무작정 비례식을 세우는 것이 아니라 문제에서 무엇이 동일한 조건인지를 먼저 찾아야 했다. 시간이 같으면 거리는 속력에 비례하고, 거리가 같으면 시간은 속력에 반비례한다. 결국 일률이나 거리비 문제에서는 숫자를 바로 계산하기보다, 먼저 무엇이 같고 무엇이 비례하거나 반비례하는지를 표시하는 것이 중요했다. ### 6. 가중평균 가중평균은 ‘평균’이라는 표현 때문에 두 값을 더해 2로 나누는 단순 평균과 혼동하기 쉬운 유형이다. 하지만 각 항목의 비중이 다르다면 결과에 미치는 영향도 달라진다. 강의에서는 서로 다른 판매량이나 증감률이 주어진 문제를 통해, 기준값을 설정하고 각 항목의 비중에 따라 변화량을 반영하는 방법을 설명했다. 특히 큰 수와 작은 수가 함께 있는 문제에서는 두 값의 중간만 구한다고 답이 나오지 않았다. 전체에서 차지하는 비중이 큰 항목이 최종 결과에 더 많은 영향을 주기 때문이다. 공식만 외우기보다 어떤 항목이 전체 결과를 더 크게 움직이는지 생각하니 가중평균의 의미가 훨씬 쉽게 이해됐다. --- ## 응용수리의 부담을 줄일 수 있다는 기대가 드는 강의 응용수리는 같은 문제를 풀더라도 정석적인 방법으로 매번 긴 식을 세우면 실전에서 시간 부족을 해결하기 어렵다. 우선 문제를 풀기 전에 유형을 빠르게 구분할 수 있어야 할 것 같다. 이번 강의에서 다뤘던 일률, 거리비, 몰아넣기, 가중평균, 리그전과 조합, 비율, 단위 문제처럼 어떤 구조의 문제인지 먼저 파악하고, 그에 맞는 접근법을 선택해야 한다. 앞으로는 강의에서 배운 빠른 풀이와 내가 기존에 사용하던 풀이를 비교해 볼 생각이다. 정답을 맞힌 문제라도 풀이 시간이 오래 걸렸다면 다시 풀어보고, 불필요한 계산이나 더 간단하게 정리할 수 있는 부분이 있었는지 확인하려고 한다. 오답노트에도 전체 풀이를 그대로 옮겨 적기보다는 핵심적인 접근법을 짧게 남기는 것이 좋을 것 같다. 사실 강의를 듣기 전에는 응용수리를 잘하려면 계산이 빠르거나 타고난 수학적 감각이 있어야 한다고 생각했다. 그런데 모구쌤도 처음에는 수학의 바닥(?)에서 시작했고, 한 문제를 푸는 데 몇 시간이 걸리거나 힘들게 느껴지는 것이 당연하다고 말씀해 주셨다. 또한, 공식을 냅다 암기하지만 말고 수학 문제 유형은 범위가 그렇게 넓지 않으니 여러 번 풀어 내 것으로 만드는 게 중요하다는 생각을 심어주셨다. 아직 2주차 강의까지밖에 듣지 않았지만, 내가 생각했던 것보다 훨씬 빠르고 쉽게 응용수리 문제를 풀 수 있다는 점이 신선하게 다가왔다. 얼른 보구보구도 결제해서 배운 풀이법을 제대로 익히고, 응용수리 공부를 자신 있게 이어가고 싶다는 두근두근한 마음이 든다 ㅎㅎ 응용수리에서 항상 시간이 부족하거나, 문제마다 긴 방정식을 세우느라 어려움을 느끼는 사람이라면 들어볼 만한 강의라고 생각된다. 나도 이번에 배운 풀이법을 기출문제에 반복해서 적용하면서, 응용수리를 피해야 하는 영역이 아니라 점수를 확보할 수 있는 영역으로 만들어 볼 생각이다.
그린
> 참고1: [codetree Trail 0](https://www.codetree.ai/ko/trail-info/codetree-101){:target="_blank"}의 Chapter 2 - Lesson 1, 4 > 참고2: [codetree Trail 1](https://www.codetree.ai/ko/trail-info/novice-low){:target="_blank"}의 Chapter 1 - Lesson 1 # 1. 출력 ## 1-1. 문자열 출력 ### 1-1-1. 큰 따옴표`"` ```python print("Hello World") ``` ### 1-1-2. 작은 따옴표 `'` ```python print('Hello World') ``` ### 1-1-3. 큰 따옴표 3개 연속`"""` ```python # 예시 1 print("""Hello World""") ``` ```python # 예시 2 print(""" Hello World """) ``` ### 1-1-4. 작은 따옴표 3개 연속 `'''` ```python # 예시 1 print('''Hello World''') ``` ```python # 예시 2 print(''' Hello World ''') ``` --- ## 1-2. 특수 문자 포함시키기 ### 1-2-1. 문자 앞에 `\` 붙이기 ```python # 예시 1 print('Let\'s do it') ``` ### 1-2-2. `"""` or `'''`로 감싸기 ```python print('''Let's do it''') ``` --- ## 1-3. 줄바꿈 - 파이썬에서 print() 함수는 기본으로 줄바꿈이 됨 - 위->아래 순차적 실행 - `end="\n"`가 기본으로 들어감 ```python print("Hello World") print("Python is Fun") ``` ### 1-3-1. `\n`) ```python print("Hello World\nPython is Fun") # 위 두 줄과 같은 출력 (new line 특수문자 활용) ``` ### 1-3-2. `"""` or `'''` - 여러 줄에 해당하는 문자열을 한번에 담기 (위아래 여백 없이 작성) ```python # 올바른 예시 1 print("""Hello World # 위 두 줄과 같은 출력 Python is Fun""") # 잘못된 예시 1 print(""" Hello World Python is Fun """) ``` --- ## 1-4. `공백`으로 구분하여 출력 ### 1-4-1. 쉼표 `,` - print() 함수에서 여러 개의 인수를 공백으로 구분하려 출력할 때 사용 ```python print("a", "b", "c") # a b c ``` ### 1-4-2. `sep=` 파라미터 > 여러 인수들 사이에 삽입될 문자열(구분자)을 지정하는 옵션 - python 기본값은 공백(' ') ```python print("a", "b", sep="") # ab print("a", "b", sep=" ") # a b print("a", "b", sep=", ") # a, b ``` ### 1-4-3. `end=` 파라미터 > print() 함수의 출력이 끝난 후, 추가할 문자열을 지정하는 옵션 - python 기본값은 줄 바꿈(개행) 문자('\n\)로, 출력 후 자동으로 줄 바꿈이 수행됨 (print() 함수는 기본적으로 출력 후 줄 바꿈 수행하여 다음 출력이 새 줄에 나타남) ```python # 예시1 print("Hello", end="") print("World") # HelloWorld # 예시2 print("Hello", end=" ") print("World") # Hello World ``` ### 1-4-4. sep과 end를 함께 사용 ```python print("사과", "바나나", "체리", sep=", ", end=" ") print("이어지는 내용입니다.") # 사과, 바나나, 체리 이어지는 내용입니다. ``` --- ## 1-5. 출력 형식 ### 1-5-1. f-strings (f-문자열) ```python # 예시1 name = "호록이" age = 2 print(f"이름: {name}, 나이: {age}") # 이름: 호록이, 나이: 2 # 예시2 print(f"1 + 1 = {1 + 1}") # 1 + 1 = 2 ``` - print() 함수에서 중괄호('{}') 안에 변수나 표현식을 넣어 출력 가능 - 문자열 앞에 `f` 접두사를 붙여 사용 - 기존의 문자열 포맷팅 방식보다 더 간결·직관적 - 소수점 형식 `{변수:포맷} `지정하여 원하는 자릿수 출력 (n 지정 시, 솟수점 n + 1번째 자리에서 반올림 후, 소수점 n번째 자리까지 출력) ```python # 예시 1 pi = 3.141592653589793 print(f"파이: {pi:.4f}") # 파이: 3.1416 (소수점 이하 2자리까지 반올림하여 출력) # 예시2 weight = 13 ratio = 0.165 print(f"{weight} * {ratio:.06f") = {weight * ratio:.06f}") # 13 * 0.165000 = 2.145000 (자릿수의 공백을 0으로 채움) ``` ## 1-6. 특수 문자 & 이스케이프 시퀀스 ### 1-6-1. `\n` (줄 바꿈) ```python print("첫 번째 줄\n두 번째 줄") # 첫 번째 줄 # 두 번째 줄 ``` ### 1-6-2. `\t` (탭) ```python print("이름\t나이\t키") print("호록이\t2\t120.5") # 이름 나이 키 # 호록이 2 120.5 ``` [[코드트리 추천 링크]](https://www.codetree.ai/accounts/sign-up-only?referralCode=th2gr22n) https://www.codetree.ai/ko/trail-info?referralCode=th2gr22n
그린
1. 왼쪽 상단 애플 로고 클릭 2. 시스템 설정 클릭 3. 왼쪽 사이드 바 中 '사용자 및 그룹' 4. 바꾸고 싶은 사용자 칸에서 오른쪽 클릭 후, 고급 옵션 클릭 5. 목록 중 '전체 이름'을 원하는 이름으로 수정 후, 확인 버튼 클릭 (완료) 6. 맥북 재시동 후, 잘 적용됐는지 확인해보기!
그린
> 참고: [코드잇 - 프로그래밍 시작하기 in Python](https://www.codeit.kr/topics/getting-started-with-python){:target="_blank"} # 1. `함수` > 명령을 저장하는 역할 - 내장 함수: 프로그래밍 언어에서 미리 구현해 놓아 기본으로 제공되는 함수 ```python (1) 함수 정의 (헤더 + 바디) def 함수명(): # 함수의 ‘헤더’ (파라미터가 들어감) print(“출력할 내용”) # 함수의 ‘바디’ 함수명() # 함수 호출 (인자가 들어감) 함수명() ``` ## 1-1. `파라미터` > 함수에 넘겨주는 값으로, 함수를 정의할 때 쓰는 '매개변수' (1) 파라미터가 1개 ```python def hello(name): print(“Hello!”) print(name) print(“Welcoem to Codeit!”) hello(“Michael”) ``` (2) 파라미터가 여러개 ```python def print_sum(a, b, c): print(a + b + c) print_sum(7, 3, 2) ``` ## 1-3. `return` > 어떤 정보를 주면 계산된 정보를 돌려주는 것
그린
> 참고: [codetree Trail 0](https://www.codetree.ai/ko/trail-info/codetree-101){:target="_blank"}의 Chapter 3, 5 # 1. 조건문 > 프로그램이 특정 조건을 만족할 때만 특정 코드를 실행하게 하는 구조 ## 1-1. 기본 구조 ### 1-1-1. 조건 > 참 또는 거짓으로 평가되는 표현식 ### 1-1-2. 실행할 동작 > 조건이 참일 때 수행되는 행동 --- ## 1-2. if ```python if 조건: 실행할 동작 ``` - 실행할 동작에서는 정확한 코드 블록 구분위해 `들여쓰기`(tab·띄어쓰기 4칸) 중요 - 올바르지 않은 들여쓰기는 `IndentationError` 오류 발생 (파이썬의 코드 블록 시작 인식 불가) - 단일(첫 번째) 조건이 참이면 해당 코드 블록 실행 - 단일 조건이 거짓이면 해당 코드 블록 건너뜀 ### 1-2-1. 조건 표현식 - If 문에서는 True 또는 False로 평가되는 모든 논리적 수식을 조건으로 사용한다. - [비교 연산자](/horok-log/feeds/posts/36#3-2-비교-연산자){:target="_blank"}로 만듦. ```python # 예시1 age = int(input()) if age >= 18: print('성인입니다') print('good') print('확인 완료되었습니다') # 출력1 (입력 20) 성인입니다 good 확인 완료되었습니다 # 출력2 (입력 10) 확인 완료되었습니다 ``` --- ## 1-3. else ### 1-3-1. if-else 문 > 조건에 따라 두 가지 경우 중 하나를 `선택적`으로 실행하는 조건문 ```python if 조건: 조건이 True일 때 실행되는 코드 else: 조건이 False일 때 실행되는 코드 ``` - 조건이 참이면 if 블록(만약 그러면)의 코드가 실행되고, 조건이 거짓이면 else 블록(그렇지 않다면)의 코드 실행 - 단, else 없이 if 문 `단독` 사용 가능 (특정 조건일 때만 실행하고 그렇지 않을 때는 아무 것도 하지 않을 수 있다.) - if 문의 확장으로, 거짓일 때 수행할 동작(참/거짓)을 명확히 정의하므로 프로그램의 흐름을 더 명확 + 예측 가능하게 함 --- ## 1-4. elif(=else if) ### 1-4-1. if-elif-else 문 > 하나의 조건만 확인하는 if 문보다 더 다양한 상황을 처리할 수 있도록 하는 조건 분기 구조 ```python if 조건1: 조건1이 True일 때 실행할 코드 elif 조건2: 조건1이 False이면서, 조건2가 True일 때 실행할 코드 elif 조건3: 조건1, 조건2가 False이면서, 조건3이 True일 때 실행할 코드 else: 조건1, 조건2, 조건3이 False일 때, 실행할 코드 ``` - `elif` 는 2개 이상의 추가 조건을 순차적으로 여러 조건을 검사하며 각 조건에 맞는 코드 실행 - `else` 는 모든 조건이 만족하지 않을 때 해당 코드 블록 실행 - 가장 위 if 조건을 만족하면(만약 그렇다면) 해당 코드만 실행하고 - 만족하지 않으면(그렇지 않고) 다음 elif 조건 확인(만약 그렇다면) - if 와 elif 조건이 만족하지 않으면(위 조건들이 모두 아니면) else 블록 코드 실행 - if-elif-else 문에서, `앞의 조건에서 참이 나오면 그 뒤의 나머지 elif 와 else 문은 실행되지 않`음 ### 1-4-2. elif와 else의 선택적 사용 - if-elif-else 구조에서 상황에 따라 필요에 맞게 elif 와 else 는 선택적 사용 가능 (생략 가능) #### 1-4-2-1. if-else 만 사용 ```python if 조건: 조건이 True일 때 실행할 코드 else: 조건이 False일 때 실행할 코드 ``` - 특정 조건이 참일 때와 거짓일 때, 두 가지 경우만 처리 #### 1-4-2-2. if-elif 만 사용 ```python if 조건1: 조건1이 True일 때 실행할 코드 elif 조건2: 조건1이 False이면서, 조건2가 True일 때 실행할 코드 elif 조건3: 조건1, 조건2가 False이면서, 조건3이 True일 때 실행할 코드 ``` - 여러 조건을 확인하되, 모든 조건이 거짓일 때 특별히 처리할 필요가 없을 때 사용 --- ## 1-5. [논리 연산자](/horok-log/feeds/posts/36#3-3-논리-연산자){:target="_blank"} 활용 조건문 - 조건이 2개 이상일 때 `복합 조건`문 만들 때 사용 - 보다 복잡한 논리 구조 구현 가능하게 도움 ### 1-5-1. and - 모든 조건이 참일 때, 전체 조건은 참 (조건1 or 조건2") ```python # 예시1 ("회원이 아닙니다"가 출력되는 선택지를 모두 고르시오.) age = int(input("나이를 입력하세요: ")) member = input("회원입니까? 맞으면 1, 아니면 0을 입력하세요: ") if age >= 18 and member == 1: print("서비스를 이용할 수 있습니다.") elif age >= 18: print("회원이 아닙니다.") else: print("미성년자는 이용할 수 없습니다.") # ① 20\n1 # ② 18\n0 ✅ # ③ 17\n1 # ④ 15\n0 # ⑤ 20\n0 ✅ ``` ### 1-5-2. or - 하나 이상의 조건이 참일 때, 전체 조건은 참 (조건1 or 조건2) - 예외 조건을 포함해야 할 때 괄호()와 함께 전체 조건 구성 가능 ```python # 예시1 (성인이 되기 위한 전체 조건) (나이 >= 18 and 시민권 보유) or 특별 허가 # 예시2 (윤년 판단하기) year = 2000 if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0): print(f"{year}년은 윤년입니다.") else: print(f"{year}년은 윤년이 아닙니다.") # 2000년은 윤년입니다. ``` --- ## 1-6. 중첩 조건문 ```python if 조건1: # 조건1이 참일 때 실행하는 코드 if 조건2: # 조건1과 조건2가 모두 참일 때 실행하는 코드 else: # 조건1은 참이지만 조건2는 거짓일 때 실행하는 코드 else: # 조건1이 거짓일 때 실행하는 코드 ``` > if 문 안에 또 다른 if 문을 사용하는 것 - 한 가지 큰 조건을 먼저 확인 후, 그 조건이 참일 때만 추가 조건을 세분화하여 처리 - 복잡한 상황을 단계별로 나누어 깔끔하게 처리 ```python # 예시1 (해외 여행을 떠나기 전 조건 확인하기) 여권_valid = True # 여권 유효 여부 비자_required = False # 비자 필요 여부 if 여권_valid: # 여권이 유효한 경우 if 비자_required: print("비자를 발급받습니다.") else: print("바로 여행을 떠납니다.") else: # 여권이 유효하지 않은 경우 print("여권을 갱신하거나 새로 발급받습니다.") ``` ```python # 예시2 (3개의 정수 A, B, C를 입력받았을 때, 중앙값을 구하는 프로그램을 작성하기) # 중앙값: 오름차순 나열 시, 중앙에 오는 값 a, b, c = list(map(int, input().split())) if a > b: if b > c: print(b) elif c > a: print(a) else: print(c) else: if c < a: print(a) elif b < c: print(b) else: print(c) ``` [[코드트리 추천 링크]](https://www.codetree.ai/accounts/sign-up-only?referralCode=th2gr22n) https://www.codetree.ai/ko/trail-info?referralCode=th2gr22n
그린
이번에 새 노트북을 장만하면서 개발 환경 구축과 앱 설치 등을 다시 새로 하게 됐다. Homebrew부터 설치하고 앱 설치를 진행해보자! ```bash /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ``` 위 명령어를 실행하면 PC 패스워드 입력과 Xcode 명령줄 도구가 필요하다는 메시지가 뜰 것이다. 둘 다 완료 후, 환경 변수를 설정해 주면 된다. ```bash echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile eval "$(/opt/homebrew/bin/brew shellenv)" ``` 설치가 완료되면 다음 명령어가 정상적으로 실행될 것이다. ```bash brew --version ```
그린
> 참고: [codetree Trail 0](https://www.codetree.ai/ko/trail-info/codetree-101){:target="_blank"}의 Chapter 4, 8~9 # 1. 반복문 ```python for i in range(반복횟수): # 변수가 따로 필요 없으면 i는 _로 대체 가능 실행할 코드 ``` > 반복 작업을 효율적으로 처리하는 구문 ## 1-1. for ### 1-1-1. range() > 지정된 범위의 수를 생성하는 함수 - 반복 횟수가 명확할 때 사용 (1) 인자가 `한` 개 - `range(stop)` - 0부터 시작해서 stop(끝값) - 1(인자로 전달된 값)까지 값에 대한 반복 - stop 값은 `포함 X` (2) 인자가 `두` 개 - `range(start, stop)` - start(`시작값`)부터 시작해서 stop - 1 값까지에 대한 반복 - start의 기본값은 `0` ```python for i in range(2, 6): print(i) # 2 # 3 # 4 # 5 ``` (3) 인자가 `세` 개 - `range(start, stop, step)` - start부터 stop을 지나치기 전까지 step(`증가값`)만큼 더해 반복 - 수 간의 간격인 step의 기본값은 `1` ```python # 예제1 (`양수` step) for i in range(1, 10, 2): print(i) # 1 # 3 # 5 # 7 # 9 # 예제2 (`음수` step, B부터 A까지 1씩 감소하는 모든 값 출력) A, B = map(int, input().split()) # 2 5 for i in range(B, A - 1, -1): print(i, end=' ') # 5 4 3 2 ``` --- ## 1-2. while ```python while 조건: 실행할 코드 ``` > 주어진 조건이 참인 동안 계속 코드를 실행하는 반복문 ```python # 예시1 (1부터 시작해 값을 2배씩 증가시키면서 x보다 작을 때까지 반복) x = 100 num = 1 while num < x: # num이 x보다 작으면 계속 실행 (num이 x 이상이 되는 순간 반복 멈춤) print("현재 값:", num) num *= 2 # 반복이 진행될수록 num 값은 2배씩 증가 # 예시2 n = 10 while n > 2: n -= 2 print(n) # 2 ``` - 몇 번 반복할지 중요하지 않고, 조건을 만족(참)하는 동안 `계속` 반복 진행 (<-> if 문은 조건이 참일 때 코드 한 번 실행) - 반복 횟수가 명확하지 않을 때, 조건이 언제 거짓이 될지 모르거나 참인 조건이 유지되는 시점까지 계속 반복해야 할 경우 사용 (≈if 문의 반복 실행) - 반복 조건이 언젠가 거짓이 되도록 로직을 설계해야 무한 반복을 방지 가능 ### 1-2-1. 무한 루프 > 조건이 항상 참이라 종료되지 않는 루프 - 사용자가 프로그램을 강제로 종료하지 않는 이상 계속 출력 ```python while True: print("무한 루프") # 무한 루프 # 무한 루프 ... ``` ```python ... while n != 1: # n이 1이 될 때까지 반복 ... ``` ### 1-2-2. 무한 루프 탈출법 (1) `break`문 > 반복문을 즉시 `종료`시키는 제어문 - 특정 조건을 만족하면 반복문 전체를 중단 ```python # 예시 1 while True: user_input = input("종료하려면 'exit'를 입력하세요: ") if user_input == "exit": break print("입력한 값:", user_input) # 사용자가 'exit' 입력하면 루프 종료하고, 그렇지 않으면 입력한 값 출력 ``` ```python # 예시2 (num이 3인 경우, 반복문 종료) for num in range(1, 6): print(f"{num}번째 반복문 시작") if num == 3: # num이 3이 되는 순간 break # 반복문 종료 print(num) # 출력: # 1번째 반복문 시작 # 1 # 2번째 반복문 시작 # 2 # 3번째 반복문 시작 ``` (2) `조건` 활용 - while 문의 반복 조건 설정으로 break 문 없이 반복을 종료 - 특정 조건이 만족될 때까지만 반복 계속 (유동적인 반복 횟수 설정) ```python num = -1 while num <= 0: num = int(input("양수를 입력하세요: ")) # 양수를 입력하면 루프 종료하고, 맨 마지막 출력문 실행 if num <= 0: print("양수가 아닙니다. 다시 시도하세요.") print("입력한 양수:", num) ``` (3) `사용자 입력` - 사용자 입력에 따라 반복을 계속하거나 종료 ```python correct_password = "python123" attempts = 0 max_attempts = 3 while attempts < max_attempts: password = input("비밀번호를 입력하세요: ") if password == correct_password: print("로그인 성공!") break else: attempts += 1 print(f"비밀번호가 틀렸습니다. {max_attempts - attempts}회 남았습니다.") else: print("로그인 시도 횟수를 초과했습니다.") ``` --- ## 1-3. 반복문 흐름 `제어` ### 1-3-1. `continue` > 현재 반복을 `건너뛰고` 다음 반복으로 `넘어가`게 하는 제어문 ```python # 예시1 (num이 짝수인 경우만 반복을 넘길 때) for num in range(1, 6): print(f"{num}번째 반복문 시작") if num % 2 == 0: continue print(num) # 출력: # 1번째 반복문 시작 # 1 # 2번째 반복문 시작 # 3번째 반복문 시작 # 3 # 4번째 반복문 시작 # 5번째 반복문 시작 # 5 ``` ```python # 예시2 (num이 음수나 0이면 건너뛰고, 양수일 때만 출력) numbers = [10, -5, 7, -3, 0, 12, -1] print("양수 목록:") for num in numbers: if num <= 0: continue print(num) # 출력: # 양수 목록: # 10 # 7 # 12 ``` --- ## 1-4. `이중` for문 > 하나의 for 문 안에 또 다른 for 문을 중첩하는 반복문 ```python for i in range(반복횟수 1): for j in range(반복횟수 2): # 반복되는 코드 ``` - 2차원 구조나 반복이 필요한 복잡한 패턴 쉽게 처리 가능 ```python # 예시 1 for i in range(100): # 아래 반복문을 100번 반복 for j in range(1, 101): # 1부터 100까지 반복 print(j, end=" ") print() # 한 줄 출력 후 줄바꿈 ``` ### 1-4-1. `외부`에 변수 - 변수 선언: 외부 for문 `외부` - 변수 초기화: 반복문 시작 전 딱 한 번 - 변수 누적: 모든 반복 과정 / 이중 for 문 전체에서 유지 / 전체 반복을 통틀어 누적 ```python total_cnt = 0 # 외부 for문 전에 변수 선언 for i in range(3): # 외부 반복문 for j in range(5): # 내부 for문 total_cnt += 1 print(f"전체 반복 횟수: {total_cnt}") # 15 (외부 3번 실행 x 내부 5번 실행 = 15번 반복) ``` ### 1-4-2. `내부`에 변수 - 변수 선언: 외부 for문 `내부` - 변수 초기화: 외부 for 문이 반복될 때마다 / 내부 for 문이 한 번 돌 때마다 새로 생성 - 변수 누적: 각 외부 for 문마다 (반복이 시작될 때마다) 독립적으로 계산(초기화) - 각 외부 for 문에서 내부 for 문이 몇 번 반복했는지 개별 기록 가능 - 루프별 합계 ```python for i in range(3): # 외부 반복문 cnt = 0 # 외부 반복문이 돌 때마다 cnt를 0으로 초기화 (내부 변수 선언) for j in range(5): # 내부 반복문 cnt += 1 print(f"{i}번째 외부 for문에서의 내부 for문 반복 횟수: {cnt}") # 5 (각 (외부 for 문이 시작될 때)마다 0으로 초기화되고, 내부 for 문이 5번 실행될 때마다 5로 증가(계산됨)) ``` ### 1-4-3. `별표` 패턴 출력 - 세로로 3칸, 가로로 6칸 모양의 별표 패턴 출력하기 - 외부 반복문은 총 6번 실행되고, 한 번 실행될 때마다 내부 반복문이 3번 실행됨 (1) `내부` 반복문 - `열(column)` 제어 ```python for j in range(cols): print('*', end=" ") ``` (2) `외부` 반복문 - 내부 for 문의 반복 작업 제어 - `행(row)` 제어 ```python # 예시 1 (내부 반복문에서의 continue) for i in range(rows): (내부 반복문) print() ``` ### 1-4-4. 2차원(이중) for 문에서의 흐름 제어 (1) continue > 현재 반복(실행중인 반복문에서의 이번 반복)만 건너뛰고, 다음 나머지 반복을 계속 진행하도록 하는 제어문 - 이중 for문에서는, continue가 속해 있는 가장 안쪽 for 문의 반복만 건너뛰고, 외부 반복문은 계속 진행됨 ```python for i in range(1, 4): # 외부 반복문 (i는 1부터 3까지) for j in range(1, 6): # 내부 반복문 (j는 1부터 5까지) if j == 3: continue # j가 3일 때, 내부 for문의 이번 반복만 건너뜀 print(f"i={i}, j={j}") # j가 3일 때만 건너뛰어 print를 실행하지 않음 # 출력 """ i=1, j=1 i=1, j=2 i=1, j=4 i=1, j=5 i=2, j=1 i=2, j=2 i=2, j=4 i=2, j=5 i=3, j=1 i=3, j=2 i=3, j=4 i=3, j=5 """ ``` ```python # 예시 2 (외부 반복문에서의 continue) for i in range(1, 4): # 외부 반복문 (i는 1부터 3까지) if i == 2: continue # i가 2일 때, 외부 for문의 이번 반복만 건너뜀 for j in range(1, 6): # 내부 반복문 (j는 1부터 5까지) print(f"i={i}, j={j}") # 출력 """ i=1, j=1 i=1, j=2 i=1, j=3 i=1, j=4 i=1, j=5 i=3, j=1 # i == 2일 때만 건너뛰어 출력 X i=3, j=2 i=3, j=3 i=3, j=4 i=3, j=5 """ ``` (2) break 문 > 해당 반복문(내부 or 외부) 전체를 즉시 종료하는 제어문 - 이중 for 문에서는 break가 속해 있는 가장 안쪽 for 문을 즉시 종료하고 바깥쪽으로 빠져나감 - 내부 반복문에서 break를 만나면 내부 반복문만 종료하고 외부 반복문은 계속 진행 - 외부 반복문에서 특정 조건을 만족했을 때, break 사용하면 그 시점에 전체 이중 반복문 종료 ```python # 예시 1 ( 내부 반복문에서의 break) for i in range(1, 4): # 외부 반복문 (i는 1부터 3까지) for j in range(1, 6): # 내부 반복문 (j는 1부터 5까지) if j == 3: break # j가 3이 되는 순간, 내부 반복문 자체를 완전히 종료 print(f"i={i}, j={j}") # 출력 """ i=1, j=1 i=1, j=2 i=2, j=1 i=2, j=2 i=3, j=1 # 외부 반복문은 i=2, i=3 일때 계속 진행 (내부 반복문은 매번 처음부터 다시 시작) i=3, j=2 """ ``` ```python # 예시 2 (외부 반복문에서의 break) for i in range(1, 4): print(f"[외부 반복문 시작] i={i}") if i == 2: break # 외부 반복문에서 i가 2가 되는 순간, 곧바로 전체 반복 종료 (i=1 일 때의 내부 반복문만 실행) for j in range(1, 6): print(f" i={i}, j={j}") # 출력 """ [외부 반복문 시작] i=1 i=1, j=1 i=1, j=2 i=1, j=3 i=1, j=4 i=1, j=5 [외부 반복문 시작] i=2 """ ``` ### 1-4-5. 가운데 정렬된 삼각형 ```python n = 5 for i in range(1, n + 1): # 공백 출력 for j in range(n - i): print(" ", end=" ") # 첫 줄은 8개의 공백(공백 2개씩 4번)과 1개의 별 출력, 두 번째 줄은 6개의 공백(공백 2개씩 3번)과 3개의 별 출력,.. # 별 출력 for j in range(2 * i - 1): print("*", end=" ") print() """ * * * * * * * * * * * * * * * * * * * * * * * * * """ ``` ### 1-4-6. 세로로 정렬된 구구단 출력 ```python for i in range(2, 10): for j in range(1, 10): print(f"{i} x {j} = {i*j}") print("-" * 20) """ 2 x 1 = 2 2 x 2 = 4 ... 2 x 9 = 18 -------------------- ... 9 x 9 = 81 -------------------- """ ``` ### 1-4-7. 정상적인 구구단 (1) 문제: 정수 N의 값이 주어지면 N x N 모양 구구단 출력 (2) 입력: 첫 번째 줄에 N 주어짐 (3) 출력: N의 값에 따른 구구단을 입출력 예제처럼 출력 (4) 예제 ```python # 입력 3 # 출력 1 * 1 = 1, 1 * 2 = 2, 1 * 3 = 3 2 * 1 = 2, 2 * 2 = 4, 2 * 3 = 6 3 * 1 = 3, 3 * 2 = 6, 3 * 3 = 9 ``` (5) 풀이: ```python # 풀이1 N = int(input()) for i in range(1, N + 1): for j in range(1, N + 1): print(f"{i} * {j} = {i * j}", end="") if j != N: # 마지막이 아닐 때만 콤마+공백 출력 print(", ", end="") print() ``` ```python # 풀이2 n=int(input()) for i in range(1,n+1): for j in range(1,n+1): if j < n: print(f"{i} * {j} = {i*j}",end=", ") else: print(f"{i} * {j} = {i*j}",end="") print() ``` --- ## 1-5. 퀴즈 ### 1-5-1. 짝수만 거꾸로 출력하기 (1) 문제: N개의 정수가 주어질 때, 입력에서 주어진 순서의 역순으로 짝수만 출력 (2) 입력: 첫 줄에 정수 N, 그 다음 줄에 N개의 정수가 차례대로 공백으로 구분되어 주어짐 (3) 출력: 첫 줄에 N개의 정수 중 짝수만, 주어진 순서의 역순으로 출력 (4) 예제 ```python # 입력 6 3 1 4 5 6 2 # 출력 2 6 4 ``` (5) 풀이 ```python # 풀이1 N = int(input()) nums = list(map(int, input().split())) # map 함수로 감싸면 리스트가 아닌 map 객체가 됨 for num in nums[::-1]: # map 객체는 슬라이싱 불가 if num % 2 == 0: print(num, end=" ") # 풀이2 N = int(input()) nums = list(map(int, input().split())) for num in reversed(nums): if num % 2 == 0: print(num, end=" ") ``` ### 1-5-2. 친근하지 않은 수 (1) 문제: 1이상 N 이하의 정수 중 친근하지 않은 수의 개수를 출력, 이때 친근한 수는 2, 3 또는 5로 나누어 떨어지는 수이다. (2) 입력: 첫 번째 줄에 정수 N이 주어짐 (3) 출력: 첫 번째 줄에 1이상 N 이하의 수 중 친근하지 않은 수 개수 출력 (4) 예제: ```python # 입력 10 # 출력 2 ``` (5) 풀이 ```python # 풀이1 N = int(input()) cnt = 0 for i in range(1, N + 1): if i % 2 and i % 3 and i % 5: cnt += 1 print(cnt) # 풀이2 N = int(input()) cnt = 0 for i in range(1, N + 1): if i % 2 == 0 or i % 3 == 0 or i % 5 == 0: continue cnt += 1 print(cnt) ``` ### 1-5-3. 배수의 개수 (1) 문제: 10개의 수가 주어질 때, 3의 배수의 개수와 5의 배수의 개수 출력 (2) 입력: 입력으로 10개의 수가 한 줄에 하나씩 주어짐 (3) 출력: 첫 번째 줄에 3과 5의 배수의 개수를 공백을 사이에 두고 출력 (4) 예제: ```python # 입력 7 42 10 54 34 55 57 60 30 50 # 출력 5 5 ``` (5) 풀이: ```python # 예시1 cnt_3 = cnt_5 = 0 for _ in range(10): n = int(input()) if n % 3 == 0: cnt_3 += 1 if n % 5 == 0: cnt_5 += 1 print(cnt_3, cnt_5) ``` ```python # 잘못된 예시1 cnt_3 = cnt_5 = 0 for _ in range(10): n = int(input()) if n % 3 == 0: cnt_3 += 1 elif n % 5 == 0: # 바로 위의 if문이 참이면 elif 문은 실행 하지 않음 cnt_5 += 1 print(cnt_3, cnt_5) ``` ```python # 잘못된 예시2 cnt_3 = cnt_5 = 0 nums = map(int, input()) # 수를 한줄로 1개만 받음 for num in nums: if num % 3 == 0: cnt_3 += 1 elif num % 5 == 0: cnt_5 += 1 print(cnt_3, cnt_5) ``` ### 1-5-4. 0 나올때까지 출력 (1) 문제: 정수를 계속 입력받다가 0이 입력되기 전까지의 결과를 그대로 출력 (2) 입력: 입력으로 몇 개의 줄이 들어올지는 정해져 있지는 않으며, 각 줄에는 하나의 정수가 주어진다. (그 중 적어도 하나는 0임을 가정해도 좋음) (3) 출력: 0이 주어지기 전까지의 결과를 한 줄에 하나씩 순서대로 출력 (4) 예제: ```python # 입력 3 5 0 # 출력 3 5 ``` (5) 풀이: ```python while True: # 언제 끝날지 모르므로 계속 반복 n = int(input()) # 변수 선언 (반복문 밖에 -1보다 효율적) if n == 0: break print(n) # n이 0이 아닌 경우에 계속 값 출력 ``` ### 1-5-5. A 부터 B 까지 (1) 문제: 정수 A부터 B까지의 수를 출력하기. A에서 시작하여 조건에 맞춰 수를 변경하다 `B보다 커지는 순간에 종료`해야 하며, 수가 바뀌는 조건은 다음과 같다. - 수가 홀수일 땐 2배가 된다. - 수가 짝수일 땐 3만큼 증가 (2) 입력: 첫 번째 줄에 정수 A, B가 공백을 사이에 두고 주어짐 (3) 출력: 첫 번재 줄에 수들을 공백을 사이에 두고 출력한다. A에서 시작하여 순서로 출력하되, B를 넘기 전까지만 출력 (4) 예제 ```python # 입력 2 13 # 출력 2 5 10 13 ``` (5) 풀이: ```python A, B = map(int, input().split()) while True: print(A, end=" ") if A % 2: A *= 2 else: A += 3 if A > B: break ``` [[코드트리 추천 링크]](https://www.codetree.ai/accounts/sign-up-only?referralCode=th2gr22n) https://www.codetree.ai/ko/trail-info?referralCode=th2gr22n
그린
> 참고: [codetree Trail 0](https://www.codetree.ai/ko/trail-info/codetree-101){:target="_blank"}의 Chapter 7 # 1. 문자열<sup>string</sup> > 문자의 모음(집합)으로 이루어진 자료형 > 한 번 생성하면 요소를 직접 변경할 수 없는 `불변(immutable)` 자료형 - 작음·홑따옴표(')나 큰·쌍따옴표(")로 감싸서 표현 - 여러 줄로 이루어진 문자열은 `삼중 따옴표(""" · ''')`사용 ```python """삼중 따옴표를 이용한 여러 줄 문자열 작성된 문자열입니다.""" # 빈 문자열 empty_str = "" ``` ## 1-1. 문자열 생성 & 초기화 ### 1-1-1. 직접 값 나열 ```python # 문자열 직접 할당 message = "안녕하세요!" ``` ### 1-1-2. str() 함수 - 다른 데이터 타입을 문자열로 변환 ```python number = 123 text = str(number) print(text) # "123" ``` --- ## 1-2. 인덱싱 - 특정 문자를 인덱스로 접근 가능 (0부터 시작) ```python text = "Python" # 예시1 print(text[0]) # 출력: P print(text[3]) # 출력: h # 예시2 print(text[-1]) # 출력: n print(text[-4]) # 출력: t # 예시3 (오류) print(text[6]) # 문자열 범위를 초과하는 인덱스 (IndexError) ``` --- ## 1-3. 문자열 변경 (값 수정) - 불변 자료형은 직접 수정 불가하므로, 새 문자열 생성 필요 ```python text = "Python" # 특정 문자를 변경하려고 시도 text[0] = "J" # 오류 발생 ``` --- ## 1-4. 문자열 덧셈(연결) - `+` 연산자를 사용하여 2개 이상의 문자열을 연결하여 하나의 문장 생성 - 다른 데이터 타입은 바로 연결 불가하므로, 형변환 필요 ```python str1 = "Hello, " str2 = "World!" print(str1 + str2) # Hello, World! ``` --- ## 1-5. 문자열 곱셈(반복) - `*` 연산자를 사용하여 특정 문자열을 지정된 횟수만큼 반복 - 반복 횟수는 음수 값이 아닌 정수 - 문자열 패턴을 나타내므로, 반복되는 문자열 생성에 사용 ```python str1 = "Hi " print(str1 * 4) # Hi Hi Hi Hi ``` --- ## 1-6. 문자열 슬라이싱 > 문자열의 특정 부분만 쉽게 추출하는 방법 ```python 문자열[start:end] ``` - 긴 문자열에서 원하는 부분만 따로 사용하거나 확인할 때 사용 ```python text = "Python is fun" print(text[1:4]) # yth ``` ### 1-6-1. start 또는 end 생략 - start 생략: 문자열의 `첫 번째 요소(인덱스 0)부터` 시작 - end 생략: 문자열의 `마지막 요소까지` 포함 - 둘 다 생략: 문자열의 `처음부터 끝까지` `전체` ```python text = "Python is fun" print(text[:5]) # Pytho print(text[2:]) # thon is fun print(text[:]) # Python is fun print(text[-5:]) # s fun ``` ### 1-6-2. step(간격) 지정 - 기본값은 1이며, 2 이상을 주면 해당 간격만큼 건너뛰며 추출 - 음수 값을 주면 리스트를 거꾸로 뒤집어서 추출 ```python text = "Python is fun" print(text[::2]) # Pto sfn print(text[::-1]) # nuf si nohtyP ``` --- ## 1-7. 문자열 메서드 ### 1-7-1. `대소문자` 변환 (1) `upper()`: 문자열의 모든 문자를 `대문자`로 변환 (2) `lower()`: 문자열의 모든 문자를 `소문자`로 변환 ```python text = "Python Programming" print(text.upper()) # "PYTHON PROGRAMMING" print(text.lower()) # "python programming" ``` ### 1-7-2. `공백`문자 `제거` (1) `strip()`: 문자열 `양쪽`에 있는 공백(\n, \t 포함) 문자 제거 (2) `lstrip()`: 문자열 `왼쪽(앞쪽)`에 있는 공백 또는 지정 문자 제거 (3) `rstrip()`: 문자열 `오른쪽(뒤쪽)`에 있는 공백 또는 지정 문자 제거 ```python text = " Hello, World! " print(text.strip()) # "Hello, World!" print(text.lstrip()) # "Hello, World! " print(text.rstrip()) # " Hello, World!" ``` ### 1-7-3. 특정 문자열 `대체` (1) `replace()`: 문자열 내에서 특정 부분 문자열을 `앞`에서부터 확인하여 다른 문자열로 변경 - 첫 번째 인자: 찾을 문자열 - 두 번째 인자: 대체할 문자열 - 세 번째 인자: 변경 횟수 (생략 시, 대체 가능한 문자열 `전부` 변경) ```python text = "Hello World, Hello Python!" # 예시1 (첫 "Hello" -> "Good" 변경) new_text = text.replace("Hello", "Good", 1) print(new_text) # "Good World, Hello Python!" # 예시2 (모든 부분 문자열 "Hello" -> "Good" 변경) new_text = text.replace("Hello", "Good") print(new_text) # "Good World, Good Python!" ``` ### 1-7-4. 문자열 `분할` #### 1-7-4-1. `split()` - 문자열을 구분자를 기준으로 분할하여 리스트로 반환 (1) 구분자 지정 X - 기본적으로 `공백` ```python sentence = "Python is fun" words = sentence.split() print(words) # ['Python', 'is', 'fun'] ``` (2) 구분자 지정 O ```python data = "apple,banana,cherry" fruits = data.split(",") print(fruits) # ['apple', 'banana', 'cherry'] ``` ### 1-7-5. 리스트를 문자열로 결합 #### 1-7-5-1. `join()` - 리스트 요소들을 각 요소 사이에 지정한 구분자를 삽입하여 하나의 문자열로 결합 (1) 구분자: 공백 ```python words = ['Python', 'is', 'fun'] sentence = " ".join(words) print(sentence) # "Python is fun" ``` (2) 구분자: 쉼표 ```python words = ['Apple', 'Grape', 'Mango'] sentence = ",".join(words) print(sentence) # "Apple,Grape,Mango" ``` ### 1-7-6. 문자열 `찾기` #### 1-7-6-1. `find()`: - 특정 문자열 찾고 그 시작 위치의 인덱스 반환 - 찾는 문자열이 여러개라면 가장 앞에 오는 문자열의 시작 인덱스 반환 ```python text = "Hello, World!" print(text.find("World")) # 7 print(text.find("Python")) # -1 ``` #### 1-7-6-2. `index()` - 특정 문자열의 첫 등장 위치 찾아 시작 인덱스 반환 - 찾지 못하면 `ValueError` 발생 ### 1-7-7. 특정 문자열 `개수` 세기 (1) `count()` - 특정 문자열이 `몇 번` 등장하는지 세어 반환 ```python text = "banana" print(text.count("a")) # 3 ``` --- ## 1-8. `in` 연산자 > 문자열 내에서 특정 문자열이나 문자가 `포함`되어 있는지 확인하는 연산자 (포함 관계 확인) - 연산 결과로 존재하면 True, 존재하지 않으면 False 값 반환 - 메서드가 아니므로 문자열에 대해 호출하는 방식 X (≠ for _ in _) ```python text = "Python Programming" print("Python" in text) # True print("python" in text) # False print("on Program" in text) # True ``` ## 1-9. 특수 문자<sup>Excape Characters</sup> > 특정 동작을 수행하거나 특수한 문자 표현 위해 사용되는 이스케이프 문자 - `백슬래시(\)`로 시작 (1) `\n` - 줄 바꿈 (Newline) ```python multiline_str = "안녕하세요.\n파이썬을 배워봅시다." print(multiline_str) # 안녕하세요. # 파이썬을 배워봅시다. ``` (2) `\t` - 탭 (Tab) ```python tab_str = "이름\t나이\t직업" print(tab_str) # 이름 나이 직업 ``` (3) `\\` - 백슬래시 (Backslash) ```python path = "C:\\Users\\홍길동\\Documents" print(path) # C:\Users\홍길동\Documents ``` (4) `\'` - 작음따옴표 (Singlr Quote) ```python quote = '그는 말했다, \'안녕하세요\'' print(quote) # 그는 말했다, '안녕하세요' ``` (5) `\"` - 큰따옴표 (Double Quote) ```python quote = "그녀는 말했다, \"파이썬은 재미있어요\"" print(quote) # 그녀는 말했다, "파이썬은 재미있어요" ``` (6) 서로 다른 따옴표 사용 - 문자열을 감싸는 따옴표와 문자열 내부에서 사용하는 따옴표의 종류를 다르게 하면 이스케이프 문자 사용않고도 따옴표 포함 가능 ```python # 예시1 (작은따옴표로 감싸고 내부에 큰따옴표 사용) quote = '그는 말했다, "안녕하세요"' print(quote) # 그는 말했다, "안녕하세요" # 예시2 (큰따옴표로 감싸고 내부에 작은따옴표 사용) quote = "그녀는 말했다, '파이썬은 재미있어요'" print(quote) # 그녀는 말했다, '파이썬은 재미있어요' # 예시3 (삼중 따옴표로 감싸고 내부에 큰·작은 따옴표 사용) print('''He says "It's a really simple sentence".''') ``` [[코드트리 추천 링크]](https://www.codetree.ai/accounts/sign-up-only?referralCode=th2gr22n) https://www.codetree.ai/ko/trail-info?referralCode=th2gr22n