코딩테스트 합격자 되기 C++
00~ 01장 효율적으로 공부하기
저자 박경록
목차
코딩 테스트를 효율적으로 준비하는 방법
- 타인의 풀이를 보는 공부 법
- 아는 것만 공부하지 말자
- 테스트 케이스를 고려하는 법
- 의사코드 설계하는 법
강의 영상
타인의 풀이를 보는 공부 법(고민)
- 시간이 많다면 충분히 문제에 대해 혼자 고민해보는 것이 좋음
But…. “대부분 수험생들은 시간이 부족함”
타인의 풀이를 보는 공부 법(방법)
1. 최소한 30분 ~ 1시간 정도 고민한다.
2. 그래도 답이 나오지 않을 경우, 답안코드를 본다.
=> 답안 코드에서 본인이 해결하지 못한 부분을 해결한 코드를 정리
=> 답안 코드에서 사용한 알고리즘과 매칭되는 부분을 문제에서 분석
=> 2주 정도 후에 다시 구현
타인의 풀이를 보는 공부 법(예시 - 문제)
입력:
nums = [2, 7, 11, 15],
target = 9
출력: [0, 1]
설명: nums[0] + nums[1] = 2 + 7 = 9 이므로 정답은 [0, 1]입니다
제한 :
입력 크기는 최대 100만 이고 제한시간은 1초 입니다.
타인의 풀이를 보는 공부 법(예시 - 내 코드 vs 정답 코드)
해결하지 못한 코드
정답 코드
①
②
타인의 풀이를 보는 공부 법(정리)
문제 입력값이 100만 인데, O(N^2) 알고리즘으로 접근해서 TLE 발생
- 정답 코드는 unordered_map을 활용해서 O(N)으로 개선함
=> 각 숫자를 unordered_map의 키로 활용
깨달은 점
- 다음 부터는 입력값을 꼭 확인해서 문제에서 요구하는 시간복잡도를 충족 시키자!
- 자료구조에 의해서도 시간 복잡도가 영향을 받을 수 있음(자료구조에 맞게 구현하므로)
아는것만 공부하지 말자(방법)
- 아는 것만 공부하면 얻는 것은 자신감 뿐… 7:3을 지키자.
- 단순 기록 대신 나만의 용어로 정리
아는것만 공부하지 말자(7:3)
- 기존 지식을 활용한 문제 풀이
- 기존에 틀렸던 부분 복습
- 새로운 개념 학습 및 문제 풀이
- 기존에 많이 틀렸던 알고리즘 문제 풀이
- 해결하지 못한 부분은 명확히 정리
알고있는 부분(30%) 모르는 부분(70%)
단순기록 대신 나만의 용어로 정리하자(방법)
- 나열식 정리는 타자연습과 다를바가 없습니다.(머리에 남지 않음)
- 개념을 머릿속에서 끝까지 이해한 후에, 완성된 문장으로 정리 합니다.
=> ??? ….. 이런걸 포함한다면 정리하는 의미가 없습니다.
단순기록 대신 나만의 용어로 정리하자(예시)
정렬
사용자가 정의한 기준대로, 데이
터를 나열하는 것
=> 이진탐색 사용 가능
시간 복잡도
비교정렬 : O(NlogN)
비-비교 정렬 : O(N)까지 가능
예시 코드
//something
나만의 언어로 변환
테스트 케이스 설계 하는 법(방법)
- 기본 케이스
- 경계값
- 에지 케이스
테스트 케이스 설계 하는 법(기본 케이스)
- 문제에서 설명한 “기본 동작”이 제대로 동작하는지 확인하는 케이스
문제: 두 정수를 입력받아 합을 반환하라.
입력: a=2,b=3
기대 출력:
5
테스트 케이스: assert sum(2, 3) == 5
문제: 주어진 문자열을 뒤집어 반환하라.
입력: "hello"
기대 출력: "olleh"
테스트 케이스: assert reverse("hello")
== "olleh"
테스트 케이스 설계 하는 법(경계 값)
- 입력값의 양 끝값을 테스트 함
문제: 주어진 양의 정수의 제곱근을 반환하라.
정수 부분만 반환한다.
입력 범위: 1에서 10^6 까지
최소값 입력: 1
테스트: assert sqrt(1) == 1
최대값 입력: 10^7
테스트: assert sqrt(10^6) == 1000
문제: 정수 배열과 타겟 정수가 주어졌을 때, 타겟의 인덱스를 반환
하라. 없으면 -1을 반환.
입력: 배열 [2,3,5,7,11], 타겟 3
경계값 테스트 케이스:
배열의 첫 요소: 2
테스트: assert find_index([2, 3, 5, 7, 11], 2) == 0
배열의 마지막 요소: 11
테스트: assert find_index([2, 3, 5, 7, 11], 11) == 4
테스트 케이스 설계 하는 법(에지 케이스)
- 예상치 못한 입력값이나 특수한 조건
문제: 주어진 정수가 소수인지 아닌지를 판별하라.
에지 케이스:
음수 입력:
테스트: assert is_prime(-1) == False
입력: 0
0은 소수가 아닙니다.
테스트: assert is_prime(0) == False
입력: 1
1은 소수가 아닙니다.
테스트: assert is_prime(1) == False
문제: 주어진 정수가 소수인지 아닌지를 판별하라.
에지 케이스:
음수 입력: 소수의 정의는 양의 정수에만 적용됩니다.
테스트: assert is_prime(-1) == False
입력: 0
0은 소수가 아닙니다.
테스트: assert is_prime(0) == False
입력: 1
1은 소수가 아닙니다.
테스트: assert is_prime(1) == False
의사코드 작성하기
의사코드 -> 구현 전, 비 프로그래밍 언어로 동작을 나열하는 것
장점
- 구현 전 예외사항을 충분히 고려할 수 있음
- 구현보다 시간이 적게 걸림
- 문제점 발견시 수정이 쉬움
의사코드 설계하기(문제분석 후 바로 구현시 문제점)
문제 분석 구현
- 바로 구현하기가 쉽지 않음
- 구현 후, 문제 수정은 시간이 오래걸림
- 문제가 있어도 확인이 쉽지 않음
- 흐름이 한 눈에 보이지 않음
바로 구현시
아쉬운 점
의사코드 설계하기(의사코드 작성시 장점)
문제 분석 구현
- 코드를 바로 구현하지 않고 자유롭게 설계 후 구현
- 의사코드 작성시 확인되는 문제는 수정이 쉬움
- 의사코드는 흐름을 한 눈에 확인 가능
- 전체적인 구조를 잡고 구현하면 코드 품질이 좋아짐
보완 된점
의사코드 작성
의사코드 설계하기(의사코드 작성법)
- 일반인도 이해할 정도의 논리 흐름으로 작성(세부사항까지 필요 없음)
- 추후 의사코드 대로 구현하는 경우가 많음
- 프로그래밍적 문법 사용 지양(고민이 많아짐)
의사코드 설계하기(잘못된 예시 vs 잘된 예시)
변수 A를 DataBase에 저장
포인터 변수 P에 컨테이너의 주소값 저장
1. 사용자의 정보를 저장한다:
- 사용자의 이름과 나이를 수집한다.
- 수집한 정보를 기록한다.
2. 제품 목록을 업데이트한다:
- 새로운 제품 정보를 확인한다.
- 제품 목록에 새 제품을 추가한다.
BAD Good
의사코드 설계하기(예시-알고리즘 문제 1)
알고리즘 문제:
"정수 배열이 주어지면, 모든 원소의 합을 구하고, 이를 출력하는 프로그램을 작성하시오."
1. 숫자로 이루어진 리스트를 준비한다.
2. 모든 숫자의 합을 계산한다:
- 합을 저장할 곳을 마련한다.
- 리스트의 각 숫자를 차례대로 합에 더한다.
3. 계산된 합을 출력한다.
의사코드 설계하기(예시-알고리즘 문제 2)
알고리즘 문제:
"사용자가 입력한 두 수를 비교하여 더 큰 수를 출력하는 프로그램을 작성하시오."
1. 사용자로부터 두 개의 숫자를 입력 받는다.
2. 두 숫자를 비교한다:
- 만약 첫 번째 숫자가 두 번째 숫자보다 크면, 첫 번째 숫자를 선택한다.
- 그렇지 않으면, 두 번째 숫자를 선택한다.
3. 선택된 숫자를 출력한다.
의사코드 설계하기(예시-알고리즘 문제 3)
알고리즘 문제:
"리스트에 있는 숫자들 중 가장 자주 등장하는 숫자를 찾아 출력하고, 그 숫자가 몇 번 등장했는지도 출력하는 프로그
램을 작성하시오."
1. 숫자로 이루어진 리스트를 준비한다.
2. 각 숫자가 몇 번 등장하는지 세어서 기록한다:
- 숫자별로 등장 횟수를 저장할 공간을 만든다.
- 리스트의 각 숫자에 대해, 해당 숫자의 등장 횟수를 1 증가시킨다.
3. 가장 많이 등장한 숫자를 찾는다:
- 가장 많이 등장한 숫자를 기록한다.
- 모든 숫자의 등장 횟수를 확인하면서, 가장 높은 등장 횟수를 갖는 숫자를 찾는다.
4. 가장 많이 등장한 숫자와 그 등장 횟수를 출력한다.
커뮤니티 소개
- 오픈 카톡방
- 깃허브
- 디스코드
커뮤니티 소개(오픈카톡방) cont’d
- 저자 직접 운영
- 대략 400명 정도 인원이 자유롭게 소통
- 개인적인 주제 및 코딩 관련 소통 가능
커뮤니티 소개(오픈카톡방)
커뮤니티 소개(깃허브) cont’d
- 책 문제의 정답코드
- 코딩테스트 준비를 위해 필요한 자료구조 및 알고리즘
- C++ 기본 문법
- STL의 성능 비교
커뮤니티 소개(깃허브)
커뮤니티 소개(디스코드) cont’d
- 모각코 진행
- 공식 스터디 / 개인 스터디 모집 공고 및 진행
- 책 관련 문의 / 답변
커뮤니티 소개(디스코드)

