2026-03-03(화)

조범근·2026년 3월 3일

TIL

목록 보기
8/25

오늘은 4시간 동안 반복문 하나만 잡았다. 반복문이 날 안 놔준건지 내가 반복문을 안 놔준건지 모르겠다. 물론 틀린건 내 반복문 이론이 빈약해서 였다. 왜인지는 몰라도 반복문 안의 반복문의 변수 i, j , k 순으로 하나씩 해서 총 3개의 반복문을 썻다고 하면, 제일 바깥에 있는 반복문i가 반복될때 j, k의 값이 같이 증가한다고 생각하고 있었다. ㅎㅎ;
교정했으니까 4시간이 헛되진..

Q&A

Q1. 왜 else if로 처리 안하고 if를 두번 쓰죠??

bool IsEqual(const char str1[], const char str2[]) {
    for (int i = 0; i < 100; i++) {
        if (str1[i] != str2[i]) return false;
        if (str1[i] == '\0') break; // 일치하니까 루프 탈출
    }
    return true; // 여기서 한 번에 처리
}

A1. 함수 마지막에 return ture;로 if의 나머지 상황이(esle if) 해결이 돼서를 쓰지 않아도 됨. 이걸 Early Return 패턴이라고 부르며 깔끔한 코딩이라는데 잘 모르겠음.
그리고 return; 값을 받으면 함수를 종료한다고 함.

Q2. 왜 ptr_a->first 처럼 *을 붙여 역참조를 안해도 값이 나옴?

A2. ptr_a->first는 *(ptr_a).frist를 편하게 쓰기 위해 만든거라고 함. 너무 번거롭고 가독성이 떨어지기 때문에 "포인터라면 화살표(->)를 써서 한번에 해결하자고 약속했다고 함.

Q3. 학생의 수를 입력 받아서 배열의 값을 늘리고 싶은데 무조건 동적할당(Heap)을 해야하나요??

#include <iostream>

int main()
{
	int sum = 0;
	int num;

	std::cout << "Please student number : ";
	std::cin >> num;

	int* arry = new int[num];

	for (int i = 0; i < num; ++i)
	{
		std::cout << i + 1 << ". student score : ";
		std::cin >> arry[i];

		sum = sum + arry[i];
	}

	std::cout << "Total Score : " << sum << std::endl;
	std::cout << "Average Score : " << (float)sum / num;

	delete[] arry;
}

A3. 코드 순서상 std::cin >> num; 뒤에 int arry[num];을 쓴다고 해도 정적 배열(stack)은 프로그램이 실행되기도 전인 컴파일 단계에서 이미 설계가 돼 있어야한다. 크기를 정하지 않고 쓸거면 동적할당을 써야함.
컴파일러는 코드를 위에서 아래로 실행하는 존재가 아니라, 코드 전체를 보고 구조를 미리 확정 짓는 존재이기 때문이라고 함.

학습한 것

구조체

#include <iostream>
#include <cstring>

const int kMaxStr = 100;

struct MyStruct
{
	int first;
	int second;
};

int main()
{
	// member(.) opereator
	MyStruct a;
	a.first = 123;
	a.second = 456;

	// a.first = 4byte , a.second = 4byte 두개 더하면 8
	std::cout << sizeof(a) << std::endl;
}

Mystruct라는 구조체를 만들어 a라는 변수를 선언했는데 int first, second가 들어있는 sizeof(a)의 값은 얼마일까??
정답은 int자료형 두개 합쳐서 8byte.
그 이상 들어 있을때도 있다고함

반복문

#include <iostream>

int main()
{
	int num, i, j, k;
	std::cin >> num;

	for (i = 0; i < 2 * num; ++i)
	{
		if (i >= num) // 뒤에 
		{
			for (j = 0; j <= i - num; ++j)
			{ 
				std::cout << " ";
			}
			for (k = 0; k < 2*(2*num-2-i)+1; ++k)
			{ // 5 3 1  1 2 3  
				std::cout << "*";
				//0 1 2 3 4 5 6 7
			}
			std::cout << std::endl;
		}
		else
		{
			for (j = i; j < num - 1; ++j)
			{
				std::cout << " ";
			}
			for (k = 1; k <= 2 * i + 1; ++k)
			{ // 1 3 5 7
				std::cout << "*";
			}
		std::cout << std::endl;
		}
	}
}


/*
4 입력
   *1       4
  ***3      3   
 *****5     2
*******7    1
            2
			3
			4
   */

4시간 잡았다는 그 것 평소에 헷갈린다고 생각을 안 했는데 막상 풀려고 하니까 알고있었다고 착각한게 있었다. i라는 큰 반복문이 감싸고 j, k를 돌면 j, k 값은 변하지않음.. 당연한건데..

0개의 댓글