그린님의 홈
그린
2026. 7. 23. (목)[모구모구] #2 응용수리 무료특강 3주차 후기
> [모구모구 수리연구소 - 여름방학 응용수리 무료특강 (7월 9일 ~)](https://www.mogumath.co.kr/goods/lecture_info/27) ## 오늘의 수업 방향 오늘은 여름방학 응용수리 무료특강 3회차에서 풀었던 문제를 복기해 보겠다. ## 복기 이번 특강에서는 최단경로, 역증가율, 가중평균 등을 중심으로 문제를 풀었다. 고등학교 때 `최단경로` 문제를 풀던 기억도 나고 간단히 이동할 수 있는 경우의 수를 차례대로 더해 나가는 방식이라 어렵지 않은 유형이었다~ 저번 특강에서도 풀었던 `일률` 문제도 어김없이 등장했는데 일의 양을 적절한 숫자로 정한 뒤, 공통으로 나누어지는 수를 기준으로 잡는 방법을 다시 정리해볼 수 있었다. 후반부에는 `가중평균`과 비율 문제를 풀면서, 합/불합격자의 평균 점수, 남녀 비율 등의 조건을 가중치와 거리비를 이용하여 긴 방정식을 세우지 않고 푸는 방법을 익혔다. 이렇게 두 집단의 비율을 같은 기준으로 통일한 뒤 차이를 비교하는 방식이 여러 문제로 공통으로 적용되니 많은 문제를 접해보는 게 중요할 것 같다. 모구쌤이 말씀했듯이 강의가 끝나도 끝난게 아닌게 복습이 제일 중요하므로 각 풀이법을 외울 정도로 여러 번 풀어보고 실전에서 바로 활용할 수 있도록 해야겠다.
그린
2026. 7. 16. (목)[모구모구] #1 응용수리 무료특강 2주차 후기
> [모구모구 수리연구소 - 여름방학 응용수리 무료특강 (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주차 강의까지밖에 듣지 않았지만, 내가 생각했던 것보다 훨씬 빠르고 쉽게 응용수리 문제를 풀 수 있다는 점이 신선하게 다가왔다. 얼른 보구보구도 결제해서 배운 풀이법을 제대로 익히고, 응용수리 공부를 자신 있게 이어가고 싶다는 두근두근한 마음이 든다 ㅎㅎ 응용수리에서 항상 시간이 부족하거나, 문제마다 긴 방정식을 세우느라 어려움을 느끼는 사람이라면 들어볼 만한 강의라고 생각된다. 나도 이번에 배운 풀이법을 기출문제에 반복해서 적용하면서, 응용수리를 피해야 하는 영역이 아니라 점수를 확보할 수 있는 영역으로 만들어 볼 생각이다.
그린
2026. 6. 28. (일)[sql] #1 MySQL 로컬 환경 설정
> 참고: 책 [혼자 공부하는 SQL](https://product.kyobobook.co.kr/detail/S000001810432){:target="_blank"} SQL을 공부하기 위해 맥 운영체제에서 (MySQL 서버 대신) docker와 MySQL을 활용한 로컬 환경 설정을 해보겠습니다. # 1. MySQL 로컬 환경 설정 ## 1-1. 애플리케이션 설치 - 아래 세 가지 모두 이미 로컬에 설치되어있으므로 방법 및 단계는 생략 (1) docker 설치 (2) MySQL Client 설치 (3) MySQL Workbench 설치 ## 1-2. docker 컨테이너 생성 (1) 독립적인 MySQL 컨테이너를 하나 만들고 실행 ```zsh docker run --name hongong --platform linux/amd64 -e MYSQL_ROOT_PASSWORD=0000 -p 3306:3306 -d mysql:8.0 ``` (2) 앞으로 명령어로 서버 시작/종료 가능 - docker start [컨테이너 NAMES] ```zsh # 시작 docker start hongong # 종료 docker stop hongong ``` (3) 잘 켜졌는지 확인 ```zsh docker ps ``` (3-1) - ID나 이름이 기억 안 날 때 아래 명령어 실행 후, 로컬에 존재하는 모든 컨테이너의 ID와 IMAGE, STATUS, NAMES 확인 가능 ```zsh docker ps -a ``` ## 1-3. MySQL Workbench 연결 (1) MySQL Connections + 클릭 (2) 연결 정보 입력 - Connection Name: hongongdb - Password: 0000 - Test Connection 클릭 후, Successfully 확인 - OK 버튼 클릭 ## 1-4. 터미널에서 docker로 띄운 mysql에 접속하기 - 현재 실행중인 docker 컨테이너에 아래 명령어로 접속하기 - 비밀번호는 설정했던 0000 (비밀번호를 입력할 때, 화면에 아무 글자도 표시되지 않지만, 정상적으로 입력되고 있는 것이니 0000을 치고 엔터를 누르면 됨) ```zsh docker exec -it hongong mysql -u root -p ``` ### 1-4-1. 자주 쓰는 명령어 ```zsh # 현재 데이터베이스(스키마) 목록 보기 show databases; # 터미널 나가기 exit; # 스키마 생성 create database [스키마 이름]; ```
그린
2026. 6. 24. (수)[Tip] usevia로 키보드 키 커스텀 매핑하기!
키보드 설정 작성에 앞서, 현재 사용하고 있는 키보드는 아래 네이버 스토어에서 산 휠이 있는 프리플로우 키보드 제품입니다. (광고 아님 XXX) > 네이버 상품: [프리플로우 archon AK68 DualDial 유무선 기계식 키보드](https://brand.naver.com/preflow/products/12486310287?NaPm=ct%3Dmqrzok2i%7Cci%3Dcheckout%7Ctr%3Dppc%7Ctrx%3Dnull%7Chk%3Df0ca2405b74c6f25e5e73dc65af23cf999f4e842){:target="_blank"} 특이하게도 프리플로우 아콘 AK68 듀얼다이얼 제품은 화살표 키 위에 휠이 두개 달려있습니다! 새 키보드를 탐색하던 중 발견한 제품인데 이 휠을 커스텀해서 입맛대로 설정할 수 있더라구요?! 그래서 마우스를 사용이 불가할 때 또는 간단한 화면 이동 때 사용하면 좋을 것 같아 커스텀 수기를 작성하려고 합니다. 다른 설정으로 바꾸고 싶을 때나 다른 키보드 설정할 때도 헤매지 않고 바로 적용할 수 있도록 기록해두는 용으로도 작성해 볼게요~ 시작합니다. ## 0. json 파일 다운로드 사용하고 있는 키보드와 호환되는 json 파일을 공식 홈페이지에서 다운로드합니다. 저는 [프리플로우 홈페이지](https://preflow.co.kr)에서 맞는 파일을 다운 받았습니다. ## 1. pc와 선으로 연결 우선 블루투스로 사용하고 있었더라도 pc와 선으로 키보드를 연결합니다. ## 2. JSON 파일 업로드 [usevia 페이지를 접속](https://usevia.app/){:target="_blank"}해서 설정 탭에서 `'디자인' 탭 보기` 토클 버튼을 활성화 합니다. (저는 테마도 제가 좋아하는 초록색으로 바꿔봤어요 ㅎㅎ) 그러면 디자인 탭이 새로 생기는데, 들어가서 가운데 영역을 클릭해서 [0번](/horok-log/feeds/posts/61#0-json-파일-다운로드)에서 다운로드 받은 JSON 파일을 업로드합니다. ## 3. usevia app 앱과 연동 usevia 메인 페이지에서 기기 인증 버튼을 눌러, 유선으로 연결된 키보드와 연결합니다. 그러면 키 설정을 할 수 있도록 클릭을 할 수 있는 키 화면이 나옵니다! 이번에 저는 화살표 키 위의 휠을 바꾸는 게 목적이라 다른건 손대지 않을게요. 왼쪽 휠을 아래로 내리면 마우스가 아래로 가게`KC_MS_DOWN`, 위로 올리면 마우스가 위로 가게`KC_MS_UP` 설정했고 휠을 누르면 마우스 왼쪽 클릭`KC_MS_BTN1`이 되게 했어요. 다른 키로 설정하고 싶다면 해당 이벤트의 16진수 코드나 QMK 키코드 값을 구글링하여 입맛대로 매핑해주세요! 오른쪽 휠은 아래로 내리면 오른쪽으로 이동하게`KC_MS_RIGHT`, 위로 올리면 왼쪽으로 이동하게`KC_MS_LEFT` 했고 누르면 마우스 오른쪽 클릭`KC_MS_BTN2`이 되게 설정했습니다! 참고로 왼쪽 상단에 보이는 레이어 0번이 블루투스용, 1번이 유선 연결용 키맵핑이니 참고해주세요! 저는 의도대로 키 작동이 되는지 확인하면서 진행해서 둘다 동일하게 설정했습니다. ## 4. 적용 확인 잘 작동되는지 확인 후, 선 연결을 제거하고 블루투스 무선으로도 잘 되는지 확인하면 끝! 해상도가 큰 듀얼 모니터를 사용할 땐 휠 범위가 짧아서 거리가 먼 곳은 좀 힘들지만ㅎ.. 가까운데 이동하거나 마우스 블루투스가 풀렸을 때 등 급할 때 쓰면 손을 쓰는 거리가 짧아지기도 하고 꽤 유용하게 사용할 수 있습니다~
![[Python] #8 함수](https://ywsjmibcbhnwjxrpogfm.supabase.co/storage/v1/object/sign/post/contents/0c794330-8037-4703-9aaf-97b87f9c4c3f-image.png?token=eyJraWQiOiJzdG9yYWdlLXVybC1zaWduaW5nLWtleV80NWNjMDBiZi01NDg3LTRhMDgtOGQ4MS00NjQ5YWU1MzkwMDYiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJwb3N0L2NvbnRlbnRzLzBjNzk0MzMwLTgwMzctNDcwMy05YWFmLTk3Yjg3ZjljNGMzZi1pbWFnZS5wbmciLCJzY29wZSI6ImRvd25sb2FkIiwiaWF0IjoxNzg1MTYwMTA1LCJleHAiOjE3ODUxNjM3MDV9.rUT65Zi8IJwe9R51Nv258xnbkn_9uRDyCz0k_zOU9ck)
그린
2026. 6. 23. (화)[Python] #8 함수
> 참고: [코드잇 - 프로그래밍 시작하기 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` > 어떤 정보를 주면 계산된 정보를 돌려주는 것
![[C언어] #0 Mac 환경에서 C언어 개발 세팅](https://ywsjmibcbhnwjxrpogfm.supabase.co/storage/v1/object/sign/post/contents/58a152dc-247a-487e-af19-52a39de87aca-image.png?token=eyJraWQiOiJzdG9yYWdlLXVybC1zaWduaW5nLWtleV80NWNjMDBiZi01NDg3LTRhMDgtOGQ4MS00NjQ5YWU1MzkwMDYiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJwb3N0L2NvbnRlbnRzLzU4YTE1MmRjLTI0N2EtNDg3ZS1hZjE5LTUyYTM5ZGU4N2FjYS1pbWFnZS5wbmciLCJzY29wZSI6ImRvd25sb2FkIiwiaWF0IjoxNzg1MTYwMTA1LCJleHAiOjE3ODUxNjM3MDV9.h9GHYa_IBRlrDKTyUNPE0Dyb8H9RMaj2fZa-yli5IDY)
그린
2026. 6. 22. (월)[C언어] #0 Mac 환경에서 C언어 개발 세팅
> 참고1: 유튜브 [나도코딩 - Mac 에서 C 언어 개발 환경설정](https://www.youtube.com/watch?v=ix7K3xMudgc){:target="_blank"} > 참고2: 책 [혼자 공부하는 C언어](https://hongong.hanbit.co.kr/c%EC%96%B8%EC%96%B4/){:target="_blank"} Chapter1 --- # 1. mac 환경에서 C언어 개발 세팅하기 ## 1-1. vscode 설치 홈페이지에서 직접 다운로드 대신, 원활하고 효율적인 의존성 관리를 위해 터미널에서 brew를 통해 명령어로 설치 ```bash brew install --cask visual-studio-code ``` ## 1-3. vscode 익스텐션 설치 (1) c/c++ (2) code runner ## 1-4. vscode 설정 (1) 단축키 `Cmd + ,`를 눌러 settings로 들어가기 (2) `run in terminal` 입력 후, `Code-runner: Run In Terminal` 체크 ## 1-5. 코드 실행 - 실행 버튼: - 실행 단축키 `Ctrl + opt + N` ```c // main.c 실행 #include <stdio.h> // #include <stdlib.h> // system() 함수 안 쓰므로 지움 int main(void) { printf("Be happy!\n"); // printf 출력은 줄바꿈 없이 끝나서 zsh에서 자동으로 % 기호를 붙여줌 (linux or bash에서는 그냥 다음 프롬프트가 붙어서 나옴) // system("pause"); // Windows 전용 함수: 터미널에 명령어를 대신 입력 (pause: 콘솔 창 바로 닫히는 것 방지) return 0; } ``` ```c // 출력 Be happy! ```
![[Java] #3 연산자](https://ywsjmibcbhnwjxrpogfm.supabase.co/storage/v1/object/sign/post/contents/7de8bffa-b1d3-4c88-a18a-830314ad6d97-image.png?token=eyJraWQiOiJzdG9yYWdlLXVybC1zaWduaW5nLWtleV80NWNjMDBiZi01NDg3LTRhMDgtOGQ4MS00NjQ5YWU1MzkwMDYiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJwb3N0L2NvbnRlbnRzLzdkZThiZmZhLWIxZDMtNGM4OC1hMThhLTgzMDMxNGFkNmQ5Ny1pbWFnZS5wbmciLCJzY29wZSI6ImRvd25sb2FkIiwiaWF0IjoxNzg1MTYwMDg2LCJleHAiOjE3ODUxNjM2ODZ9.JxAsXwDIbtM9dkzVCrb3FsRAfVTqCQY9sg_YcrG21yc)
그린
2026. 6. 21. (일)[Java] #3 연산자
> 참고: [codetree Trail 0](https://www.codetree.ai/ko/trail-info/codetree-101){:target="_blank"}의 Chapter 1 - Lesson 4 # 1. 연산자 > 데이터 간의 연산을 수행하는 기호나 키워드 > 데이터를 조작하고 비교하며, 조건을 설정하는 도구 ## 1-1. 산술 연산자 > 수치 데이터를 대상으로 기본적인 수학 연산을 수행하는 연산자 ### 1-1-1. 덧셈 `+` ```java int a = 10; int b = 3; System.out.println(a + b); // 13 ``` ### 1-1-2. 문자열 연결 `+` ```java String str1 = "Hello, "; String str2 = "World!"; System.out.println(str1 + str2); // Hello, World! ``` ### 1-1-3. 뺄셈 `-` ```java int a = 10; int b = 3; System.out.println(a - b); // 7 ``` ### 1-1-4. 곱셈 `*` ```java int a = 10; int b = 3; System.out.println(a * b); // 30 ``` ### 1-1-5. 나눗셈 `/` - 정수 간 나눗셈은 소수점 이하 값을 `버림` - 실수 `결과`를 원할 경우, 연산에 사용되는 두 값 중 하나 이상은 `실수`여야 함. ```java int a = 10; int b = 3; System.out.println(a / b); // 3 double c = 10; double d = 3; System.out.println(c / d); // 3.3333333333333335 ``` ### 1-1-6. 나머지 `%` ```java int a = 10; int b = 3; System.out.println(a % b); // 1 ``` --- ## 1-2. 비교 연산자 > 두 `값을 비교`하여 참/거짓을 반환시키는 연산자 ### 1-2-1. 동등 비교 `==` - 기본형 데이터: `값`이 같은지 비교 - 객체: `참조`가 같은지 비교 (1) `수` 비교 ```java int x = 5; int y = 5; System.out.println(x == y); // true ``` ### 1-2-2. 부등 비교 `!=` ```java int x = 5; int y = 3; System.out.println(x != y); // true ``` ### 1-2-3. 크기 비교 `<, >, <=, >=` ```java int x = 5; int y = 3; System.out.println(x > y); // true System.out.println(x <= y); // false ``` (2) `문자열` 비교 - `equal()` 함수 사용 ```java 문자열1.equal(문자열2); // true 또는 false 반환 (문자열1과 문자열2 비교) ``` ```java String a = "123"; String b = "123"; System.out.println(a.equal(b)); // true ``` ## 1-3. 논리 연산자 > `조건들을 결합`하여 복잡한 논리식을 구성하는 연산자 ### 1-3-1. AND `&&` - 두 조건이 `모두 true`일 때 true 반환 ```java boolean a = true; boolean b = true; System.out.println(a && b); // true ``` ### 1-3-2. OR `||` ```java boolean a = true; boolean b = false; System.out.println(a || b); // true ``` ### 1-3-3. NOT `!` ```java boolean a = false; System.out.println(!a); // true ``` ## 1-4. 증감 대입 연산자 > 변수 값을 증가 또는 감소시키거나 할당할 때 간결하게 변경할 수 있게 돕는 연산자 ### 1-4-1. 증감 연산자 `++, --` (1) 후위 증감 연산자 - 변수 `뒤`에 붙여서, 현재 값을 반환 후 증가 또는 감소함 ```java // 예시 1 int a = 5; System.out.println(a); // 5 System.out.println(a++); // 5 System.out.println(a); // 6 ``` ```java // 예시 2 int a = 5; System.out.println(a); // 5 System.out.println(a--); // 5 System.out.println(a); // 4 ``` (2) 전위 증감 연산자 - 변수 `앞`에 붙여서, 먼저 증가 또는 감소한 후 새로운 값 반환 ```java // 예시 1 int a = 5; System.out.println(a); // 5 System.out.println(++a); // 6 System.out.println(a); // 6 ``` ```java // 예시 2 int a = 5; System.out.println(a); // 5 System.out.println(--a); // 4 System.out.println(a); // 4 ``` ### 1-4-2. 복합 대입 연산자 `+=, -=, *=, /=, %=` - 변수 `현재` 값에 오른쪽 값을 적용하여 연산한 후, 결과를 변수에 할당 ```java int x = 10; x += 5; // x = x + 5; System.out.println(x); // 15 x -= 3; // x = x - 3; System.out.println(x); // 12 x *= 2; // x = x * 2; System.out.println(x); // 24 x /= 4; // x = x / 4; System.out.println(x); // 6 x %= 5; // x = x % 5; System.out.println(x); // 1 ``` [[코드트리 추천 링크]](https://www.codetree.ai/accounts/sign-up-only?referralCode=th2gr22n) https://www.codetree.ai/ko/trail-info?referralCode=th2gr22n
![[Java] #2 변수](https://ywsjmibcbhnwjxrpogfm.supabase.co/storage/v1/object/sign/post/contents/9786e00a-f7d3-4043-bb28-e17c40236525-image.png?token=eyJraWQiOiJzdG9yYWdlLXVybC1zaWduaW5nLWtleV80NWNjMDBiZi01NDg3LTRhMDgtOGQ4MS00NjQ5YWU1MzkwMDYiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJwb3N0L2NvbnRlbnRzLzk3ODZlMDBhLWY3ZDMtNDA0My1iYjI4LWUxN2M0MDIzNjUyNS1pbWFnZS5wbmciLCJzY29wZSI6ImRvd25sb2FkIiwiaWF0IjoxNzg1MTYwMTA1LCJleHAiOjE3ODUxNjM3MDV9.uJCqc_MS2E1TzWl5Tdjjo4CF6zYvzvroIZb7e3P1w8E)
그린
2026. 6. 21. (일)[Java] #2 변수
> 참고: [codetree Trail 0](https://www.codetree.ai/ko/trail-info/codetree-101){:target="_blank"}의 Chapter 1 - Lesson 2~3 # 1. 변수 > 데이터를 저장할 수 있는 메모리 공간의 이름 ```java (자료형) (변수명) = (담을 값); ``` ```java int age = 25; double height = 175.5; char ch = 'A'; String name = "Teddy"; boolean isStudent = true; Array arr = {1, 3, 5} ``` ## 1-1. 대입 연산자 `=` - 변수를 선언하고 값을 할당할 때 사용 - 좌변에 변수의 자료형과 변수명을, 우변에 값을 할당 ```java int a = 3; // 변수 a에 값 3을 대입 System.out.println(a); // 출력: 3 a = 10; // 변수 a에 새로운 값 10을 대입하여 이전 값 3을 변경 System.out.println(a); // 출력: 10 ``` --- ## 1-2. 변수 명명 규칙 - `알파벳`, `숫자`, `밑줄(_)` 사용 가능 O - 숫자로 시작 불가 - 대소문자 구분 --- ## 1-3. 자료형 > 데이터의 종류와 종류마다의 데이터 처리 방법 정의 ### 1-3-1. 정수 (int) - 양수, 음수, 0 ```java int num = 12; System.out.println(num); // 12 ``` ### 1-3-2. 실수 (double) - 과학적 표기법 사용하여 매우 큰 수나 매우 작은 수 표현 가능 O - 메모리 크기에 따라 표현 가능한 정밀도와 범위가 다름 ```java double e = 1.5e2; double f = 2.5e-3; System.out.println(e); // 출력: 150.0 System.out.println(f); // 출력: 0.0025 ``` ### 1-3-3. 불리언 (boolean) - `true`와 `false` 두 가지 값만 가짐 - 주로 논리 연산과 조건문, 반복문에서 사용 ```java boolean isStudent = true; System.out.println(isStudent); // true ``` ### 1-3-4. 문자 (char) - 단일 문자 저장 - 작은따옴표('')로 감싸서 표현 - `특수기호`도 저장 가능 ```java char a = 'A'; char b = '!'; char c = '0'; System.out.println(a); // 출력: A System.out.println(b); // 출력: ! System.out.println(c); // 출력: 0 ``` ### 1-3-5. 문자열 (String) ```java String fruit = "banana"; System.out.println(fruit); // banana ``` --- ## 1-4. 변수 중복 선언 - 같은 `블록({})` 안에서 동일한 이름을 가진 변수를 두 번 이상 선언 불가 - 이미 선언된 변수에 새로운 값을 재할당할 때는 앞에 데이터 타입을 붙이지 않고, 변수 이름만 사용해야 함. ```java public class Main { public static void main(String[] args) { // 1. 변수 a를 선언하고 'C'를 대입 char a = 'C'; // 2. 이미 존재하는 변수 a에 'T'를 다시 대입 (char 생략) a = 'T'; System.out.println(a); } } ``` --- ## 1-5. 형 변환 ### 1-5-1. `int <-> double` - `소수점 이하` 값을 반올림되지 않고 단순 `버림`됨 (1) double -> int - 소수점 이하 버림 ```java System.out.println((int) 3.14); // 출력: 3 System.out.println((int) -2.99); // 출력: -2 System.out.println((int) 0.0); // 출력: 0 System.out.println((int) 7.999); // 출력: 7 ``` (2) int -> double ```java System.out.println((double) 5); // 출력: 5.0 System.out.println((double) -1); // 출력: -1.0 System.out.println((double) 0); // 출력: 0.0 System.out.println((double) 42); // 출력: 42.0 ``` [[코드트리 추천 링크]](https://www.codetree.ai/accounts/sign-up-only?referralCode=th2gr22n) https://www.codetree.ai/ko/trail-info?referralCode=th2gr22n
![[Java] #1 출력](https://ywsjmibcbhnwjxrpogfm.supabase.co/storage/v1/object/sign/post/contents/b0ddf5f9-c1b2-477c-a185-59d753f6f64c-image.png?token=eyJraWQiOiJzdG9yYWdlLXVybC1zaWduaW5nLWtleV80NWNjMDBiZi01NDg3LTRhMDgtOGQ4MS00NjQ5YWU1MzkwMDYiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJwb3N0L2NvbnRlbnRzL2IwZGRmNWY5LWMxYjItNDc3Yy1hMTg1LTU5ZDc1M2Y2ZjY0Yy1pbWFnZS5wbmciLCJzY29wZSI6ImRvd25sb2FkIiwiaWF0IjoxNzg1MTYwMTA1LCJleHAiOjE3ODUxNjM3MDV9.n-SnFSZ4yGGGzpp4kMQeYLMEYfujrkLgHBT3USO3YpE)
그린
2026. 6. 21. (일)[Java] #1 출력
> 참고: [codetree Trail 0](https://www.codetree.ai/ko/trail-info/codetree-101){:target="_blank"}의 Chapter 1 - Lesson 1 # 1. 출력 ## 1-1. 코드 실행 - `main()` 함수를 시작점으로 실행 - 안쪽 중괄호 블럭에 코드 작성 ```java public class Main { public static void main(String[] args) { // 이 중괄호 안에 코드를 작성합니다. } } ``` --- ## 1-2. 출력 함수 > `System.out.println()` - 데이터를 콘솔에 출력하는 함수 - 프로그램이 올바르게 작동하는지 확인 or 계산 결과 확인 or 사용자에게 메시지 보여줄 때 사용 - 출력 후, 자동으로 `줄 바꿈(개행)` 수행하므로, 그 이후는 다음 줄부터 다시 시작 ```java System.out.println(출력할_내용); ``` --- ## 1-3. 문자열·수 출력 ### 1-3-1. 문자열 출력 - 반드시 `큰따옴표` 사용 - `//` 기호 뒤 작성된 내용은 `주석` (프로그램 실행에 영향 X) ```java System.out.println("Hello, World!"); ``` ### 1-3-2. 수 출력 - 인용부호를 제외한 수 자체를 입력 ```java System.out.println(100); // 정수 출력 System.out.println(3.14); // 실수 출력 ``` [[코드트리 추천 링크]](https://www.codetree.ai/accounts/sign-up-only?referralCode=th2gr22n) https://www.codetree.ai/ko/trail-info?referralCode=th2gr22n
그린
2026. 6. 19. (금)[자격증] SQLD #1 61회 합격 수기 with SQLD 모든 것
애증의 sqld 드디어 합격했다.. N수 끝에 깨달은 나와 맞는 독학 공부법과 61회 기출을 복기 해보려고 한다. 첫 시험에서 58점이라는 아쉬운 점수로 과락한 이후, 이상하게 다음 시험들에서는 그동안 공부한 게 축적이 안 된 건지 오히려 더 처참한 점수를 받기도 했다. 물론 회차마다 난이도 운이 크게 작용했겠지만, 신기하게 꼭 SQLD 시험 직전에는 주변에 크고 작은 일들이 겹쳐 생각만큼 집중해서 공부하지 못하곤 했다. 결국 뿌린 대로 거둔다는 말처럼, 정직한 점수를 보면서 참 속상했던 기억이 난다ㅠ 하지만 이번엔 그래도 시험 일주일 전부터 제대로 정신을 집중해 신경 쓰며 공부했고, 특히 시험 이틀 전부터는 마음이 급해져 죽음의 이틀의 전사라고 봐도 무방하다..ㅎ 노력의 밀도가 달랐던 건지 이번 시험에서는 그동안 봤던 시험들과 달리 찍은 문제도 거의 없었고, 시험을 치르면서도 오늘 느낌 괜찮은데?라는 예감이 들었다. 보통 온라인에 개인이 요약해 둔 공유 정리본이나 유튜브 무료 강의를 많이들 추천하곤 한다. 하지만 나는 전문가가 아닌 개인이 재해석해 둔 요약본을 이해하는 데 시간이 오히려 더 오래 걸렸다. 영상 강의 역시 흐름을 따라가는 데 시간 대비 효율이 떨어진다고 느꼈다. 그래서 나는 검증된 책으로 혼자 곱씹으며 이해하는 것이 더 맞다고 느꼈다. 나는 작년에 이 책을 사 놓고 올해 제 61회 시험을 치고 합격했다. 사실 이 책을 접하기 전에 다른 출판사의 유명 교재를 2권이나 사서 공부했었지만 결과는 불합격이었고 최종적으로 이 책이 나에게는 가장 이해가 잘 되고 도움이 많이 됐다. 나처럼 쫌쫌따리 장기 계획을 세워 공부하는 게 체질에 안 맞는 분이라면, 날밤 새우며 악으로 깡으로 버텼을 때 24시간 안에 1회독을 끝낼 수 있을 것 같다(?) 이 책과 함께 SQL 자격검정 실전문제(일명 노랭이)도 2과목 중간까지 풀고 갔고, 시험 출제 방식과 문제 뉘앙스가 노랭이와 매우 흡사하니 꼭 보고 가는 걸 추천한다. (나는 혼자만 보려고 pdf로 찍어놨다가 당근에 팔았는데 빨리 팔리니 실물로 사는 걸 추천한다 ㅎㅎ) 몇 번의 시험을 거치며 기출 복기를 해보았을 때, 항상 통하는 몇 가지 패턴이 있었다. SQLD를 준비하시는 분들을 위해 작게나마 팁을 공유해 본다. 1. 1과목 초반(1~3번) 단골 유형: `외부·개념·내부 스키마`의 특징, `속성`의 유형(기본/설계/파생 속성), `엔터티`의 특징에 대한 옳은 키워드를 고르는 문제는 매 회차 빠지지 않고 등장한다. 첫 장부터 공부한 사람조차 헷갈리게 만드는 말장난이 많으므로 개념을 뼈대까지 정확히 외워야 한다. 2. 이번 회차에서는 `도메인`에 대한 설명을 선지에 되게 교묘한 말장난으로 넣어두어 하마터면 함정에 빠질 뻔했다. 시험장에서 본인이 치열하게 공부한 개념이 맞다는 생각이 한번 든다면, 처음 고른 답이 맞으니 웬만하면 선지를 바꾸지 마시길 권한다. (시험 볼 때 항상 통하는 진리다.) 3. `NULL` 값 연산 및 카운팅: NULL을 포함하는 데이터를 연산할 때의 결과(ex. NULL과의 연산은 무조건 NULL)와, COUNT(*) 및 COUNT(표현식)에서 NULL을 세고 제외하는 구분 문제는 이번에도 어김없이 출제되었다. 워낙 자주 나오는 유형이니 무조건 숙달하고 가셔야 한다. 4. 그리고 생각보다 시간이 많지 않으니 2과목 쿼리 해석은 너무 오래 붙잡지 않는 것이 중요합니다! 침착하게 보되 여러번 훑어볼 여유는 없다는 걸 염두에 두고 평소 쿼리문을 보는 연습을 많이 해보는 걸 추천합니다. 느낌이 좋았었던 것 치곤 높은 점수는 아니지만 그래도 포기하지 않고 합격을 받았다는 사실에 너무 기쁘다! 요즘은 문과도 sqld를 따는 것이 기본이 된 세상이 되었는데😭 전공자로서 언젠가는 SQLP까지도 딸 수 있길 바라며, 실무에서도 sql를 활용하기 위해 더 열심히 공부해 볼 생각이다. 마지막으로 sqld 취득을 목표로 하는 모든 이들에게 행운이 깃들길 바랍니다. 화이팅!!!
![[Python] #7 문자열](https://ywsjmibcbhnwjxrpogfm.supabase.co/storage/v1/object/sign/post/contents/459d85a1-70dc-41bc-9361-b4fcfc6ed3ba-image.png?token=eyJraWQiOiJzdG9yYWdlLXVybC1zaWduaW5nLWtleV80NWNjMDBiZi01NDg3LTRhMDgtOGQ4MS00NjQ5YWU1MzkwMDYiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJwb3N0L2NvbnRlbnRzLzQ1OWQ4NWExLTcwZGMtNDFiYy05MzYxLWI0ZmNmYzZlZDNiYS1pbWFnZS5wbmciLCJzY29wZSI6ImRvd25sb2FkIiwiaWF0IjoxNzg1MTYwMTA1LCJleHAiOjE3ODUxNjM3MDV9.u0zk9dFVYTAMt9XaNFmId2eJCBwT371J1Ii6gWTe65Q)
그린
2026. 6. 19. (금)[Python] #7 문자열
> 참고: [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
![[Python] #6 리스트](https://ywsjmibcbhnwjxrpogfm.supabase.co/storage/v1/object/sign/post/contents/c8d1975e-0c8a-4f90-9b06-b6a3da4eb4fc-image.png?token=eyJraWQiOiJzdG9yYWdlLXVybC1zaWduaW5nLWtleV80NWNjMDBiZi01NDg3LTRhMDgtOGQ4MS00NjQ5YWU1MzkwMDYiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJwb3N0L2NvbnRlbnRzL2M4ZDE5NzVlLTBjOGEtNGY5MC05YjA2LWI2YTNkYTRlYjRmYy1pbWFnZS5wbmciLCJzY29wZSI6ImRvd25sb2FkIiwiaWF0IjoxNzg1MTYwMTA1LCJleHAiOjE3ODUxNjM3MDV9.aFi0deW86CGk-Kk4NHs4X-LM2UPIPPneeQtKzmc0CJ8)
그린
2026. 6. 19. (금)[Python] #6 리스트
> 참고: [codetree Trail 0](https://www.codetree.ai/ko/trail-info/codetree-101){:target="_blank"}의 Chapter 6 # 1. 리스트 > 여러 개의 값을 순서대로 저장할 수 있는 자료형 - 정수, 문자열, 실수 등 다양한 자료형을 함께 넣을 수 있음 - 대괄호(`[]`)로 정의됨 - 각 요소는 순서대로 위치(`인덱스`, index)를 가짐 - 인덱스는 `0부터 시작` - `변경 가능한, mutable` 자료형이므로 값을 추가·수정·삭제 가능 ```python mixed = [1, "두 번째", 3.0, True] empty = [] ``` ## 1-1. 리스트 생성 & 초기화 ### 1-1-1. 직접 값 나열 ```python colors = ["빨강", "초록", "파랑"] ``` ### 1-1-2. `list()` 함수 사용 ```python letters = list("abcde") print(letters) # ['a', 'b', 'c', 'd', 'e'] ``` ### 1-1-3. `input().split()` 사용 ```python fruit_list = input().split() # 사과 바나나 체리 print(fruit_list) # ['사과', '바나나', '체리'] ``` ### 1-1-4. 빈 리스트 생성 ```python empty_list = [] ``` --- ## 1-2. 리스트 덧셈(결합) - `+` 연산자로 두 개 이상의 리스트를 결합하여 새로운 리스트를 생성 - 원본 리스트는 변경되지 않음 - 새로운 리스트는 합쳐지는 리스트의 요소를 순서대로 포함한다 ```python list1 = [3, 1, 4] list2 = [1, 5, 9] print(list1 + list2) # 출력: [3, 1, 4, 1, 5, 9] print(list2 + list1) # 출력: [1, 5, 9, 3, 1, 4] ``` --- ## 1-3. 리스트 곱셈(반복) - `*` 연산자로 특정 리스트를 지정한 횟수만큼 반복한 새로운 리스트를 생성 - 반복 횟수는 음수가 아닌 정수 값이다. - 패턴이나 동일한 데이터의 반복이 필요한 경우 사용 ```python list1 = [1, 2, 3] print(list1 * 3) # 출력: [1, 2, 3, 1, 2, 3, 1, 2, 3] ``` --- ## 1-4. 인덱싱 > 리스트의 특정 요소를 접근하는 방식 - `0부터` 시작함 - `-1(뒤)`에서부터 시작하는 음수 인덱스도 지원 O (시퀀스의 길이를 모를 때도 마지막 요소에 쉽게 접근 가능) |양수 인덱스|0|1|2|3|4| |:---:|:---:|:---:|:---:|:---:|:---:| |음수 인덱스|-5|-4|-3|-2|-1| |요소|사과|바나나|오렌지|포도|체리| ```python print(fruits[-1]) # 체리 print(fruits[-3]) # 오렌지 print(fruits[22]) # 인덱스가 리스트의 범위를 초과하면 오류(IndexError) 발생 ``` ### 1-4-1. 리스트 값 수정 - 리스트 특정 위치의 요소(값) 변경 ```python fruits = ["사과", "바나나", "체리"] fruits[1] = "딸기" print(fruits) # ['사과', '딸기', '체리'] ``` --- ## 1-5. 주요 메서드 & 함수 ### 1-5-1. 메서드 > 특정 자료형이 고유한 기능을 갖고 있는 특별한 함수 (집계 함수 포함) ```python 리스트명.append(요소) 리스트명.insert(위치, 요소) ``` - 자료형 이름 뒤에 점(.)을 찍고 메서드 이름을 붙임 (1) append() - 리스트의 `끝`에 새로운 요소 `추가` ```python fruits = ["사과", "바나나", "체리"] fruits.append("오렌지") print(fruits) # ['사과', '바나나', '체리', '오렌지'] ``` (2) insert() - 리스트의 `특정(인덱스) 위치`에 요소 `삽입` ```python fruits = ["사과", "바나나", "체리", "오렌지"] fruits.insert(1, "키위") print(fruits) # ['사과', '키위', '바나나', '체리', '오렌지'] ``` (3) remove() - 리스트에서 `첫 번째`로 `일치`하는 특정 요소 `제거` - 삭제하려는 특정 요소가 리스트에 없을 경우 `ValueError` 발생 ```python fruits = ["사과", "키위", "바나나", "체리", "오렌지"] fruits.remove("바나나") print(fruits) # ['사과', '키위', '체리', '오렌지'] ``` (4) pop() - 리스트의 지정한 인덱스의 요소를 `제거`하고 `반환` - 인덱스를 지정하지 않으면 `마지막` 요소가 제거됨 ```python fruits = ["사과", "키위", "체리", "오렌지"] last_fruit = fruits.pop() print(last_fruit) # 오렌지 print(fruits) # ['사과', '키위', '체리'] second_fruit = fruits.pop(1) print(second_fruit) # 키위 print(fruits) # ['사과', '체리'] ``` (5) sort() - 리스트를 `오름차순`으로 정렬 (기본) - `내림차순`은 `reverse=True` 인자로 정렬 ```python # 기본 (오름차순) numbers = [5, 2, 9, 1, 5, 6] numbers.sort() print(numbers) # 출력: [1, 2, 5, 5, 6, 9] # 내림차순 numbers = [5, 2, 9, 1, 5, 6] numbers.sort(reverse=True) print(numbers) # [9, 6, 5, 5, 2, 1] ``` (6) reverse() - 리스트의 요소 순서를 `반대`로 `뒤집`음 - 원본 데이터에 영향 X (반환 X) ```python fruits = ["사과", "바나나", "체리"] fruits.reverse() print(fruits) # ['체리', '바나나', '사과'] ``` (7) count() - 리스트의 특정 요소가 몇 번 등장하는지 `개수` 세어 반환 ```python numbers = [1, 2, 3, 2, 2, 4] print(numbers.count(2)) # 3 ``` (8) index() - 리스트의 특정 요소가 `처음`으로 등장하는 위치(`인덱스`)를 반환 - 특정 요소가 존재하지 않으면 `ValueError` 발생 - 특정 요소가 `여러 개`면 `첫 번째` 인덱스만 반환 ```python # 예시1 fruits = ["사과", "바나나", "체리", "바나나"] print(fruits.index("바나나")) # 1 # 예시2 numbers = [10, 20, 30, 20, 40] print(numbers.index(20)) # 1 ``` (9) len() - 리스트의 요소 `개수(길이)`를 반환하는 `함수` (메서드 X) - 튜플, 딕셔너리 등 다른 자료형에도 적용 가능 O ```python fruits = ["사과", "체리"] print(len(fruits)) # 2 ``` --- ## 1-6. 1차원 배열 응용 > 1차원 배열: 선형으로 나열된 데이터 ### 1-6-1. `인덱스` 활용 - 요소의 인덱스에 직접 접근 O ```python # 기본 구조 for i in range(len(리스트)): 실행할 코드 `` ```python # 예시1 (리스트 요소에 2배씩 곱하기) original = [3, 1, 4, 1, 5] doubled = [] for i in range(len(original)): # 리스트 인덱스 순회 doubled.append(original[i] * 2) print(doubled) # [6, 2, 8, 2, 10] `` ### 1-6-2. 요소를 `직접 순회`하는 for문 - 요소의 인덱스에 직접 접근 불가 (제한적) ```python # 기본 구조 for 변수 in 리스트: 실행할 코드 ``` ```python # 예시1 (리스트 요소에 2배씩 곱하기) original = [3, 1, 4, 1, 5] doubled = [] for x in original: doubled.append(x * 2) print(doubled) # [6, 2, 8, 2, 10] ``` --- ## 1-7. 리스트 입력받기 - 사용자로부터 여러 개의 정수를 한 번에 입력받아 리스트로 저장하는 경우 `input()` 함수와 `map()` 함수를 조합하여 사용 ```python 리스트이름 = list(map(변환함수, input().split())) # list(...): map 객체를 리스트로 변환 ``` ```python # 예시1 numbers = list(map(int, input().split())) # 10 20 30 40 50 print(numbers) # [10, 20, 30, 40, 50] ``` --- ## 1-8. 리스트 `컴프리헨션` (<->for문) > `반복문`과 간단한 `표현식`을 사용하여 기존의 리스트나 반복 가능한 객체로부터 새로운 리스트를 `한 줄`로 간결하게 만드는 방법 - 먼저 `빈 리스트 생성` 후 반복문을 통해 요소를 하나씩 순차적으로 추가하는 for문과는 달리 가독성이 좋음 ```python # 기본 구조 새로운_리스트 = [표현식 for 변수 in 시퀀스] ``` ### 1-8-1. 시퀀스<sup>sequence</sup> > 반복 가능한 것들 (리스트, range()) ### 1-8-2. for 변수 in 시퀀스 - 의미: 시퀀스에서 하나씩 꺼내 변수에 담기 (≈for문) ### 1-8-3. 표현식<sup>expression</sup> - 각 반복에서 리스트에 넣을 값을 `결정` ```python # 예시1 (기존 리스트 요소에 2를 곱한 새로운 리스트 생성) arr = [1, 2, 3, 4] # for x in arr: arr의 각 숫자를 x에 하나씩 대입 new_arr = [x * 2 for x in arr] # x에 2를 곱한 값을 new_arr에 추가 print(new_arr) # [2, 4, 6, 8] # [2, 4, 6, 8] 이라는 새 리스트 생성됨 ``` ```python # 예시2 (모든 요소를 9으로 채우기) zeros = [0 for x in range(10)] print(zeros) # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ``` ```python # 예시3 (반복적인 사용자 입력(받는) 처리) n = int(input("입력할 문자열의 개수: ")) # n개의 문자열을 입력받기 위해 사용자로부터 숫자 입력받기 arr = [input("문자열 입력: ") for _ in range(n)] # 리스트 컴프리헨션을 사용하여 n번 반복하며 각 문자열을 입력받아 arr 리스트에 저장 print(arr) # 리스트 arr 출력 ``` --- ## 1-9. 2차원 배열 ### 1-9-1. 개념 > 배열 안에 배열이 있는 구조 (배열들의 배열) > 엑셀 표·격자처럼 `가로(행·row)`와 `세로(열·column)`를 가진 구조 > 1차원 배열들을 이어 붙인 모양 > 리스트를 요소로 같는 리스트 (List of Lists) - 구성: 행과 열 - 형태: \(a_{ij}\) => a[i][j] ```python # 예시 1 (3행 4열의 이차원 배열) [ [a00, a01, a02, a03], [a10, a11, a12, a13], [a20, a21, a22, a23] ] ``` - 가장 바깥쪽 리스트가 `행들을 모아놓은 것` - 각 내부 리스트가 `한 행`에 해당 - 내부 리스트의 각 요소은 `열 값` ### 1-9-2. 생성 & 입력 - `append()` 활용 (1) `for 루프` 사용 - 코드가 길어질 수 있고, 중첩 루프가 복잡해질 가능성 O - 단계별로 요소를 추가하는 과정이 명시적으로 드러남 ```python rows = int(input("행 개수를 입력하세요: ")) # 3 cols = int(input("열 개수를 입력하세요: ")) # 3 matrix = [] for _ in range(rows): # 한 줄씩 입력받아 리스트로 변환 후 matrix에 추가 row_date = list(map(int, input("값을 공백으로 구분하여 입력하세요: ").split())) # 3 2 1\n4 5 6\n9 8 7 matrix.append(row_data) print(matrix) # [[3, 2, 1], [4, 5, 6], [9, 8, 7]] ``` (2) `리스트 컴프리헨션` 사용 ```python [ 넣을_값 for 변수 in 반복대상 ] ``` - 한두 줄로 복잡한 로직 표현 가능 ```python # 예시 1 rows = int(input("행(Row) 개수를 입력하세요: ")) cols = int(input("열(Column) 개수를 입력하세요: ")) # 각 행의 입력을 2차원 정수 리스트 생성(변환) matrix = [list(map(int, input("값을 공백으로 구분하여 입력하세요: ").split())) for _ in range(rows)] print("입력받은 2차원 배열(matrix):") print(matrix) ``` ```python matrix = [[1, -1], [0, 5]] rows = 2 cols = 2 # 각 row의 element에 2를 곱하여 새로운 new_row 생성 (내부) new_matrix = [ [element * 2 for element in row] for row in matrix ] # for row in matrix 원본 matrix의 각 row에 대해 새로운 new_matrix 생성 (외부) print("새롭게 생성된 배열(new_matrix) (리스트 컴프리헨션 사용):") for row in new_matrix: print(row) ``` (3) 원본 배열 복사 ```python # 예시1 (모든 요소 2배로 복사) matrix = [[1, -1], [0, 5]] rows = 2 cols = 2 new_matrix = [] for i in range(rows): new_row = [] for j in range(cols): # 각 요소에 2를 곱하여 새로운 행에 추가 new_row.append(matrix[i][j] * 2) new_matrix.append(new_row) print("새롭게 생성된 배열(new_matrix):") for row in new_matrix: print(row) # 출력 """ 새롭게 생성된 배열(new_matrix): [2, -2] [0, 10] """ ``` ### 1-9-3. 탐색(순회) & 출력 (1) 이중 for 문 사용 ```python matrix = [[3, 1], [4, 2]] rows = 2 cols = 2 for i in range(rows): # 행 인덱스 반복 for j in range(cols): # 열 인덱스 반복 print(matrix[i][j], end=" ") print() # 각 행이 끝날 때 줄바꿈 ``` ### 1-9-4. 값 접근 & 변경 - 접근/변경하고자 하는 인덱스 확보 후, 유효한 범위(인덱스 에러 방지)인지 확인하여 값을 읽거나 변경 ```python matrix = [[1, -1], [0, 5]] rows = 2 cols = 2 r_idx = int(input("접근하고 싶은 행 인덱스를 입력하세요: ")) c_idx = int(input("접근하고 싶은 열 인덱스를 입력하세요: ")) value_to_update = int(input("변경하고자 하는 새 값을 입력하세요: ")) if 0 <= r_idx < rows and 0 <= c_idx < cols: matrix[r_idx][c_idx] = value_to_update print(f"matrix[{r_idx}][{c_idx}] 값이 {value_to_update}(으)로 변경되었습니다.") else: print("잘못된 인덱스입니다. (IndexError)") ``` --- ### 1-9-5. 2차원 배열 `패턴` 출력 (1) `가로` `지그재그` 패턴 ```python 1 2 3 4 # 짝수 행 (왼쪽에서 오른쪽으로 수 증가) 8 7 6 5 # 홀수 행 (오른쪽에서 왼쪽으로 수 증가 or 왼쪽에서 오른쪽으로 수 감소) 9 10 11 12 # 짝수 행 16 15 14 13 ``` - 각 행에서 출력해야 할 내용을 배열에 채운 후, `짝수` 행에서는 정방향으로, `홀수` 행에서는 역방향으로 수 출력 1) 기본 숫자 배열 생성: 정사각형 크기 n에 따라 연속된 숫자들을 행렬 형태로 생성 2) 짝수 행과 홀수 행 구분: 인덱스 활용 3) 홀수 행의 `순서 뒤집기` ```python n = 4 # 정사각형의 크기 cnt = 1 # 수 시작값 for i in range(n): row = [] # 1단계: 기본 숫자 배열 생성하기 for j in range(n): # 각 행(i)마다 n개의 숫자를 순차적으로 row 리스트에 추가 row.append(cnt) cnt += 1 # 2단계: 짝수 행과 홀수 행 구분하기 if i % 2 != 0: # 3단계: 홀수 행의 숫자 순서 뒤집어서 출력하기 for j in range(n - 1, -1, -1): print(row[j], end=" ") else: # 짝수 행이라면 그대로 출력하기 for j in range(n): print(row[j], end=" ") print() ``` (2) `세로` 지그재그 > 열 중심 패턴 ```python 1 8 9 16 2 7 10 15 3 6 11 14 4 5 12 13 # 짝수 열 (위에서 아래로 수 증가) # 홀수 열 (아래에서 위로 수 증가 or 위에서 아래로 수 감소) ``` - 우선 2차원 배열에 정답을 모두 채운 뒤, 그 배열을 출력하는 방식으로 해결 1) 2차원 배열 만들기: n x n 크기인 2차원 배열 생성 2) 열 순서로 순회: 행 기준이 아닌 열 기준으로 순회하는 코드 작성 3) 짝수 열과 홀수 열 구분하여 값 채우기: 짝수 열이면 위->아래 방향으로, 홀수 열은 아래->위 방향으로 값 채우기 4) 출력 ```python # 예제 1 n = 4 # 정사각형의 크기 cnt = 1 # 수의 시작 값 arr = [[0 for i in range(n)] for i in range(n)] # 1단계: n x n 사이즈의 2차원 배열 만들기 # 2단계: 열 순서로 순회하기 for i in range(n): # i는 i번째 행이 아닌 i번째 '열'을 의미합니다. # 3단계: 짝수 열과 홀수 열 구분하여 값 채우기 if i % 2 != 0: # 홀수 열은 아래->위로 값 채우기 for j in range(n - 1, -1, -1): arr[j][i] = cnt # 위->아래 방향은 arr[i][?] 이지만, 왼쪽->오른쪽 방향은 arr[?][i] 형태 cnt += 1 else: # 짝수 열은 위->아래 값 채우기 for j in range(n): arr[j][i] = cnt cnt += 1 # 4단계: 출력하기 (위->아래 + 같은 행에서는 왼->오른쪽으로 출력) for i in range(n): for j in range(n): print(arr[i][j], end=" ") print() ``` --- ### 1-9-6. 문제 (1) 연습 ```python # 예시 1 array1 = [[1, 2, 3], [4, 5, 6]] array2 = [[1 for j in range(3)] for i in range(2)] # [[1, 1, 1], [1, 1, 1]] for i in range(2): for j in range(3): print(array1[i][j] + array2[i][j], end=' ') print() # 출력 # 2 3 4 # 5 6 7 ``` (2) 배열의 값을 3배로 - 문제: 3행 3열의 배열이 주어지면 배열의 모든 원소를 3배로 만든 뒤, 배열을 그대로 출력 - 입력: 3행 3열의 배열이 입력으로 주어지고, 첫 번째 줄부터 세 번째 줄까지 각 배열의 값이 공백을 두고 입력으로 주어짐 - 출력: 연산이 완료된 후, 3행 3열의 배열을 입출력 예제와 같이 출력 - 예제: ```python # 입력 3 2 3 1 3 1 1 1 1 # 출력 9 6 9 3 9 3 3 3 3 ``` - 풀이: ```python rows = 3 cols = 3 matrix = [list(map(int, input().split())) for _ in range(rows)] for row in matrix: for col in range(cols): row[col] *= 3 print(*row) ``` (3) 두 배열의 곱 - 문제: 3행 3열의 배열 두 개가 주어지면 두 배열의 같은 위치에 있는 수의 곱 출력 - 입력: 3행 3열의 배열 두 개가 줄 간격을 사이에 두고 주어짐 - 출력: 주어진 두 배열의 곱을 3행 3열의 배열로 입출력 예제와 같이 출력 - 예제: ```python # 입력 1 2 3 4 5 6 7 8 9 # 출력 2 6 12 5 6 7 8 9 10 ``` - 풀이: ```python rows = cols = 3 # A = B = 값 구조를 사용하면, 컴퓨터는 값을 딱 한 번만 만든 뒤 두 변수를 그 동일한 메모리 주소에 같이 붙여버려서 서로 다른 두 개의 배열이 독립적으로 존재하는 것이 아니라, 하나의 배열을 두 이름이 공유하는 상태가 됨 (한쪽을 수정하면 다른 한쪽도 똑같이 바뀜) matrix1 = [list(map(int, input().split())) for _ in range(rows)] input() # '빈 줄' 한 칸 읽고 버리기 (빈 줄 건너뛰기) matrix2 = [list(map(int, input().split())) for _ in range(rows)] for i in range(rows): for j in range(cols): print(matrix1[i][j] * matrix2[i][j], end=" ") print() ``` (4) 특정 원소들의 합 - 문제: 4 x 4 크기 격자에 정수가 하나씩 주어져 있다. 이 정수들 중 다음 그림에서 색칠된 칸들에 해당하는 정수 합을 2차원 배열로 구하기 - 입력: 첫 번째 줄부터 4개의 줄에 걸쳐, 한 줄에 4개씩 정수가 공백을 두고 주어짐 - 출력: 첫 번째 줄에 색칠된 칸에 해당하는 정수들의 합 출력 - 예제 ```python # 입력 3 3 54 5 2 6 7 81 3 31 2 1 95 5 7 1 # 출력 155 ``` - 풀이: ```python # 풀이 1 n = 4 matrix = [list(map(int, input().split())) for _ in range(n)] total = 0 cnt = 1 for row in matrix: total += sum(row[:cnt]) cnt += 1 print(total) ``` ```python # 풀이 2 matrix = [list(map(int, input().split())) for _ in range(4)] total = 0 for i in range(4): for j in range(4): if j <= i: total += matrix[i][j] print(total) ``` --- ## 1-10. 퀴즈 ### 1-10-1. 제곱하여 출력하기 (1) 문제: N개의 원소가 주어질 때, 각 원소에 제곱하여 출력하기 (2) 입력: 첫 번째 줄에 원소의 개수를 나타내는 N이, 두 번째 줄에는 N개의 원소가 공백을 사이에 두고 주어짐 (3) 출력: 첫 번째 줄에 N개의 원소에 각각 제곱한 결과를 공백을 사이에 두고 입력받은 순서대로 출력 (4) 예제: ```python # 입력 3 1 8 5 # 출력 1 64 25 ``` (5) 풀이: ```python N = int(input()) # 풀이1 nums = map(int, input().split()) for num in nums: print(num ** 2, end=" ") # 풀이2 print(*[num ** 2 for num in map(int, input().split())]) ``` ### 1-10-2. 일의 자리 배열 (1) 문제: 10 미만의 정수 두 개가 주어지면 순서대로 첫 번재, 두 번째 항으로 설정한 후 세 번째 항부터는 전전항과 전항의 합을 구하여 그 합의 1의 자리로 채워서 차례로 10개를 출력 (2) 입력: 첫 번재 줄에 첫째항, 둘째항이 공백을 사이에 두고 주어짐. (3) 출력: 첫 번재 줄에 숫자들을 공백을 사이에 두고 출력 (4) 예제: ```python # 입력 2 5 # 출력 2 5 7 2 9 1 0 1 1 2 ``` (5) 풀이: ```python num1, num2 = map(int, input().split()) for _ in range(5): print(num1, num2, end=" ") num1, num2 = (num1 + num2) % 10, (num1 + num2 * 2) % 10 ``` ### 1-10-3. 상하로 반복하며 출력 (1) 문제: 주어지는 정수 N 값에 따라 1에서 N까지의 정수들을 상하로 반복하며 출력하기 (2) 입력: 첫 번째 줄에 N이 주어짐 (3) 출력: N 값에 따른 숫자들을 입출력 예제와 같이 출력 (4) 예제: ```python # 입력 4 # 출력 1414 2323 3232 4141 ``` (5) 풀이: ```python N = int(input()) for i in range(N): for j in range(N): if j % 2 == 0: print(i + 1, end="") else: print(N - i, end="") print() ``` [[코드트리 추천 링크]](https://www.codetree.ai/accounts/sign-up-only?referralCode=th2gr22n) https://www.codetree.ai/ko/trail-info?referralCode=th2gr22n