본문 바로가기

CS12

[객사오] 코드로 알아보는 객체의 "역할, 책임, 협력" 📚객체지향의 사실과 오해 객체지향 공부를 하기 위해 를 읽기 시작했다.책의 내용을 무작정 정리하기 보다는, 내가 이 책을 읽고 더 공부하고 싶은 부분을 직접 딥다이브 해 볼 생각이다. 이번에 읽은 챕터는 [01. 협력하는 객체들의 공동체]로 객체지향의 본질에 대해 파고든다. 객체지향적으로 잘 짠 코드는 무엇일까?객체는 충분히 '협력적'이어야 한다. 다른 객체의 요청에 충실히 응답하고, 다른 객체에게 적극적으로 도움을 요청할 수 있어야 한다는 것이다. 객체가 충분히 '자율적'이어야 한다. 본인 스스로의 원칙에 따라 어떤 일을 하거나 자기 스스로 통제하여 절제하는 것을 의미한다. '객체의 자율성'에 대해 보충 설명을 하자면, 객체의 내부와 외부를 명확하게 구분하는 것이다.객체의 사적인 부분은 객체 스스로 .. 2025. 3. 16.
[백준/1764/Kotlin] 듣보잡 문제문제를 풀 때 시간 복잡도를 생각하고 풀자는 의미에서 이번 포스팅을 하게 되었다. 이 문제는 "듣도 못한 사람"의 리스트와 "보도 못한 사람"의 리스트 중 중복되는 데이터를 사전 순으로 출력하는 문제이다. 트러블 슈팅1) 시간 초과처음에 코드를 작성했을 때 출력은 제대로 되었는데 막상 백준에서 돌려보니 시간 초과 문제가 발생하였다.내가 작성한 코드의 흐름은 아래와 같다.val neverHeard : MutableSet = mutableSetOf()val result : MutableSet = mutableSetOf()repeat(n) { neverHeard.add(bufferedReader.readLine())}repeat(m) { val neverSeen : String = buffere.. 2025. 3. 16.
[백준/11399/Kotlin] ATM 문제이번에 푼 문제는 누적된 합의 최솟값을 구하는 문제이다.각 개인에게 걸린 값의 합이 최소가 되게 하려면 큰 값은 가장 나중에 더해줘야 되기 때문에 오름차순 정렬을 해주고자 했다.이번에는 내가 놓쳤던 부분에 대해서 정리하고자 한다. 트러블 슈팅1) 띄어쓰기 별로 읽기처음에 BufferedReader.readLine()은 라인별로 읽는다고 생각해서 나는 띄어쓰기 별로 읽어야 하므로 BufferedReader.read()를 사용했었다. 그러나, read() 함수를 사용하면 한 글자(문자)를 읽어 해당 문자의 ASCII 값을 반환한다고 한다. 그래서 readLine().toInt()로 하되, 공백(" ")을 기준으로 분리(split)를 하고, 이를 다시 list로 반환하게 해줬다.val numberList .. 2025. 3. 6.
[CS] 기초지식 총 정리 (네트워크, 운영체제, 데이터베이스, 자료구조) 누군가 나에게 개발자 이상형이 있냐고 물었을 때 망설임 없이 'CS 지식을 가지고 있는 사람'이라고 답했다.내가 되고 싶은 이상향이기도 하다. 그래서 이번에는 3년 동안 학교에서 배웠던 CS 지식을 복습겸 스스로 정리해보고 싶어서 글을 쓰게 되었다. (중간중간 내가 재학 당시 공부했던 내용을 추가로 첨부했다.)앞으로 각 주제마다 심화로 더 공부할 예정이다.🔥 I. 네트워크네트워크란, 컴퓨터들이 통신망을 통해 서로 그물처럼 연결돼 있는 것을 의미한다. 📍IP 주소첫 번째로 알아볼 개념은 IP 주소이다.IP 주소는 네트워크에 연결된 각 컴퓨터를 구분하는 유일한 주소를 의미한다.이는 클라이언트가 서버에게 요청을 하고 응답을 받을 때 서로의 위치를 알려주는 역할을 하는 것이다. IP 주소는 4byte로 이루.. 2025. 2. 7.
[구글 엔지니어는 이렇게 일한다] 소프트웨어 엔지니어링이란 이제 나도 다수의 프로젝트 경험이 있는 개발자가 되었다. 협업을 하면서 겪은 시행착오들도 많았다.유지보수성 있는 코드를 짜는 법, 내 결정을 다른 파트에게 전달하는 법, 파트 내에서의 소통 법 등등 .. 그래서 거대한 소프트웨어 엔지니어링 기업인 '구글'은 어떤 방식으로 협업을 하기에 이렇게 오랫동안 살아남을 수 있었을지 궁금해졌다.이 책을 통해 현업에서 쓰이는 방식을 흡수하여 나도 한 단계 더 성장하고자 했다. 독서를 하면서 기록하고 싶은 부분을 기록할 예정이다. Part II 문화일찍 실패하고, 빨리 실패하고, 자주 실패하라 (76p) 숨기는 것은 해롭다. 프로젝트가 '초기' 단계라면 불안감에 숨기고 싶어하는 것은 인간의 본성이다. 그러나 위대한 아이디어를 세상으로부터 숨기고 완벽히 다듬어질 때가지 .. 2025. 2. 5.
[BOJ/1929/C++] 소수 구하기 소수 구하는 문제라 쉬울 거라고 생각하고 자신있게 문제를 풀었다..그래서 아래와 같이 구했고, 답도 제대로 나왔다.#include#includeusing namespace std;int main(void){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int M, N; vector vector; cin >> M >> N; for (int i = M; i  그러나 오늘도 어김없이 나오는 시간초과,, 그래서 찾아보니 에라토스테네스의 체 라는 방법이 있었다.이게 뭐냐하면 2 이상의 구하고자 하는 범위 내에 존재하는 자연수를 모두 나열한 뒤, 2 이상 배수들을 차례로 지워나가는 방법이라고 한다! 에라토스테네스의 체의 시간복잡도는 O(N log(log N))으.. 2024. 2. 4.
[BOJ/9205/C++] 맥주 마시면서 걸어가기 오랜만에 골드 문제를 풀어보았다.그만큼 시간 소요도 오래 되었고 BFS를 이용해서 푸는 것은 알았지만, 적절하게 활용하는 것이 어려웠다.  거의 다 왔다고 생각하며 풀어보려고 했지만 계속 나는 런타임 에러,,코드 자체에 문제가 있었다기 보다 코드의 흐름이 맞지 않았던 것 같다. 그래서 처음부터 다시 문제를 풀었다.우선 이 문제에서 구조체를 사용했다. 내가 Java로 코테를 준비할 때도 BFS 문제는 생성자를 이용해서 풀었다.C++도 이런 성질을 이용해서 푸는 것이 용이했다. main() 함수를 먼저 작성했기 때문에 main() 함수 먼저 살펴보자int main() { ios_base::sync_with_stdio(0); cout.tie(0); cin.tie(0); int t; cin.. 2024. 2. 1.
[테크 커리어] 우리는 모두 기여할 수 있다 영향력 있는 개발자로서 성장하고 싶어 개발 관련 도서를 찾다가 를 발견했다.이 책의 주 타켓층은 이제 막 개발자가 된 신입 개발자이다. 나는 아직 개발자라고 칭하기에는 많이 부족하지만 먼저 성공한 이들의 이야기를 미리 엿볼 수 있다면 좋은 경험이 될 것 같아 읽게 되었다.  내가 생각하는 성공은 간단하다. 내가 원하는 인생을 사는 데 필요한 모든 것을 가리킨다. (29p) 성공하고 싶었다. 그래서 성공하기 위해 열심히 달려왔었다. 그러나 나는 정작 성공이란 무엇인지 제대로 생각해보지 못했던 것 같다. 저자는 말한다. 성공이란 자신이 원하는 인생을 사는 것이라고 말이다. 내가 꿈꾸고 정의한 삶을 살기. 성공이란 생각보다 간단하다. 나만의 인생 정의를 적어나가며 우리가 원하는 인생을 실천해나가자. 소신 있게.. 2024. 1. 30.
[BOJ/1181/C++] 단어 정렬 이 문제가 비교적 쉬울지라도 나는 문자열이 나오는 문제를 어려워했기 때문에 이번에는 기록해두고 싶어서 적어본다. 우선 문자열을 입력받고 그것을 길이 순으로 지정하는 방법에 대해 고민해보았다.이때 유용하게 사용할 수 있는 방법이 있는데, C++의 헤더에서 제공해주는 sort() 함수이다.  sort() 함수는 정렬할 범위를 알고, 그 범위 내의 각 요소 쌍에 대한 함수를 호출할 수있다. 즉, 아래의 코드에서 보았을 때 str[] 배열에 있는 각 요소에 대해 compare() 함수의 입력으로 사용하고 있는 것을 알 수 있다.이 비교 결과에 따라 요소의 위치를 재배치한다.#include#include#define MAX 20000using namespace std;bool compare(string x, st.. 2024. 1. 26.
[BOJ/11055/C++] 가장 큰 증가하는 부분 수열 이번에 푼 문제는 dp를 이용해서 푸는 문제였다. 예를 들어 수열 A에서 3번 째에 있는 수가 1번 째, 2번 째에 있는 수보다 크면 3번 째까지 증가하는 부분 수열의 합을 dp 배열에 저장해놓는 방식이다. 그러면 배열 dp에서 오름차순으로 정렬을 했을 때 제일 오른쪽에 있는 수가 최댓값이 될 것이다.#include#includeusing namespace std;int main(void){ int N; cin >> N; int A[1001]; int dp[1001]; for (int i = 0; i > tmp; dp[i] = A[i] = tmp; } for (int i = 0; i 2024. 1. 6.
[BOJ/12931/C++] 두 배 더하기 이번에 푼 문제는 "두 배 더하기"이다.문제에서는 배열 A를 배열 B로 만들기 위한 연산의 최소 횟수를 구하라고 하였다. 그래서 당연히 배열 A를 B로 만들기 위한 최소 연산 과정을 고민하였다. 그러나 이렇게 푸는 것보단 배열 B를 배열 A로 만드는 것이 더 효율적이라는 것을 깨달았다.그렇게 된다면 계산 과정은 반대가 될 것이다.배열에 있는 값 하나 1 빼기배열에 있는 모든 값을 2로 나누기그리고 배열에 있는 모든 숫자가 0이 되면 배열 A를 만든 것이기 때문에 성공한 것이다. 문제 로직은 다음과 같다.#include #include using namespace std;int main(void){ int N, tmp; int count = 0; cin >> N; vector B; .. 2024. 1. 3.
[C++] 템플릿(Template) 함수 템플릿 int Add(int num1, int num2){ return num1+num2; } 위 함수의 기능과 자료형은 다음과 같다. 함수의 기능 덧셈 대상 자료형 int형 데이터 이러한 함수를 만들어 낼 수 있는 템플릿(모형자)는 다음과 같이 정의한다. template T Add(T num1, T num2){ return num1+num2; } 이를 앞서 정의한 Add함수와 비교해 보면, int형 선언을 T로 대신했음을 알 수 있는데, 이는 자료형을 결정짓지 않은, 그래서 나중에 T를 대신해서 실제 자료형을 결정하겠다는 뜻이다. 함수의 기능 덧셈 대상 자료형 결정되어 있지 않음 위 코드에서 첫 번째 문장은 T라는 이름을 이용해서 아래의 함수를 템플릿으로 정의한다는 의미이다. 그럼 템플릿을 활용한.. 2023. 5. 27.