0. 문제
풀이한 문제 - 최빈값 구하기 (프로그래머스 입문 / Lv.0 / 정답률 68%)
https://school.programmers.co.kr/learn/courses/30/lessons/120812
1. 테스트 케이스 분석
테이블 하단 파란색 예시들은
문제에 제시된 테스트 케이스 이외에 내가 추가한 예시다
해당 문제에서는 1개 있든 여러 개 있든
가장 많은 개수의 숫자가 최빈값이고
최빈값이 여러 개면 -1을 리턴하고
최빈값이 하나면 그 값을 리턴하는 문제다
문제 자체는 정말 단순했는데
코테 연습이 많이 되어있지 않은 초보 상태라
구현하는 것에 어려움이 있었다
2. 코드 및 풀이
일단 입력 받은 벡터를 정렬부터 했다
sort 함수를 사용하기 위해 <algorithm> 라이브러리를 include 했다
sort 함수 사용방법 -> sort(시작주소,끝주소)
- 배열 : sort(arr, arr+arrSize);
- 벡터 : sort(v.begin(), v.end());
최빈값이 여러 개인 경우가 있을 수 있으니
최빈값들을 저장하는 modes 벡터를 선언했다
cnt 변수는 해당 수의 빈도를 저장하고
mode_cnt는 최빈값의 빈도,
before은 직전의 최빈값을 저장한다
벡터의 크기만큼 반복하는 반복문 내부에
조건문을 작성해서 최빈값을 찾았다
i == 0인 경우 벡터의 첫번째 인덱스 값이므로
해당 값의 빈도인 cnt = 1,
첫번째 값이라 일단 이 값이 최빈값이니까
최빈값 저장 벡터인 modes 에 push back 하고
이전 벡터값 변수에도 해당 값을 저장하고
최빈값의 횟수 벡터에도 한 번이므로 1을 저장한다
벡터의 크기가 1인 경우만 있는 것이 아니니까
i != 0인 경우 최빈값을 구하는 과정을 조건문으로 작성했다
현재 최빈값의 횟수보다 지금 값의 횟수가 더 많다면
최빈값 갱신이 필요하다
이전에 저장해두었던 값은 더이상 최빈값이 아니게 되므로
modes 벡터를 초기화 시키고
지금 찾은 최빈값 (array[i]) 을 modes 벡터에 추가한다
현재 최빈값의 횟수 또한 지금 값의 횟수로 갱신해준다
값의 빈도가 모두 다른 경우만 있는 것은 아니고
최빈값과 빈도가 같은 숫자를 발견한 경우도 있을 것이다
현재 최빈값과 빈도가 같은 숫자라면
이 값 또한 최빈값이므로
modes 벡터에 추가한다
반복문이 끝난 후
저장된 최빈값들의 개수를 확인하기 위해
modes 벡터의 크기를 확인해보면
1인 경우는 최빈값이 하나이므로 그 값을 리턴하고
1이 아닌 경우는 최빈값이 여러 개인 것이므로 -1을 리턴한다
해당 게시글에 사용된 PPT 이미지는
모두 직접 제작했습니다
'[ Computer Science ] > Algorithm_C++' 카테고리의 다른 글
[백준/C++/Greedy] 11047 동전 0 (0) | 2024.08.19 |
---|---|
[백준/C++/Graph] 16928 뱀과 사다리 게임 (0) | 2024.07.28 |
[백준/C++/DP] 1463 1로 만들기 (0) | 2024.06.28 |
[프로그래머스/C++] 주사위 게임 3 (0) | 2024.02.04 |
[프로그래머스/C++] 연속된 수의 합 (0) | 2024.02.04 |
[프로그래머스/C++] 저주의 숫자 3 (0) | 2024.02.04 |
[프로그래머스/C++] 유한소수 판별하기 (1) | 2024.02.04 |