C++ 코딩테스트 공부 (중단)/c++ 백준 문제풀이

#4 1차원 배열(2)

2022. 3. 26. 10:26
목차
  1. 벡터에 대한 학습
  2. 백준 문제풀이

벡터에 대한 학습

 

벡터에서의 중복 제거

 

벡터에서의 중복 제거는 sort, unique, erase를 활용하면 구현 가능하다.

sort와 unique는 algorithm 라이브러리에 포함되어 있다.

 

unique 함수는 중복되지 않는 원소들을 앞에서부터 채워나가는 함수이다.

연속된 중복 원소를 vector의 제일 뒷부분 쓰레기값으로 보내버린다.

unique가 끝났으면 반환되는 값은 vector의 쓰레기값의 첫 번째 위치가 된다.

이 때문에 unique 후에 바로 erase를 사용하면 되는 것이다.

 

erase 함수는 vector 배열에서 특정 원소를 삭제하는 함수이다.

v.erase(v.begin()+s, v.begin()+e) 일 경우 [s, e) 원소가 삭제된다. s는 포함, e는 미포함(열린 구간)

그러니까 v.erase(unique(v.begin(), v.end()), v.end()); 일 경우

unique가 반환하는 쓰레기값부터 v.end()까지(열린구간) 삭제하는 것이다.

 

내가그린기린그림x벡터그림o

 

그렇다면 { 2, 5, 2, 4, 6, 7, 6 } 벡터를 정렬하고 중복을 제거해보자

답이 { 2, 4, 5, 6, 7 } 이 나와야 한다.

 

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    vector<int> v = {2, 5, 2, 4, 6, 7, 6};
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
    
    for(int i=0; i<v.size(); i++) {
        cout << v[i] << " ";
    }
     
    return 0;
}
// 결과
// 2 4 5 6 7
// 이 출력된다.

 

성공적으로 벡터의 중복을 제거하였다.

중복을 제거하였으므로 v.size() == 벡터의 서로 다른 원소의 개수임을 이용해서 문제를 해결할 수도 있을 것 같다.

 

 

 

벡터에서의 중복된 원소 개수 구하기

만약 벡터에서 중복된 원소의 개수를 구하라고 하면 어떻게 구하면 좋을까?

검색해도 자료가 별로 없는 것 같아서 직접 작성하고 사용하기로 결심했다.

 

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    vector<int> v = {2, 7, 4, 5, 6, 7, 2, 7, 8, 8, 8};
    vector<int> vv;
    
    vector<int> b;
    int n;
    int a, c;
    int countN = 1; 
    int vn;
    
    sort(v.begin(), v.end()); // 2 2 4 5 6 7 7 7 8 8 8
    
    for(int i=0; i<v.end()-v.begin(); i++) {
        if (i < v.end()-v.begin()-1) {
            if (v.at(i) == v.at(i+1)) {
                countN++;
            }
            else {
                cout << v.at(i) << "의 개수: " << countN << "\n";
                vn = countN;
                vv.push_back(vn);
                countN = 1;
            }
        }
        else if(i == v.end()-v.begin() - 1) {
            cout << v.at(i) << "의 개수: " << countN << "\n";
            vn = countN;
            vv.push_back(vn);
        }
    }
    
    // 지금까지 각 숫자의 개수를 새 벡터 vv에 저장함
    // 1을 제외한 모든 수를 합하면 중복된 숫자의 개수가 된다.
    int k = 0;
    for(int i=0; i<vv.size(); i++) {
        if (vv.at(i) > 1) {
            k += vv.at(i);
        }
    }
    cout << "중복된 숫자의 개수는: " << k;
    
    return 0;
}

실행 결과

 

 

 

백준 문제풀이

 

백준 3052번 문제 : 나머지

문제 :

 

소스코드 :

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int n, nn;
    vector<int> v; 
    // 10번째 줄 까지 수 입력받기
    // 받은 수에서 42나눈 수들 vector에 push_back
    for(int i=0; i<10; i++) {
        cin >> n;
        nn = n % 42;
        v.push_back(nn);
    }
    // sort와 unique 이용해서 중복된 수 제거하고
    // 서로 다른 값이 몇 개 있는지 출력하기 
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
    cout << v.size();
    
    return 0;
}

 

 

 

백준 1546번 문제 : 평균

문제 :

 

소스코드 :

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    // 점수 중 최댓값 M, 모든 점수를 점수/M*100으로 수정
    
    int n, a, fake;
    float b;
    float c = 0;
    vector<int> v;
    //vector<float> vv;
    cin >> n;
    for(int i=0; i<n; i++) {
        cin >> a;
        v.push_back(a);
    }
    
    float max = *max_element(v.begin(), v.end());
    for (int i=0; i<v.size(); i++) {
        b = v.at(i) / max * 100;
        //vv.push_back(b);
        c = c + b;
    }
    cout << c / v.size();

    return 0;
}

 

 

 

 

백준 8985번 문제 : OX퀴즈

문제 :

 

소스코드 :

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>

using namespace std;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int n;
    string a;
    string b;
    int k = 0;
    int point = 0;
    vector<string> v;
    // 스트링 벡터에 n만큼 스트링들 저장
    cin >> n;
    for(int i=0; i<n; i++) {
        cin >> a;
        v.push_back(a);
    }
    // 각 인덱스에 있는 스트링 for문으로 읽어서 점수 계산
    for(int i=0; i<v.size(); i++) {
        for(int j=0; j<v[i].length(); j++) {
            b = v.at(i);
            char bStr = b.at(j);
            if (bStr == 'O') {
                k++;
                point = point + k;
            }
            else {
                k = 0;
            }
        }
        cout << point << "\n";
        k = 0;
        point = 0;
    }

    return 0;
}

 

 

