코딩테스트 on C++

Melonader·2022년 5월 16일

알고리즘 스터디

목록 보기
1/1

Python 코딩테스트

대학교에 와서 처음 배운 언어가 python이고 그러다보니 제일 익숙한 언어가 되었다. 개발했던 프로젝트도 AI와 연관된 프로젝트가 많다 보니 파이썬을 자연히 많이 사용하게 됐던 것도 있을듯 하다.
결과적으로 python 알고리즘 강의도 듣고 연습하면서 지금까지 코테를 python으로 풀어왔지만, 내가 지망하는 직군에서 python으로 코테를 보지 못하게 되는 경우를 종종 경험해 알고리즘계의 de-facto 언어인 c++로 공부를 시작하자는 생각을 했다.

교재


군대에서 사놓고 Spring이랑 React/Vue 공부하느라 사실상 공부 안했던 이 책을 꺼내게 되었다.
알고리즘 문제해결 전략으로 개념을 다지고 그날 공부한 주제를 프로그래머스 or BOJ에서 다양하게 풀어보는 방향으로 나갈 예정이다.

워밍업

요즘 C++ 알고리즘은 어떻게 작성하는지 알아보기 위해 프로그래머스에서 문제 하나를 찾아보았다.

Lv.1이라고 써져있어서 금방 풀 줄 알았는데 확실히 사용하던 언어가 달라지니까 구현부분에서 난항을 겪었다.

풀이 사고

  1. 첫번째 for문에서 사람 이름을 key, 신고당한 횟수를 value로 하는 hashmap을 만들어서 신고당하면 1씩 올리자.
  2. 두번째 for문에서 신고당한 횟수가 k 이상이면 이 사람을 신고한 사람의 index에 해당하는 숫자가 1 올라가야 한다.
  3. 2를 구현하기 위해 1에서 신고당한 사람을 key, 신고한 사람들의 vector를 value로 하는 hashmap을 만든다.
  4. 중복을 방지해야 하기 때문에 추가적으로 3에서 구현된 hashmap의 value에 이름이 있으면 1 과정을 생략해준다.
  5. id_list에 있는 이름 순서대로 답을 출력해야 하므로 맨 초기에 for문을 하나 더 만들어 hashmap에 순서를 기록해 놓자.
  6. 2번 로직에서 답으로 return할 vector에 5번에서 가지고 온 index를 조회한 후 그곳에 +1를 하도록 하자.

내 구현 및 잘푼 풀이에 기반한 개선사항

  1. 불필요하게 많은 include
    -> #include <bits/stdc++.h> 하나로 해결.
  2. 중복제거 파트
    -> sort(report.begin(), report.end());
    -> report.erase(unique(report.begin(), report.end()), report.end());
    -> 위 2개로 간편하게 할 수 있었다.
  3. iterator를 사용한 for문 사용
    -> auto가 편리하다.
    -> for (const auto& s : report)
    -> for (const auto& [a, b] : v)
  4. 튜플처리
    -> pair<int, int>와 같이 사용
  5. 문자열 스플릿
    -> stringstream func(나눌 문자열)쓰자!
    -> func >> a >> b; 로 공백 가져올 수 있음
    -> 내가 할땐 istringstream과 getline을 사용했었음
  6. 처음부터 order에 맞춰 값을 받는 방법도 있었음

결론

이것저것 풀어보고, 다른사람 풀이도 보고, 개념도 확실히 다져가면서 c++ 코테를 준비해야겠다!

profile
유니콘이 되고싶은 조랑말

0개의 댓글