프로그래밍 공부를 하다보면 얕은 복사와 깊은 복사가 나옵니다. 얕은 복사는 값만 복사하고 주소값은 복사하지 않고 값만 복사입니다. 그리고 깊은 복사는 주소값과 값 둘다 복사하는 방법입니다. 그런데 이건 알겠는데 막상 이것을 설명하려고 하면 무엇이 다른지 햇갈릴때가 많았습니다. 얕은 복사, 깊은 복사 이 두개가 있는 건 알겠는데... 뭐가 다른건지... 코드를 봐도 뭐가 다른건지... 제가 자바를 처음 공부했을때 이랬습니다. 사실 지금부터 설명하는 방법이 프로그래밍적으로 봤을때는 맞지 않을 수 있습니다. 하지만 적어도 이해가 될겁니다. 나중에 프로그래밍에는 뭐가 더 추가 되는지도 설명할 예정입니다. 검정 검정 위 두개의 글자를 읽어 보세요. 두개다 검정이라는 글자를 가지고 있습니다. 이제 두개의 단어는 각..
문제 DNA란 어떤 유전물질을 구성하는 분자이다. 이 DNA는 서로 다른 4가지의 뉴클레오티드로 이루어져 있다(Adenine, Thymine, Guanine, Cytosine). 우리는 어떤 DNA의 물질을 표현할 때, 이 DNA를 이루는 뉴클레오티드의 첫글자를 따서 표현한다. 만약에 Thymine-Adenine-Adenine-Cytosine-Thymine-Guanine-Cytosine-Cytosine-Guanine-Adenine-Thymine로 이루어진 DNA가 있다고 하면, “TAACTGCCGAT”로 표현할 수 있다. 그리고 Hamming Distance란 길이가 같은 두 DNA가 있을 때, 각 위치의 뉴클오티드 문자가 다른 것의 개수이다. 만약에 “AGCAT"와 ”GGAAT"는 첫 번째 글자와 세 ..
탬플릿? 뭔가 느낌이 일정한 모형 틀을 만들어 놓고, 그 틀을 계속 사용하는 느낌이다. 구글에서 템플릿 관련 이미지를 찾았다. 죄다 ppt관련 이미지 밖에 없었다. 왜 ppt를 만들때 템플릿을 사용할까? 가장 뻔한 이유로는 편하기 때문이다. 어차피 제목 이나 내용빼고는 이미 구현되었기 때문에 우리는 제목과 내용만 추가하면 된다. 물론 내가 발표할 주제와 ppt의 상관관계는 지켜야 하겠지만... 근데... 디자인 패턴에서는 템플릿을 어떻게 사용할까? 사실 이름에는 메소드라는 단어가 숨겨져 있다. 메소드가 있는 이유는 이 패턴은 메소드의 역할이 크기 때문이다. 예를들어 A라는 클래스와 B라는 클래스를 만든다고 가정하자. 근데 A와 B클래스는 공통적으로 사용되는 메소드가 있다. 이 메소드를 한곳에 넣어주면 된..
문제 독일 로또는 {1, 2, ..., 49}에서 수 6개를 고른다. 로또 번호를 선택하는데 사용되는 가장 유명한 전략은 49가지 수 중 k(k>6)개의 수를 골라 집합 S를 만든 다음 그 수만 가지고 번호를 선택하는 것이다. 예를 들어, k=8, S={1,2,3,5,8,13,21,34}인 경우 이 집합 S에서 수를 고를 수 있는 경우의 수는 총 28가지이다. ([1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2,3,5,13,21], ..., [3,5,8,13,21,34]) 집합 S와 k가 주어졌을 때, 수를 고르는 모든 방법을 구하는 프로그램을 작성하시오. 입력 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 ..
문제 n가지 종류의 동전이 있다. 각각의 동전이 나타내는 가치는 다르다. 이 동전을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그 경우의 수를 구하시오. 각각의 동전은 몇 개라도 사용할 수 있다. 사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다. 입력 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 출력 첫째 줄에 경우의 수를 출력한다. 경우의 수는 231보다 작다. 이 문제... 힘들었다. 이해하는 시간이 더 오래 걸렸던것 같다. 1 2 3 4 5 6 7 8 9 10 1 1 1 1 1 1 1 1 1 1 1 2 0 1 0 1 0..
문제 민식이는 다음과 같은 폴리오미노 2개를 무한개만큼 가지고 있다. AAAA와 BB 이제 '.'와 'X'로 이루어진 보드판이 주어졌을 때, 민식이는 겹침없이 'X'를 모두 폴리오미노로 덮으려고 한다. 이때, '.'는 폴리오미노로 덮으면 안 된다. 폴리오미노로 모두 덮은 보드판을 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 보드판이 주어진다. 보드판의 크기는 최대 500이다. 출력 첫째 줄에 사전순으로 가장 앞서는 답을 출력한다. 만약 덮을 수 없으면 -1을 출력한다. 이 문제는 이중 반복문을 사용해야 쉽게 풀수 있었다. 애초에 덮는다는 건 한번더 시도 하는건데... 오늘 푼 문제들을 해답을 보고 내 나름대로 정립 시킬려고 했는데.. 안된다..ㅜㅜ 이 문제를 풀때 단계를 생각하면서 문제에 접근하였다...
문제 다솜이는 사람의 마음을 읽을 수 있는 기계를 가지고 있다. 다솜이는 이 기계를 이용해서 2008년 4월 9일 국회의원 선거를 조작하려고 한다. 다솜이의 기계는 각 사람들이 누구를 찍을 지 미리 읽을 수 있다. 어떤 사람이 누구를 찍을 지 정했으면, 반드시 선거때 그 사람을 찍는다. 현재 형택구에 나온 국회의원 후보는 N명이다. 다솜이는 이 기계를 이용해서 그 마을의 주민 M명의 마음을 모두 읽었다. 다솜이는 기호 1번이다. 다솜이는 사람들의 마음을 읽어서 자신을 찍지 않으려는 사람을 돈으로 매수해서 국회의원에 당선이 되게 하려고 한다. 다른 모든 사람의 득표수 보다 많은 득표수를 가질 때, 그 사람이 국회의원에 당선된다. 예를 들어서, 마음을 읽은 결과 기호 1번이 5표, 기호 2번이 7표, 기호 ..
문제 총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴가 1번, 그 오른쪽은 2번, 그 오른쪽은 3번, 가장 오른쪽 톱니바퀴는 4번이다. 이때, 톱니바퀴를 총 K번 회전시키려고 한다. 톱니바퀴의 회전은 한 칸을 기준으로 한다. 회전은 시계 방향과 반시계 방향이 있고, 아래 그림과 같이 회전한다. 톱니바퀴를 회전시키려면, 회전시킬 톱니바퀴와 회전시킬 방향을 결정해야 한다. 톱니바퀴가 회전할 때, 서로 맞닿은 극에 따라서 옆에 있는 톱니바퀴를 회전시킬 수도 있고, 회전시키지 않을 수도 있다. 톱니바퀴 A를 회전할 때, 그 옆에 있는 톱니바퀴 B와 서로 맞닿은 톱니..
문제 1부터 n까지 차례대로 써 내려갈 때 특정 숫자(digit)의 빈도수를 구하여 출력하는 프로그램을 작성하시오. 예를 들어, n = 11 이고 숫자 1의 빈도수를 구하라고 하면, 1 2 3 4 5 6 7 8 9 10 11 에서 숫자 1은 1에서 한 번, 10에서 한 번, 11에서 두 번 나타나므로 1의 빈도수는 총 4 이다. 입력 자연수 n (1 ≤ n ≤ 100,000)과 한 자리 숫자 d(0~9)가 첫째 줄에 주어진다. 출력 첫째 줄에 빈도수를 출력한다. 이 문제는 0부터 9까지 배열에 저장 시킨 다음, 값을 증가시키는 형태다. #include using namespace std; int digit[10]; int main(void) { int n , f; cin >> n >> f; for(int..
문제 숭고한 알고리즘 캠프가 다가오고 있고 방학이 되어서까지도 각 대학들의 협업은 계속되고 있다. 그럼에도 불구하고 운영진들과 강사진들이 각자의 일정 때문에 바빠 계획에 차질이 조금씩 생기고 있다. 숭고한 알고리즘 캠프의 대표인 창호는 효율적인 일처리를 위해 엄정한 평가를 내리기로 하였다. 창호는 숭고한 알고리즘 캠프의 구성원인 숭실대학교(Soongsil University), 고려대학교(Korea University), 한양대학교(Hanyang University)의 참여도를 수치화하였다. 창호가 보기에 세 대학교의 참여도의 합이 100 이상이면 일처리가 잘 되고 있기에 안심할 수 있지만, 100 미만이면 창호는 참여도가 가장 낮은 대학의 동아리에게 무언의 압박을 넣을 예정이다. 숭고한 알고리즘 캠프의..
문제 문장이 주어졌을 때, 단어를 모두 뒤집어서 출력하는 프로그램을 작성하시오. 단, 단어의 순서는 바꿀 수 없다. 단어는 영어 알파벳으로만 이루어져 있다. 입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는 공백이 하나 있다. 출력 각 테스트 케이스에 대해서, 입력으로 주어진 문장의 단어를 모두 뒤집어 출력한다. 원래 C++로 문제를 풀지만 나는 C++로 단어를 split을 사용할줄 모른다. 내가 알기로는 C++에도 있는걸로 알고는 있는데 이름이 다른걸로 알고 있다. 그래서 사용하지 못하고 있어서 그냥 자바로 풀었다. import java.io.Buf..
오랜만에 작성하는 것 같다. 프록시 이후로 9일만에 작성하는데.... 아무튼 빌더 패턴은 객체의 생성을 맡는다. 객체의 생성하면 가장 먼저 떠오르는 패턴은 팩토리 패턴이지만... 팩토리 패턴과는 또 다른 매력으로 다가온다. 사실 빌더 패턴이 만들어진 이유는 정확히 뭔지는 모르지만 하나 확실한것은 간결함과 뚜렷함을 얻을 수 있다. 물론 간결함 같은 경우는 클래스가 굉장히 가벼우면 더 간결하다고 느낄 수 있지만 만 말이다. 아무튼 계속 설명하면.. 첫 번째 이유는 public class Test { private String name; private int age; private String content; private String subject; public Test(String name, int age..