알고리즘/알고리즘 관련 메모장

c++ 1일차 백준 단계별로 풀어보기 1~4단계

잡담연구소 2020. 11. 7. 05:49

다음 주 알고리즘 스터디를 준비해야돼서 C++을 공부하려 그랬는데 이자식,,, 생각보다 어렵다.

이름공간이요...? 이런 건 초면인데용.... 

심지어 c언어 한 3달 안 썼다고 다 까먹음,,,ㅜㅠ 

ㄱ그래서 씹어먹는 c++이라는 사이트를 한장한장 뿌수면은 불가능이고 빠르게 한 챕터씩 보면서 바로 백준 단계별 문제풀이를 진행하려고한다. 

modoocode.com/136  

 

씹어먹는 C++ - <1 - 2. 첫 C++ 프로그램 분석하기>

 

modoocode.com

 

std::cout << /* 출력할 것 */ << /* 출력할 것 */ << ... << /* 출력할 것 */;

 

std라는 이름공간속 cout (c언어에서의 stdout 이라니까 바로 이해됨)

std::endl 은 그냥 화면에 엔터를 쳐주는 \n역할을 한다.

C언어와 동일하게 맨 마지막 ; 를 붙여주자!

 

1. 기본 출력과 엔터키

 

Hello World! (www.acmicpc.net/problem/2557) 를 출력하고 싶으면

std::cout<<Hello World!<<std::endl;

 

강한친구 대한육군(www.acmicpc.net/problem/10718)을 치고싶으면 

for문은 아직 쓰지 않겠다.

 std::cout<<"강한친구 대한육군"<<std::endl
        <<"강한친구 대한육군"<<std::endl;

띄어쓰기를 해야되니까 endl을 한 번 쓰고 그 뒤에 이어서 강한친구 대한육군을 써준 후 ; 으로 마무리

 

2. 입력받기 cin

c에서 scanf 역할을 c++에서는 cin >> 이 한다. 연달아 입력 두 번을 어떻게 받을까 고민하다가 다른 사람의 소스코드를 봤는데 생각보다 쉬워서 당황해따 ; ㅂ ; 그냥 >> 한 번 더 하면 됨 

 

std::cin >> /* 입력받을 변수 */ ...>> /* 입력받을 변수 */;

 

www.acmicpc.net/problem/1000는 

    int a , b ;
    std::cin>>a>>b;
    std::cout<<a+b<<std::endl;

 

3. 소숫점 자릿수 조절 

또 나를 괴롭힌다 소숫점 자릿수 ,,,, 그냥 (double)쓰면 될 줄 알았는데 자꾸 틀렸다고 그런다.

semaph.tistory.com/7를 참고했다.

 

c++은 기본값이 전체 6자리 고정에 반올림이다.  

cout.precision(n); precision이라는 함수는 전체자리수를 n만큼 고정해준다.

 

cout << fixed;

cout.precision(n);

cout<<fixed는 소수점 아래자리를 고정 , precision을 아래에 연달아쓰면 소수점 아래자리가 n만큼으로 고정된다. 

cout.unsetf(ios::fixed);  소수점 아래자리만으로 고정해놓은 걸 풀고싶으면 줄을 추가해주면된다.

 

헠 이제 using namespace std; 으로 바꿀거다.

 

4. switch문 복습

시험성적 처리는 switch문이 국룰인것인지 항상 매번 나온다

switch(score/10){ 
        case 10: 
        case 9:  
            cout<<"A"<<endl; 
            break; 
        case 8: 
            cout<<"B"<<endl; 
            break; 
        case 7: 
            cout<<"C"<<endl; 
            break; 
        case 6:  
            cout<<"D"<<endl; 
            break; 
             
        default: 
            cout<<"F"<<endl; 
            break; 
       
    }

if문을 계속 쓰면 너무 지저분하니까 switch문을 쓴다. 

90~100일 때, A인거에 대해서 어떻게 하지 고민했는데 여러 CASE에 대해서 같은 동작을 하고싶으면 

그냥 아무것도 없이 연달아서 CASE를 쓰면 된다고한다 ㅎㅎ 

 

5. if문에서 or 쓸 때

 

python 이랑 c랑 번갈아하다보면 매번 헷갈리는 것 중에 하나다.

(year%100 != 0) or (year%400 == 0) -- ❌

(year%100 != 0 or year%400 == 0) --

 

6. cin,cout 대신 printf, scanf 쓰기 

www.acmicpc.net/problem/15552 를 풀면서 c++에서도 scanf , printf를 쓸 수 있는 걸 처음 알았다,,,!

입출력 입력방식별 소요시간

cupjoo.tistory.com/97takeknowledge.tistory.com/15 를 참고했다.

cin이 scanf에 비해 2.5배 정도 느리기 때문에 printf, scanf를 추천한다고 한다 ㅠㅠ

단, 사용하려면 C언어와 같이 #include<stdio.h>를 써줘야한다.

심장뛴다 그냥 C랑 너무 비슷한 거 같아서 살짝 기쁘려고한다.  

#include<iostream> // 안써도 됨 
using namespace std; //안써도 됨 
#include<stdio.h>



int main(){
    int n , i , a, b;
    
    scanf("%d", &n);
        
    for (i=0;i<n;i++){
        
        scanf("%d %d" ,&a ,&b);
        printf("%d\n" ,a+b);
    
    }
}

이렇게 간단하게 해결 ㅎㅅㅎ 앞으로 scanf , printf를 사용하겠다.

 

7. EOF

www.acmicpc.net/problem/10951 문제를 풀려면 EOF 개념을 알아야한다. 

공부를 분명 이번 여름에 했던 거 같은데^__________^ 어디갔누

EOF : END OF FILE의 약자로 , 파일이 끝났다는 것을 알려준다. 

scanf는 기본적으로 받은 문자를 리턴하는데 , EOF를 만나면 -1을 반환한다.

윈도우에서는 ctrl+z를 누르면 EOF라고한다. 

그럼 EOF를 입력받기전까지 계속 while문을 통해서 입력받으려면 코드를 어케 짜야할까

while문의 조건문에 eof가 아닐때라고 넣어주면 된다. 라는 생각으로 코드를 짰는데 틀렸다! 

#include<stdio.h>

int main(){
    int a, b;
    while(scanf("%d %d" , &a,&b)!=EOF){
        scanf("%d %d" , &a , &b);
        printf("%d" ,a+b);
    }
        
}

 멘붕와서 질문 검색을 뒤진 결과 scanf를 while문에서 받았으면 그 이후로는 더 안받아도 된다고 한다.

#include<stdio.h>

int main(){
    int a, b;
    while(scanf("%d %d" , &a,&b)!=EOF){
        printf("%d\n" ,a+b);
    }
        
}

이렇게 짜면 정답! ╰(*°▽°*)╯사실 \n 안써서 몇 번 틀렸는데 생각보다 개행문자가 너무 힘들게 한다.

 

 

 

 

 

 

 

 

 

'알고리즘 > 알고리즘 관련 메모장' 카테고리의 다른 글

C++ 배열/벡터 copy 와 memset  (0) 2020.12.11
BFS , DFS 알고리즘 - 예제풀이  (1) 2020.12.09
c++ 3일차  (0) 2020.11.13
C++ string 사용법  (0) 2020.11.09
C++ - 2일차 백준 단계별로 풀기 5~7단계  (0) 2020.11.08