풀이 및 학습내용 :

 

bStr를 string으로 하고 if (bStr == "O") 해서 오류가 발생했었다.

bStr을 char형으로 받고 'O'를 해야한다.

 

 

 

 

 

백준 4344번 문제 : 평균은 넘겠지

문제 :

 

소스코드 :

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
void repeat();
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int c;
    cin >> c;
    for(int i=0; i<c; i++) {
        repeat();
    }

    return 0;
}

void repeat() {
    int n;
    cin >> n;
    vector<int> v;
    
    for(int i=1; i<=n; i++) {
        int num;
        cin >> num;
        v.push_back(num);
    }
    double avg = 0;
    
    for(int i=0; i<v.size(); i++) {
        avg = avg + v.at(i);
    }
    avg = avg / n;
    
    double over = 0;
    for(int i=0; i<v.size(); i++) {
        if (v.at(i) > avg) over++;
    }
    
    double result = (over / n) * 100;
    cout << fixed;
    cout.precision(3); // .000 
    cout << result << "%\n";
}

 

풀이 및 학습내용 :

 

함수를 이용하는 법

 

cout << fixed;

cout.precision(n);

으로 소수점 고정하는 법

 

 

 

 

지금까지 4단계인 1차원 배열까지 문제를 풀고 학습해보았다.

 

 

 

 

 

출처 :

 

https://www.acmicpc.net/problem/3052

 

3052번: 나머지

각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.

www.acmicpc.net

https://www.acmicpc.net/problem/1546

 

1546번: 평균

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보

www.acmicpc.net

https://www.acmicpc.net/problem/8958

 

8958번: OX퀴즈

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수

www.acmicpc.net

https://www.acmicpc.net/problem/4344

 

4344번: 평균은 넘겠지

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

www.acmicpc.net

 

'C++ 코딩테스트 공부 (중단) > c++ 백준 문제풀이' 카테고리의 다른 글

#6 문자열1  (0) 2022.03.28
#5 함수  (0) 2022.03.27
#4 1차원 배열(1)  (0) 2022.03.25
#3 반복문  (0) 2022.03.23
#2 조건문  (0) 2022.03.23
  1. 벡터에 대한 학습
  2. 백준 문제풀이
'C++ 코딩테스트 공부 (중단)/c++ 백준 문제풀이' 카테고리의 다른 글
  • #6 문자열1
  • #5 함수
  • #4 1차원 배열(1)
  • #3 반복문
daramG
daramG
dotori Java
daramG
다람쥐의 개발 블로그
daramG
전체
오늘
어제
  • 분류 전체보기 (193)
    • Java 코딩테스트 공부 (67)
      • Java 알고리즘 공부 (37)
      • Java 백준 문제풀이 (27)
      • Java 코테 나만의 팁 (3)
    • SQL Study (0)
      • Programmers SQL 문제풀이 (0)
      • SQLP 준비 (0)
    • 웹 개발 지식 정리 (0)
      • Servlet (0)
      • Java 정리 (0)
    • 자바 스프링 (45)
      • 스프링 공부 (4)
      • 스프링 게시판 프로젝트 (6)
      • 부트 블로그 JPA 프로젝트 (30)
      • react & springboot (5)
      • 스프링 오류창고 (0)
      • 리액트 + 스프링 프로젝트 (0)
      • pf (0)
      • pfError (0)
    • React (6)
      • React 정리 (3)
      • React 오류 창고 (3)
    • C++ 코딩테스트 공부 (중단) (20)
      • c++ 백준 문제풀이 (15)
      • c++ 알고리즘 공부 (5)
    • Unity (3)
      • Unity 공부 (3)
    • WebRTC (2)
      • WebRTC 강의학습 정리 (0)
      • WebRTC 프로젝트 (1)
    • 김영한님의 스프링 강의 학습 (10)
      • 스프링 강의 목차 (1)
      • 인텔리제이 & 스프링 기초 (1)
      • 스프링 핵심 원리 (8)
    • 전공 지식 정리 (40)
      • interview (0)
      • Java (0)
      • 운영체제 (4)
      • 데이터베이스 설계 (10)
      • 소프트웨어 공학 (3)
      • 유닉스 (14)
      • 디지털 논리회로 (0)
      • 인공지능 (7)
      • js (0)
      • etc (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 부트 jpa 게시판 프로젝트
  • Java 코테 나만의 팁
  • 스프링부트 프로젝트
  • 인공지능
  • Unity 공부
  • 디지털 논리회로
  • 스프링 공부
  • 스프링 프로젝트
  • 김영한의 스프링 핵심 원리
  • java
  • 데이터베이스 설계
  • 운영체제
  • 노마드코더의 zoom클론코딩
  • 김영한 스프링 강의
  • 유닉스
  • React&Spring 강의수강
  • java 알고리즘
  • 김영한 스프링 입문
  • 백준 c++
  • Java 백준 문제풀이
  • 코테 알고리즘
  • 스프링부트 블로그 프로젝트
  • 무서운 이야기
  • C++ 알고리즘

최근 댓글

최근 글

hELLO · Designed By 정상우.
daramG
#4 1차원 배열(2)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.