백준(baekjoon)-C++ 정리

18281 단어 vector12921181find1181

1181 단어 정렬

//방법 1

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

using namespace std;

bool compareWith(string a, string b){
  if(a.length() == b.length())
    return a<b;
  return a.length()<b.length();
}

int main(){
  int N;
  vector<string> vec;  
  cin>>N;
  for(int i=0; i<N; i++){
    string str;
    cin>>str;
    if(find(vec.begin(), vec.end(), str) == vec.end()) //
      vec.push_back(str);
  }
  sort(vec.begin(), vec.end(), compareWith);

  for(int i=0; i<vec.size(); i++){
    cout<<vec[i]<<'\n';
  }
}


//방법 2


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

using namespace std;

int n;
string a[20000];

bool compare(string a, string b) {
	if (a.length() < b.length()) {
		return 1;
	}
	else if (b.length() < a.length()) {
		return 0;
	}
	else {
		return a < b;
	}
}

int main() {
	cin >> n;

	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	sort(a, a + n, compare);

	for (int i = 0; i < n; i++) {
		if (i > 0 && a[i] == a[i - 1]) continue;
		cout << a[i] << ' ';
	}

}

벡터(vector)
:동적 배열구조의 클래스
장점: 자유롭게 크기를 변경, 순차적이고 랜덤적으로 값에 접근하는 작업에 용이함
단점: 데이터 검색이 느리고, 순차적이지 않은 중간 부분의 데이터의 삽입과 삭제를 요하는 상황에서 비효율적임
vector<자료형> 변수명 (숫자, 이름, 배열 등등 모두 가능?)
v.begin():벡터 시작점의 주소 값 반환
v.end(): 벡터 (끝부분+1) 주소 값 반환
v.push_back():벡터의 마지막 부분에 새로운 요소를 추가함

참고자료: https://hwan-shell.tistory.com/119

find(first, last, type?): 범위안에 있는 원소들 중 type와 일치하는 첫 번째 원소를 반환해줌.(만약 찾지 못한 경우에는 last를 반환)

방법1
벡터로 문자열을 저장할 공간 생성
문자열을 입력받고, 입력받은 문자열과 동일한 문자가 벡터 배열 속에 존재하는지 확인
->find함수는 값을 찾지 못한경우 last값을 반환하므로, last값이 반환된다면(==vec.end()), 입력된 문자열과 벡터의 값들이 일치하지 않음을 의미.
존재하지 않는다면 벡터의 마지막 부분에 문자열을 추가함
sort 함수와 미리 만들어둔 compareWith함수로 사전순, 길이순으로 정렬함
최종적으로 완성된 벡터의 크기만큼 반복하며 값을 출력

방법2
단어를 지정된 수만큼 입력받아 string 배열에 각각 저장하기
배열의 처음부터 끝까지 만들어놓은 compare함수를 기준으로 정렬하기
->compare함수: 길이순으로 먼저 정렬(길이가 짧으면 순서를 앞으로)-> 사전순으로 정렬(사전순으로 정렬 시 그냥 a<b처럼 해두어도 아스키코드로 참과 거짓을 판단하여 정렬이 가능함)

정렬 이후, 같은 단어가 있는지 확인하고, 같은 단어가 있다면 출력하지 않고 다음 단어의 동일 여부를 파악하는 구문으로 continue, 아니라면 출력.(단어를 정렬한 상태이므로 앞뒤단어의 동일 여부만 파악하면 된다.)
+i>0인 이유는 i가 0일 경우에 a[0]와 존재하지 않는 a[-1]과의 비교를 피하기 위해서임


1292 쉽게 푸는 문제

#include <iostream>

using namespace std;

int main(){
    int number[1001], k=1;
 
    for(int i=1;i<=1000;i++){ //1~1000까지의 숫자
        for(int j=1;j<=i;j++){
            number[k]=i; //1~1000까지의 숫자를 1씩 증가하면서 반복해서 넣어주기,,응?
            if(k>1000){
                break; //배열이 모두 차면 for문 빠져나오기
            }
            k++; 
        }
    }


    int a, b, result=0;
    cin>>a>>b;
    for(int i=a;i<=b;i++){ //합해서 출력
        result+=number[i];
    }
    cout<<result;

}

for문 2개로 중첩해서 1을1번, 2를 2번,,, 반복해서 더하기

오늘의 tmi:

#include <stdio.h>

if(다음주 시험인 사람==&& 공부 안하는 사람==)
{="명랑핫도그 퇴사한";
    printf("%s",);
    printf(" 노답");
}

출력 결과: 명랑핫도그 퇴사한 노답

+곰곰히 생각해 보았는데, 나는 시험공부를 정말 더럽게 안 한다. 하지만? 이런 것도 경험해보아야 하는 것이 아닐까? 때로는 시험을 망쳐보는 것도 일종의 도전이고 실패이지 않을까? 이렇게 한 번 정도는 시험을 망쳐보는 경험을 하고, 후에 이전의 나를 있는 힘껏 질타하고 비난하며 열심히 학점을 관리해보는 것도 충분히 가치 있는 일이 아닐까?
나는 그렇게 생각한다. 왜냐고 묻는다면 지금 시험공부가 너무 매우 하기 싫기 때문이다.
고로 앞으로 나는 전날에는 어떻게든 해보겠으나 그렇게 열심히 시험공부를 하지 않을 것이다.
지금부터의 나에게는 이런 기깔난 면죄부를 통해, 앞으로의 노는 시간에 죄책감을 가지지 않도록 해 줄 것이다.
-노는게 제일 좋은 수인-

좋은 웹페이지 즐겨찾기