전체 글 (24) 썸네일형 리스트형 [C언어] 14888번 연산자 끼워넣기 (삼성 SW 역량 테스트 기출 문제) [문제] 정해진 개수의 연산자를 임의의 순서대로 배치하여 앞에서부터 연산을 수행했을 때(피연산자의 순서는 바꾸지 않는다.) 최대인 경우와 최소인 경우를 구하는 문제이다. [해결 방법] 1. 같은 연산자도 여러개 포함할 수 있기 때문에 겹치는 부분을 어떻게 생략할 수 있는지를 생각해야한다. 굳이 생략하지 않고, 모두 다른 연산자들이라고 생각해도 문제를 풀 수는 있지만, 시간이 매우 오래 걸릴것 같아서 같은 경우의 수를 생략하는 방식으로 가야할 것 같다. 다음 그림은 + 두개, - 두개가 있을 때 연산자를 배열하는 모든 경우를 나타낸 것인데, 어떤 연산자가 있을때 그 뒤에 올 수 있는 모든 종류의 연산자를 붙이는 과정을 반복하여 배열하는 것이다. 2. 이제 숫자를 계산하는 함수를 작성해야한다. 예를 들어서 .. 모든 순열 구하기 순열은 주어진 원소들을 "순서를 신경쓰면서" 일렬로 배열하는 것을 의미한다. n가지 원소의 순열 개수는 n*(n-1)*...*2*1 = n 팩토리얼이다. 이 모든 경우의 수를 찾으려면 빠트리는 경우의 수가 없도록 기준을 정해야 할 것이다. 우선 배열의 맨 앞자리를 생각해보자. 배열의 맨 앞자리에는 1~n까지의 모든 수가 올 수 있다. 다음으로 두 번째 자리를 생각해보자. n까지의 수 중 첫 번째 자리에 있는 숫자는 이미 사용했기 때문에 두번째 자리에 올 수는 없다. 따라서 두 번째 자리가 결정되는 경우의 수는 (n-1)이다. 같은 방식으로 3번째 자리~n번째 자리까지 배열을 만들면 된다. 자리가 하나 늘어날수록 사용 가능한 숫자가 1씩 줄어들기 때문에 순열의 모든 경우의 수는 n 팩토리얼이라는 값과 딱 .. [문제해결] (백준) 카카오 코드 페스티벌 2018 : 승부 예측 [프롤로그] 자그마치 약 2주라는 시간을 들여서 풀었던 문제였다. 삽질을 하면서 현타도 여러 번 왔었고, 과연 내가 옳은 길을 가고 있는 것인가?라는 의문도 끊임없이 들었고, "내가 무엇을 놓쳤지?"라는 생각이 이 문제를 해결하기 전까지 내 머릿속을 떠나지 않았다. 해결하지 못했던 문제를 쉽게 잊어버리지 못하는 나의 성격은 포기하자는 생각을 하려던 나를 오히려 문제에 대해 더 고민하도록 만들었고, 결국 나를 문제 해결의 길로 이끌었다. 풀이 후 인터넷에 나와있는 다른 풀이들은 살펴보았는데, 내가 특이하게 풀긴 한것 같다. 고민한 시간만큼 이번 글에서는 풀이과정을 조금 자세하게 나열해 보려고 한다. [해결 과정] 1. 확률 저장하기 입력받은 정보를 어떻게 하면 효과적으로 저장할 수 있을지 생각해보자. 예를.. [C언어] 반올림 시 -0 출력 현상 [문제 상황] 평균을 구한 후 소수점 첫째 자리에서 반올림해서 다음과 같이 출력 코드를 썼을 때 printf("%.f", avg); 평균이 0~-0.5 사이로 나오게 되면 출력이 아래와 같이 나오게 된다. -0 0은 양수도, 음수도 아닌 숫자이지만, 보통 부호를 붙이지 않지, -0이라고 쓰지는 않는다. -0이 나오는 이유는 무엇이며 0에서 부호를 떼려면 어떻게 해야할까? [원인] 소수를 저장하는 float 자료형은 다음과 같이 4바이트만큼의 크기를 가지고 있다. 이때 음수를 저장해야 할 때는 맨 앞 비트를 사용해서 음수임을 저장하는 것이다. %.f를 이용해서 반올림을 할 때 소수점 첫째자리에서 반올림을 해서 출력을 한다면, 정수가 출력되는 것 처럼 보이지만, 실제로는 정수가 저장되어있는 것도 아니고 반올.. [VS] unexpected input value; log 10 failed 오류 [오류 화면] [추정된 오류 원인] float를 출력하는 부분이 오류의 원인이었다. 디버그 모드로 값을 보니 이렇게 잘못된 값이 들어가 있었다. 유효하지 않은 값이 들어가서 출력할 때 오류를 발생시키는것 같았다. [오류 해결법] 1. 해당 float 변수를 초기화 한 후 사용하는지 확인한다. -> 쓰레기값이 들어있는채로 사용하면 저런 오류가 생긴다. 2. float를 리턴하는 함수의 선언이 함수를 사용하는 부분보다 위에 선언되어 있는지 확인한다. -> C언어는 절차지향형 언어이기 때문에 함수 선언 위치가 함수 사용 위치보다 아래에 있으면 선언보다 호출이 먼저 이루어지기 때문에 프로그램이 비정상적으로 동작한다. 필자의 경우에도 float를 리턴하는 함수가 이상한 값을 리턴해서 오류가 발생했던것 [C언어] 카운팅정렬 구현하기 (feat. 백준 10989번) 카운팅정렬이라는 생소한 이름의 정렬 방식을 봐서 무슨 방식인지 알아보았다. 카운팅정렬이란? 다른 원소들끼리 비교를 하지 않고서도 크기대로 정렬할 수 있으며, 숫자의 범위가 작을수록 훨씬 빠르다. 정렬 과정 0. 예시 1. 원소에 있는 숫자들이 총 몇번씩 등장하는지 센다. 2. n번째 칸에 있는 숫자를 n + (n-1 번째 수)로 바꾼다. (피보나치 수열과 약간 비슷) 여기서 숫자의 의미를 잠깐 살펴보고 가야할 필요가 있다. 예를들어 3에는 4이라는 숫자가 기록되어 있는데, 여기에 있는 4는 원래 2에 들어있던 숫자 3과 원래 4에 들어 있던 숫자 1의 합이다. 즉, 3까지의 숫자 합 + 4가 등장한 개수 = 1~4까지의 총 등장 횟수가 4에 저장되는 것이다. 마찬가지로 n번째 칸에는 1~n-1까지의 숫자.. [C언어] 병합정렬 구현하기 (feat. 백준 2751번) 병합정렬을 요약하면? 배열을 원소가 1개가 될 때 까지 계속 쪼갠다음 인접한 두 원소 덩어리씩 합치면서 정렬을 해나거는 정렬 알고리즘이며, 시간 복잡도는 N*log(N)이다. 병합정렬 과정? 1. 원소가 1개가 될 때 까지 계속 2등분 한다. 2. 2덩어리씩 묶어서 정렬한다. 3. 2번 과정을 모든 원소 덩어리들이 모두 합쳐질 때 까지 반복한다. C언어로 표현해보자 1. 원소가 1개가 될 때 까지 계속 2등분 한다. 나중에 분리한 것 끼리 합친다는 의미에서 계속 2등분을 한다는 말을 사용한 것이지 결국 1개 단위로 쪼개지는거랑 마찬가지이기 때문에 배열을 입력받아서 저장하는것이랑 차이가 없다. 물론 길이는 정해져 있지 않기 때문에 맨 처음에 입력받은 길이를 이용해서 동적할당을 해줘야 한다. int* num.. [문제해결] 1436번 : 영화감독 숌 해결과정 [문제 개요] 1436번: 영화감독 숌 (acmicpc.net) 1436번: 영화감독 숌 666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타 www.acmicpc.net [풀이 과정] 666이 들어간 숫자들 중 N번째로 작은 숫자가 무엇인지 찾는 문제이다. 1부터 하나씩 증가시키면서 666이 등장하는지 확인한 후 N번째 숫자에 도달할 때 까지 계속 반복 / 비교하는 작업을 해야할 것으로 보인다. 뼈대를 구성해보면 int num; int count; while(count가 N이 될때까지){ num 1 증가; if(num에 666이 포함되어 있다면){ count 1 .. 이전 1 2 3 다음