• [C++] 프로젝트 기술 회고, 프로젝트를 마치고 복습 (P01~P05)

    2023. 9. 25.

    by. KAEY


    ✨ INTRO 

    C++ 의 전반적인 기본 지식을 습득하고 몇 개의 스몰 프로젝트를 진행하였다.

    생각보다 자잘한 부분에서 엇 이게 뭐였더라? 싶은 부분이 많았고, 프로젝트 기간이 끝나고 (15일 ~ 21일)

    한 번 다시 되짚어 보면서 ... 아직 부족한 점이 많았구나 생각이 들어 작성한다.

    구현하면서 핵심적이거나 햇갈렸 던 것을 위주로 작성하겠습니다.  😎

    C++ 언제쯤 내게 친숙해질 수 있는걸까...

     

     

    🤦‍♂️ 목차 :

    1. [C++] 베스킨라빈스31 게임 만들기
    2. [C++] 시간 제한 30초의 끝말 잇기 (중복 금지)
    3. [C++] 로또 시뮬레이션
    4. [C++] 마방진 만들기
    5. [C++] 임의의 세 개의 숫자 맞추기 게임, 야구 게임 (스트라이크, 볼)

     


    1. [C++] 베스킨라빈스31 게임 만들기

     

    사용자와 컴퓨터가 서로 번갈아가면서 숫자를 출력해야 했었던 문제.

    그렇다면 차례라는 것을 어떻게 구현하면 좋을까? 생각을 오래 했다. 

     

    숫자를 입력 받고 출력하고, 그 숫자가 31에 도달해서 결과를 도출하는 것이야.

    간단했지만 차례를 구현하는 아이디어를 생각하는데 오래 걸렸다.

    내가 구현하는 것에 사용한 아이디어는 다음과 같다.

     

     

    if (User_turn) {
    	
        ...코드 구현...
        
    	}
        
        else {
        
        ... 코드 구현 ...
        
    	}
       	
        User_trun = !User_trun;

    User_turn 이라는 bool 변수를 생성하고, 그것에 따라서 유저와 사용자 간의 차례를 구분해주면 되는 것..

    프로젝트를 하다 보니까 이 참과 거짓을 통한 flag 기술이 생각보다 많이 쓰였다.

    아무튼 이렇게 참과 거짓을 통한 코드 통제가 생각보다 알차게 쓰여서 솔직히 재밌었음..ㅋ....

     

     

     


    2. [C++] 시간 제한 30초의 끝말 잇기 (중복 금지)

    	// 앞 단어의 마지막과 입력한 단어의 첫글자가 일치하는지 확인
    	if (inputWord.empty() || inputWord.front() != lastWord.back()) {
                cout << "올바른 단어를 입력하세요!" << endl;
                continue;
            }
    
            // 단어 목록을 직접 확인하여 중복된 단어를 검사
            bool isRepeated = false;
            for (const string& usedWord : usedWords) {
                if (inputWord == usedWord) {
                    isRepeated = true;
                    break;
                }
            }

    입력한 단어와 마지막으로 저장된 단어의 끝말 잇기 규칙을 구현해낸 부분.

    아이디어를 생각해내는게 오래 걸리지 막상 코드로 구현하려고 하면 몇 줄 안될 때가 많아서

    굉장히 아쉬울 따름.. 빨리 빨리 생각해내고 싶다 😢

     

     

     

     

     


    3. [C++] 로또 번호 추첨 시뮬레이션

    		while (!calc_Flag) { //트루값이 되면 반복문 종료.
    			cout << "숫자를 입력하세요: ";
    			cin >> user_input;
    
    			calc_Flag = true; 
                //만약 밑에 포문을 거쳐서 숫자가 맞다면 true 유지해서 while문 종료
    			for (char c : user_input) {
    				if (!isdigit(c)) {
    					calc_Flag = false; 
                        //요기에 왔다면 숫자가 아닌 값이라는 의미.
    					break;
    				}
    			}
    			if (!calc_Flag) {
    				cout << i << " 번쨰 숫자에 입력한 값이 숫자가 아닙니다. 다시 입력하세요.\n" << endl;
    			}
    
    			if (calc_Flag) { 
                //숫자라는 의미이므로, 입력한 스트링값을 int로 바꿔서 num1에 저장
    				num = stoi(user_input);
    			}
    		}
    		i++;
    		calc_Flag = false;

    사용자가 입력한 값이 숫자가 아닌 상황인 경우 무한 루프를 돌기에 예외 상황을 놓고 싶었다.

    근데, 막상 구현하려고 하니 C++ 에서 입력한 값이 숫자임을 검증하는 과정은 생각보다 번거로웠음.

    입력한 값을 string으로 받아서 isdigit() 함수를 통해 정수로 이루어져 있음을 판단해야 했다.

     

     

    이거 이외에는 자체적으로 제공되는 정수 판별 함수같은건 없는 듯 했다..ㅠ

    정수라고 판단이 됐다면, 그걸 다시 stoi() 를 이용해서 정수로 바꿔서 저장하는 식으로 사용하였음.

    i 의 경우 몇 번째 숫자가 잘못 입력됐는지 판단하기 위해서 사용하였다.

     

     

     


    4. [C++] 마방진 만들기

    // 다음 위치 계산 (우상단으로 이동)
    int nextRow = (row - 1 + n) % n;
    int nextCol = (col + 1) % n;
    
    // 다음 위치가 이미 채워져 있는 경우, 아래로 이동
    if (magicSquare[nextRow][nextCol] != 0) {
    	row = (row + 1) % n;
    }

    위치 이동에 대한 개념이 중요했다.

     

    직접 메모장에 적어서 확인해본 결과. 

    예를 들어, 2,3 에서 1,4로 이동할 땐 , 각각 -1 , +1 되는 모습을 볼 수 있었다.

    따라서 다음 row col 값의 변수에 -1 +1 을 해주고,

    col 값이 0이 되는 경우가 존재하기에 ( 빼기가 기본이므로 )

    0이 될 때, 가장 밑인 (5,n) 으로 이동해야하므로, 기본으로 5를 더해주고 나머지 연산을 통해

    0이 아닌 경우 5가 사라질 수 있도록 했다. 

    에초에 기본적인 마방진의 크기가 n으로 입력받고 n * n 의 크기를 유지할 것 이므로

    연산에는 % 5 를 통해 마방진의 크기를 통제하는 것이 좋다.

     

     


    5. [C++] 임의의 세 개의 숫자 맞추기 게임, 야구 게임 (스트라이크, 볼)

    if (num < 1 || num > 9 || find(User_number.begin(), User_number.end(), num) != User_number.end()) {
    //입력 값이 1보다 작거나, 9보다 크거나, 중복값이 있으면 잘못됨.
    	cout << "잘못된 입력입니다. 다시 입력하세요. 중복되었는지 혹은 범위를 초과하였는지. \n" << endl;
    	i--;
    	continue;
    }
    
    User_number.push_back(num);

     

    find 함수를 사용해서 중복 값이 있는지 판단한다. 

    해당 백터의 처음과 끝(+1)까지 num 이 있는지 확인하고, num 이 있다면 num 을 반환함.

    반대로 User_number.end()의 값이 반환되면 컴퓨터숫자와 일치하는게 없다는 의미. (인덱스 값 반환)

     

     

    end() 의 값과 일치하지 않으니까 num 이 반환했다는 뜻이므로 같은 값이 있다는 의미.

    생각보다 이 find 함수를 이해하는 데 너무 오래 걸렸다 😢

    진짜 별 거 아닌거 같으면서도 하나하나 넘겨짚고 가자니 아쉽고.. 

    내 페이스대로 천천히 가는게 맞는걸까 싶다가도 그래도 놓치는 건 아쉽기도 해서

    제대로 알고 넘어가쟈...😎

     

     

     

     


    🎉해당 글의 내용은 "포스코 x 코딩온 스마트 팩토리 과정 수업" 에서의 수업 자료 및 실습 과제 등에서 일부 발췌되어 작성 되었습니다.


    댓글 (비로그인 댓글 허용하지 않습니다.)