코딩테스트 합격자 되기 C++ 00~ 01장(효율적 공부하는방법).pptx

  • 1.
    코딩테스트 합격자 되기C++ 00~ 01장 효율적으로 공부하기 저자 박경록
  • 2.
    목차 코딩 테스트를 효율적으로준비하는 방법 - 타인의 풀이를 보는 공부 법 - 아는 것만 공부하지 말자 - 테스트 케이스를 고려하는 법 - 의사코드 설계하는 법
  • 3.
  • 4.
    타인의 풀이를 보는공부 법(고민) - 시간이 많다면 충분히 문제에 대해 혼자 고민해보는 것이 좋음 But…. “대부분 수험생들은 시간이 부족함”
  • 5.
    타인의 풀이를 보는공부 법(방법) 1. 최소한 30분 ~ 1시간 정도 고민한다. 2. 그래도 답이 나오지 않을 경우, 답안코드를 본다. => 답안 코드에서 본인이 해결하지 못한 부분을 해결한 코드를 정리 => 답안 코드에서 사용한 알고리즘과 매칭되는 부분을 문제에서 분석 => 2주 정도 후에 다시 구현
  • 6.
    타인의 풀이를 보는공부 법(예시 - 문제) 입력: nums = [2, 7, 11, 15], target = 9 출력: [0, 1] 설명: nums[0] + nums[1] = 2 + 7 = 9 이므로 정답은 [0, 1]입니다 제한 : 입력 크기는 최대 100만 이고 제한시간은 1초 입니다.
  • 7.
    타인의 풀이를 보는공부 법(예시 - 내 코드 vs 정답 코드) 해결하지 못한 코드 정답 코드 ① ②
  • 8.
    타인의 풀이를 보는공부 법(정리) 문제 입력값이 100만 인데, O(N^2) 알고리즘으로 접근해서 TLE 발생 - 정답 코드는 unordered_map을 활용해서 O(N)으로 개선함 => 각 숫자를 unordered_map의 키로 활용 깨달은 점 - 다음 부터는 입력값을 꼭 확인해서 문제에서 요구하는 시간복잡도를 충족 시키자! - 자료구조에 의해서도 시간 복잡도가 영향을 받을 수 있음(자료구조에 맞게 구현하므로)
  • 9.
    아는것만 공부하지 말자(방법) -아는 것만 공부하면 얻는 것은 자신감 뿐… 7:3을 지키자. - 단순 기록 대신 나만의 용어로 정리
  • 10.
    아는것만 공부하지 말자(7:3) -기존 지식을 활용한 문제 풀이 - 기존에 틀렸던 부분 복습 - 새로운 개념 학습 및 문제 풀이 - 기존에 많이 틀렸던 알고리즘 문제 풀이 - 해결하지 못한 부분은 명확히 정리 알고있는 부분(30%) 모르는 부분(70%)
  • 11.
    단순기록 대신 나만의용어로 정리하자(방법) - 나열식 정리는 타자연습과 다를바가 없습니다.(머리에 남지 않음) - 개념을 머릿속에서 끝까지 이해한 후에, 완성된 문장으로 정리 합니다. => ??? ….. 이런걸 포함한다면 정리하는 의미가 없습니다.
  • 12.
    단순기록 대신 나만의용어로 정리하자(예시) 정렬 사용자가 정의한 기준대로, 데이 터를 나열하는 것 => 이진탐색 사용 가능 시간 복잡도 비교정렬 : O(NlogN) 비-비교 정렬 : O(N)까지 가능 예시 코드 //something 나만의 언어로 변환
  • 13.
    테스트 케이스 설계하는 법(방법) - 기본 케이스 - 경계값 - 에지 케이스
  • 14.
    테스트 케이스 설계하는 법(기본 케이스) - 문제에서 설명한 “기본 동작”이 제대로 동작하는지 확인하는 케이스 문제: 두 정수를 입력받아 합을 반환하라. 입력: a=2,b=3 기대 출력: 5 테스트 케이스: assert sum(2, 3) == 5 문제: 주어진 문자열을 뒤집어 반환하라. 입력: "hello" 기대 출력: "olleh" 테스트 케이스: assert reverse("hello") == "olleh"
  • 15.
    테스트 케이스 설계하는 법(경계 값) - 입력값의 양 끝값을 테스트 함 문제: 주어진 양의 정수의 제곱근을 반환하라. 정수 부분만 반환한다. 입력 범위: 1에서 10^6 까지 최소값 입력: 1 테스트: assert sqrt(1) == 1 최대값 입력: 10^7 테스트: assert sqrt(10^6) == 1000 문제: 정수 배열과 타겟 정수가 주어졌을 때, 타겟의 인덱스를 반환 하라. 없으면 -1을 반환. 입력: 배열 [2,3,5,7,11], 타겟 3 경계값 테스트 케이스: 배열의 첫 요소: 2 테스트: assert find_index([2, 3, 5, 7, 11], 2) == 0 배열의 마지막 요소: 11 테스트: assert find_index([2, 3, 5, 7, 11], 11) == 4
  • 16.
    테스트 케이스 설계하는 법(에지 케이스) - 예상치 못한 입력값이나 특수한 조건 문제: 주어진 정수가 소수인지 아닌지를 판별하라. 에지 케이스: 음수 입력: 테스트: assert is_prime(-1) == False 입력: 0 0은 소수가 아닙니다. 테스트: assert is_prime(0) == False 입력: 1 1은 소수가 아닙니다. 테스트: assert is_prime(1) == False 문제: 주어진 정수가 소수인지 아닌지를 판별하라. 에지 케이스: 음수 입력: 소수의 정의는 양의 정수에만 적용됩니다. 테스트: assert is_prime(-1) == False 입력: 0 0은 소수가 아닙니다. 테스트: assert is_prime(0) == False 입력: 1 1은 소수가 아닙니다. 테스트: assert is_prime(1) == False
  • 17.
    의사코드 작성하기 의사코드 ->구현 전, 비 프로그래밍 언어로 동작을 나열하는 것 장점 - 구현 전 예외사항을 충분히 고려할 수 있음 - 구현보다 시간이 적게 걸림 - 문제점 발견시 수정이 쉬움
  • 18.
    의사코드 설계하기(문제분석 후바로 구현시 문제점) 문제 분석 구현 - 바로 구현하기가 쉽지 않음 - 구현 후, 문제 수정은 시간이 오래걸림 - 문제가 있어도 확인이 쉽지 않음 - 흐름이 한 눈에 보이지 않음 바로 구현시 아쉬운 점
  • 19.
    의사코드 설계하기(의사코드 작성시장점) 문제 분석 구현 - 코드를 바로 구현하지 않고 자유롭게 설계 후 구현 - 의사코드 작성시 확인되는 문제는 수정이 쉬움 - 의사코드는 흐름을 한 눈에 확인 가능 - 전체적인 구조를 잡고 구현하면 코드 품질이 좋아짐 보완 된점 의사코드 작성
  • 20.
    의사코드 설계하기(의사코드 작성법) -일반인도 이해할 정도의 논리 흐름으로 작성(세부사항까지 필요 없음) - 추후 의사코드 대로 구현하는 경우가 많음 - 프로그래밍적 문법 사용 지양(고민이 많아짐)
  • 21.
    의사코드 설계하기(잘못된 예시vs 잘된 예시) 변수 A를 DataBase에 저장 포인터 변수 P에 컨테이너의 주소값 저장 1. 사용자의 정보를 저장한다: - 사용자의 이름과 나이를 수집한다. - 수집한 정보를 기록한다. 2. 제품 목록을 업데이트한다: - 새로운 제품 정보를 확인한다. - 제품 목록에 새 제품을 추가한다. BAD Good
  • 22.
    의사코드 설계하기(예시-알고리즘 문제1) 알고리즘 문제: "정수 배열이 주어지면, 모든 원소의 합을 구하고, 이를 출력하는 프로그램을 작성하시오." 1. 숫자로 이루어진 리스트를 준비한다. 2. 모든 숫자의 합을 계산한다: - 합을 저장할 곳을 마련한다. - 리스트의 각 숫자를 차례대로 합에 더한다. 3. 계산된 합을 출력한다.
  • 23.
    의사코드 설계하기(예시-알고리즘 문제2) 알고리즘 문제: "사용자가 입력한 두 수를 비교하여 더 큰 수를 출력하는 프로그램을 작성하시오." 1. 사용자로부터 두 개의 숫자를 입력 받는다. 2. 두 숫자를 비교한다: - 만약 첫 번째 숫자가 두 번째 숫자보다 크면, 첫 번째 숫자를 선택한다. - 그렇지 않으면, 두 번째 숫자를 선택한다. 3. 선택된 숫자를 출력한다.
  • 24.
    의사코드 설계하기(예시-알고리즘 문제3) 알고리즘 문제: "리스트에 있는 숫자들 중 가장 자주 등장하는 숫자를 찾아 출력하고, 그 숫자가 몇 번 등장했는지도 출력하는 프로그 램을 작성하시오." 1. 숫자로 이루어진 리스트를 준비한다. 2. 각 숫자가 몇 번 등장하는지 세어서 기록한다: - 숫자별로 등장 횟수를 저장할 공간을 만든다. - 리스트의 각 숫자에 대해, 해당 숫자의 등장 횟수를 1 증가시킨다. 3. 가장 많이 등장한 숫자를 찾는다: - 가장 많이 등장한 숫자를 기록한다. - 모든 숫자의 등장 횟수를 확인하면서, 가장 높은 등장 횟수를 갖는 숫자를 찾는다. 4. 가장 많이 등장한 숫자와 그 등장 횟수를 출력한다.
  • 25.
    커뮤니티 소개 - 오픈카톡방 - 깃허브 - 디스코드
  • 26.
    커뮤니티 소개(오픈카톡방) cont’d -저자 직접 운영 - 대략 400명 정도 인원이 자유롭게 소통 - 개인적인 주제 및 코딩 관련 소통 가능
  • 27.
  • 28.
    커뮤니티 소개(깃허브) cont’d -책 문제의 정답코드 - 코딩테스트 준비를 위해 필요한 자료구조 및 알고리즘 - C++ 기본 문법 - STL의 성능 비교
  • 29.
  • 30.
    커뮤니티 소개(디스코드) cont’d -모각코 진행 - 공식 스터디 / 개인 스터디 모집 공고 및 진행 - 책 관련 문의 / 답변
  • 31.