분류 전체보기 36

후위 증감연산자와 전위 증감연산자의 비밀

증감 연산자를 배울 때, 보통 후위(postfix) 증감연산자는 '할당 후', 즉 '연산자 우선 순위가 증감연산자에 비해 낮은 다른 연산 후' 연산을 하게 되고 전위(prefix) 증감연산자는 '할당 전', 즉 '연산자 우선 순위가 증감연산자에 비해 낮은 다른 연산 전' 연산을 하게 된다고 배운다(할당 연산자는 연산자 우선 순위가 증감 연산자에 비해 낮다). 이 포스트에서 우리는 도대체 왜 이런 현상이 발생하는지 알아보려고 한다. 잘 생각해보면 이는 굉장히 모순적인 문장이다. 예를 들면, 연산자 우선순위가 자신보다 낮은 '할당연산자'의 연산인 '할당' 이후에 후위 증감연산자가 연산을 수행하게 되는 것은 말이 안된다. 말 그대로, 후위 증감연산자가 연산자 우선순위가 더 높기 때문이다. 그렇다, 사실 이는..

Notes for C 2022.08.17

백준 2748번 피보나치 수 2 [C언어]

Sol) #include int main() { unsigned long long fibo[91] = {0, 1}; int n = 0; for(int i = 2; i < sizeof(fibo) / sizeof(long long); i++){ fibo[i] = fibo[i - 1] + fibo[i - 2]; } scanf("%d", &n); printf("%llu\n", fibo[n]); return 0; } 피보나치 수 2 문제는 전에 풀었던 피보나치 수 문제와 기본 로직은 같다. 단지 n의 범위가 90까지 커졌다는 변화만 있을 뿐이다. 전에 n이 훨씬 더 커지면 포인터로 동적 할당을 해야겠다고 했는데, 지금 생각해보니 어차피 문제에서 n의 최대값이 정해져 있을텐데 굳이 느린 malloc함수를 써가면서까..

BOJ 2022.08.15

백준 2747번 피보나치 수 [C언어]

Sol) #include int main() { int fibo[46] = {0, 1}; int n = 0; for(int i = 2; i < sizeof(fibo) / sizeof(int); i++){ fibo[i] = fibo[i - 1] + fibo[i - 2]; } scanf("%d", &n); printf("%d\n", fibo[n]); return 0; } 이 문제는 "의지충만#3 : 배열또는 포인터" 라는 백준 문제집에 있었다. 전에 재귀함수로 푸는 피보나치 수 문제를 푼 적이 있었기에 피보나치 수 문제는 무조건 재귀로 푸는 것이라는 잘못된 인식이 박혀있었다. 그래서 그리 어려운 문제는 아니었음에도 불구하고 처음 봤을 때 조금 당황했다. '피보나치 수 문제를 배열이나 포인터를 이용해서 어떻게..

BOJ 2022.08.15

scanf 함수

표준입력(stdin) 스트림으로부터 형식에 맞는 데이터를 읽어 온다. scanf(형식 문자열, 데이터 저장 포인터)를 인수로 갖는다. 형식에 맞는 데이터를 읽어 오는데 성공하면 읽어온 값의 개수를 integer형으로 반환한다. 만일 사용 가능한 입력이 있었으나, 해당 입력이 형식 문자열의 형식과 맞지 않았을 경우 0을 반환할 수 있다. 또한, 읽어보기도 전에 오류가 발생할 경우 -1을 반환할 수 있다. C언어는 운영체제와 상관없이, 파일의 끝에 도달했을 떄 언제나 특별한 값(EOF, -1)을 반환하도록 돼 있다. EOF는 End Of File의 약자로, 파일의 끝을 표현하기 위해 -1로 정의된 상수이다(Windows에서는 Ctrl + Z 후 Enter, Linux나 Unix 에서는 Ctrl + D를 통해..

Notes for C 2022.08.11

백준 1018번 체스판 다시 칠하기 [C언어]

Sol) #include int main() { int row, col; int min = 64; char input_board[50][51]; //문자열로 입력받을 것이기 때문에 NULL문자 자리까지 51자리. scanf("%d %d", &row, &col); for(int j = 0; j < row; j++) { scanf("%s", input_board[j]); // \n, 즉 개행문자를 처리할 수 있는 가장 간단한 방법은 %s 서식지정자로 입력받는 것이다. } for(int k = 0; k < row - 7; k++) { //검사할 8 * 8 보드판을 세로 방향으로 이동시킬 for 문. 세로 길이가 8이 나와야 하기때문에 row - 8까지만 이동 for(int i = 0; i < col - 7; ..

BOJ 2022.08.10