문제 https://www.acmicpc.net/problem/9935 9935번: 문자열 폭발 첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다. 두 문자열은 모 www.acmicpc.net 풀이 처음에는 자바 String의 split() 기능을 이용해서 쉽게 해결하려고 했다. 하지만 이 방법을 사용하면 메모리 초과가 발생해버린다. 그 이유는 자바의 String은 불변(immutable)이라서 값을 바꿀때마다 매번 새로운 String을 할당하기 때문이다. 따라서 이 문제는 스택 혹은 StringBuilder를 이용해서 풀어야한다. 풀이는 간단하다. StringBui..
문제 https://www.acmicpc.net/problem/1082 1082번: 방 번호 스타트링크가 입주한 사무실은 방 번호를 직접 정할 수 있다. 방 번호를 정하려면 1층 문방구에서 파는 숫자를 구매해야 한다. 숫자를 구매하기 위해 준비한 금액은 M원이고, M원을 모두 사용해 www.acmicpc.net 풀이 숫자를 사서 가장 큰 숫자를 만드려면 어떻게 해야 할까? 아래와 같은 우선순위를 고려해야 할 것이다. 1. 자릿수를 가장 길게 만든다. 2. 맨 앞자리부터 가장 큰 수가 들어가야 한다. 따라서 우선 가장 저렴한 숫자를 최대한 많이 사서 자릿수를 최대한 길게 만든다. 이때 가장 저렴한 숫자가 0이라면, 두 번째로 저렴한 숫자를 맨 앞에 두고 이후 0을 최대한 많이 사서 붙인다. 자릿수를 가장 ..
문제 https://www.acmicpc.net/problem/12865 12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000) www.acmicpc.net 풀이 이 문제는 배낭 문제(Knapsack)로 유명한 문제이다. 처음 이 문제를 봤을 땐 그리디 알고리즘을 떠올렸다. 하지만 그리디 알고리즘으로는 이 문제를 해결할 수 없다. 배낭 문제는 짐을 쪼갤 수 있는 경우는 Fraction Knapsack Problem이라고 하고 그리디 알고리즘으로 해결할 수 있다. 짐을 쪼갤 수 없는..
문제 16953번: A → B 첫째 줄에 A, B (1 ≤ A A*2 2. 1을 수의 가장 오른쪽에 추가한다 -> A*10 +1 위의 두 연산을 DFS 형태로 재귀적으로 부르면 브루트포스 방식으로 해결 가능하다. 간단하게 풀렸을것 같지만, 처음 시도했을때 틀렸습니다를 받았다. 뭐가 문제일까 고민하다가, 변수의 타입을 int로 한게 문제였음을 깨달았다. dfs() 함수에서 if(num > B) return; 이라는 코드가 있는데, 만약 num*2를 계속해서 하다가 int의 범위를 벗어나면 이 부분이 문제가 발생할 수 있다. 따라서 int를 long 타입으로 바..
객체 지향 프로그래밍(OOP)과 객체(Object) 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임 중 하나이다 객체 지향 프로그래밍에서 객체(Object)란 실제 사물을 프로그래밍으로 옮겨와 모델링하는 것으로 자신의 속성(PROPERTY)과 행위(Method)를 가지고 있다. 객체의 속성은 객체의 상태, 성질, 데이터 등을 의미하고, 행위란 객체의 기능이나 데이터를 조작하는 연산 등을 의미한다. 객체의 데이터를 사용하기 위해서는 메시지 전송(message Sending)을 통해 간접적으로 데이터를 얻어와야 한다. 객체지향 프로그래밍은 아래와 같이 크게 4가지의 특징을 가지고 있..
문제 2933번: 미네랄 창영과 상근은 한 동굴을 놓고 소유권을 주장하고 있다. 두 사람은 막대기를 서로에게 던지는 방법을 이용해 누구의 소유인지를 결정하기로 했다. 싸움은 동굴에서 벌어진다. 동굴에는 미네랄 www.acmicpc.net 풀이 이 문제의 풀이를 요약하자면 아래와 같다. 1. 왼쪽, 오른쪽 번갈아서 미네랄 파괴 2. 미네랄 파괴 후 공중에 떠있는 클러스터 BFS로 찾기 3. 공중에 떠있는 클러스터들을 아래로 내리기 먼저, 1번을 구현하는 것은 쉽다. 단순히 홀수, 짝수를 나누어 왼쪽에서부터 탐색, 오른쪽에서부터 탐색해서 'x'를 '.'으로 바꿔주기만 하면 된다. 2번을 구현하는 것은 조금 까다롭다. 우선 '공중에 떠있다'라는 것은 클러스터가 땅에 붙어있지 않다는 것을 의미한다. 이것은 BF..
문제 1051번: 숫자 정사각형 N×M크기의 직사각형이 있다. 각 칸에는 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행 www.acmicpc.net 풀이 1. N, M이 50 이하로 작다. 2. 꼭짓점을 살펴보기 위해서는 기준점에서 3군데만 찾아보면 된다. 3. N과 M중 더 작은 수가 정사각형의 최대길이다. 4. 따라서 최대 50(N)*50(M)*3(꼭짓점 3개 비교)*50(정사각형의 최대 길이) 번의 연산이 필요하므로 브루트포스 방식이 가능하다! 풀이법은 간단하다. 정사각형의 최대 길이는 N과 M 중 더 작은 것일 것이다. 이것을 len이라고 하자. 매번 모든 원소를 조사할 필요 없이 세로는 N-l..
파라미터 전달 방식 프로그래밍을 공부한 사람은 다들 Call by value 혹은 Call by reference 등에 대해 들어본 적이 있을 것이다. 이는 함수 호출 방식을 값에 의한 호출, 참조에 의한 호출로 구분한 것이다. 함수 호출 방식에 따라 파라미터 전달 방식이 달라지는데, 이에 대해 알아보자. Pass by value (= Call by value) 1. Pass by value는 함수의 파라미터로 변수의 값을 복사해서 전달하는 방식이다. 2. 즉, 원래의 값에 영향을 주지 않고 함수 내로 복사된 값을 전달한다. 3. 값을 복사하기 때문에 변수의 크기가 클수록 비용이 증가하게 된다. 4. 따라서 크기가 큰 변수를 파라미터로 전달할 때 적절한 방법이 아니다. 5. 원래의 값이 변경되면 안 되는..
단축 평가 계산 (Short-circuit Evaluation) 단축 평가 계산이란 첫 번째 인수가 값을 결정하기에 충분하지 않은 경우에만 두 번째 인수가 평가되는 일부 프로그래밍 언어(C, C++, JAVA 등)의 일부 논리 연산(AND, OR)의 계산이다. 예를 들어 C언어의 경우를 들어보자. int i=1; int j=2; if( ij가 거짓이므로 논리 연산 AND(&&)의 결과 값이 무조건 거짓이 되기 때문에 뒤의 연산을 진행하지 않는다. 따라서 i=3은 실행되지 않는다. 단축 평가 계산을 염두에 두고 프로그래밍한다면 시간 복잡도를 줄일 수 있다. 예를 들어 아래와 같은 경우를 살펴보자. // func1() - 1초 소요 // func2() - 100초 소요 /* 첫번째 방법 */ if( func..
댕글링 포인터(Dangling Pointer)란? 댕글링 포인터는 적절한 타입의 유효한 객체를 가리키고 있지 않은 포인터를 말한다. 예를 들어 이미 할당 해제된 메모리를 포인터가 계속 가리키고 있다면 해당 포인터는 댕글링 포인터이다. 예를 들어 메모리에 할당된 하나의 객체를 가리키는 두 개의 포인터 ptr1, ptr2가 있다고 하자. 이때 ptr1만을 free 하여 메모리를 해제해주면 ptr2는 Dangling Pointer가 돼버린다. 댕글링 포인터 해결법 1. Tombstone Approach 첫번째 방법은 tombstone(비석)이라고 불리는 특별한 cell을 설정해 포인터가 할당된 객체를 직접 가리키지 않고 비석을 통해 가리키도록 하는 방법이다. 예를 들어 [그림 3]처럼 ptr1을 free 한다..