1. LIS 문제

2. 순서대로 주어지기 때문에 정렬할 필요가 없다.

3. LIS 인 이유: i - x 선이 i 보다 낮은걸 연결하면 겹친다.

4. LIS 가 왜 DP 인 이유는 아직 잘 모르겠다

문제

반도체를 설계할 때 n개의 포트를 다른 n개의 포트와 연결해야 할 때가 있다.

예를 들어 왼쪽 그림이 n개의 포트와 다른 n개의 포트를 어떻게 연결해야 하는지를 나타낸다. 하지만 이와 같이 연결을 할 경우에는 연결선이 서로 꼬이기 때문에 이와 같이 연결할 수 없다. n개의 포트가 다른 n개의 포트와 어떻게 연결되어야 하는지가 주어졌을 때, 연결선이 서로 꼬이지(겹치지, 교차하지) 않도록 하면서 최대 몇 개까지 연결할 수 있는지를 알아내는 프로그램을 작성하시오

입력

첫째 줄에 정수 n(1 ≤ n ≤ 40,000)이 주어진다. 다음 줄에는 차례로 1번 포트와 연결되어야 하는 포트 번호, 2번 포트와 연결되어야 하는 포트 번호, …, n번 포트와 연결되어야 하는 포트 번호가 주어진다. 이 수들은 1 이상 n 이하이며 서로 같은 수는 없다고 가정하자.

출력

첫째 줄에 최대 연결 개수를 출력한다.


1. 데이터 타입 때문에 틀렸다.

2. for 문 밖에서 데이터가 나올걸 예측하지 못해 틀렸다.

3. 쉬운 문제라고, 기본을 무시했다.

문제

단어에 숫자가 숨어있다. 이 숫자를 히든 넘버라고 한다. 알파벳 대/소문자와 숫자로 이루어진 단어가 주어졌을 때, 모든 히든 넘버의 합을 구하는 프로그램을 작성하시오.

단어와 히든 넘버는 아래와 같은 성질을 갖는다.

  • 연속된 숫자는 한 히든 넘버이다.
  • 두 히든 넘버 사이에는 글자가 적어도 한 개 있다.
  • 히든 넘버는 6자리를 넘지 않는다.

입력

첫째 줄에 단어의 길이 n (1 ≤ n ≤ 5,000,000)이 주어진다. 둘째 줄에는 단어가 주어진다. 단어는 알파벳 대/소문자와 숫자(0-9)로 이루어져 있다. 

출력

입력으로 주어진 단어에 숨어있는 모든 히든 넘버의 합을 출력한다. 만약, 히든 넘버가 없는 경우에는 0을 출력한다.


1. 1 ~ (1 << N) - 1 까지 구해서 했었는데, String 으로 변환하는 과정에서 에러가 났다.

2. 저 방법으로는 풀 수 없는 문제 같아서 규칙을 찾아보니

3. 1 1

4. 2 110

5. 3 11100

6. 4 1111000

7. 0 의 개수가 N - 1인 이유는 N 자리의 전에는 1이 겹치기 때문에 + 돼서 올림됨.

8. 3 일 경우로 보면 001 010 011 100 101 110 111 겹치는걸 볼 수 있다.

문제

세계적인 이진수 매니아 현수는 오늘도 이진수를 연구하고 있다.

오늘은 이진수로 나타냈을 때, k자리 이하인 모든 자연수의 합을 구해보려고 한다.

k가 주어졌을 때, 이진수로 나타냈을 때, k자리 이하인 모든 자연수의 합을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 k가 주어진다. (1 ≤ k ≤ 106)

출력

첫째 줄에 이진수로 나타냈을 때, k자리 이하인 모든 자연수의 합을 이진수로 출력한다.


1. O(1) 로도 구현이 가능해보인다.

2. 귀찮다.

문제

"럭키스톤"은 카드를 통해 대결하는 게임이다. 창식이는 럭키스톤을 자주 한다.

이 게임의 카드에는 공격력과 생명력이 표시되어있다. 왼쪽에는 공격력이, 오른쪽에는 생명력이 숫자로 적혀있다.

서로 꺼낸 카드를 비교하여 남길 카드를 결정하는 데, 카드의 비교는 다음과 같이 이루어진다.

  • 비교하는 카드의 공격력만큼 동시에 서로 상대 카드의 생명력을 깎는다. 줄어든 생명력은 다시 회복되지 않는다.
  • 생명력이 0 이하인 경우에는 카드는 죽은 상태로 전환된다.
  • 카드가 두 장 모두 남아있다면 비교를 계속한다.

요즘 따라 게임이 안 풀리는 창식이는 대전 전에 가능한 수를 미리 계산하여 최대한 이득을 챙기고 싶어 한다.

카드 2개의 공격력과 생명력이 주어지면 어떤 플레이어의 카드가 남아있을지 출력하는 프로그램을 작성해주자.

입력

첫째 줄에 플레이어 A가 꺼낸 카드의 공격력과 생명력이 주어진다.

둘째 줄에 플레이어 B가 꺼낸 카드의 공격력과 생명력이 주어진다.

카드의 공격력과 생명력은 100,000 이하의 자연수이다.

출력

플레이어 A의 카드가 남아있다면 "PLAYER A"를, 플레이어 B의 카드가 남아있다면 "PLAYER B"를 출력한다.

모두 죽은 상태라면 "DRAW"를 따옴표 없이 출력한다.


1. 시간 1초

2. 만약 반복문을 1억번 돌리면 아슬아슬할 수 있다.

3. 각 숫자를 문자열로 변경해도 시간초과가 나지 않을까 하면서 구현하고 제출하니까 성공

4. i 는 이어붙일 숫자 N 은 몇 번째 숫자를 구할지 입력받고, i 를 문자열로 변환한거의 길이만큼 계속 빼준다.

문제

수면 장애를 가진 강민이는 잠이 오지 않아 적잖은 고통을 느끼고 있다. 강민이는 잠이 오지 않을 때마다 속으로 양을 세고 있었는데, 오늘따라 백만 마리까지 세었는데도 잠이 오지 않았다.

한계를 느낀 강민이는 새로운 방법으로 수를 세기로 했다.

1부터 숫자를 쭉 이어 붙이면 다음과 같은 숫자열이 생성된다.

12345678910111213...

강민이는 이 숫자열을 한 숫자씩 떼어서 읽기 시작했다. 수면에 성공한 강민이는 다음날 일어나자마자 "N번째 숫자까지 읽었어!" 라고 기분 좋게 외쳤다.

과연 N번째 숫자는 무엇일까?

입력

첫째 줄에 N번째 숫자를 나타내는 N이 주어진다. (1N100,000,000)

출력

첫째 줄에 N번째 숫자에 해당하는 0~9 중 한 숫자를 출력하시오.


1. a, b, c 가 0 인 경우는 비트 연산자로 확인

2. 출력은 AP 또는 GP 가 항상 맞기 때문에, 공차만 확인한다.

3. 등차수열이 아닌경우는 등비수열로 확정

문제

등차수열(AP)은 인접한 두 수의 차이(공차)가 일정한 수열이다. 예를 들어, 3, 5, 7, 9, 11, 13, ...은 차이가 2로 일정한 등차수열이다. 이 문제에서 등차수열의 공차는 항상 0이 아닌 정수이다.

등비수열(GP)는 각 항이 그 앞과 일정한 비(공비)를 가지는 수열이다. 예를 들어, 2, 6, 18, 54, ...은 공비가 3인 등비수열이다. 이 문제에서 등비수열의 공비는 항상 0이 아닌 정수이다.

어떤 수열의 연속한 세개의 숫자가 주어졌을 때, 이 수열이 등차수열인지 등비수열인지를 알아낸 뒤, 다음 항을 구하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 수열의 연속하는 세 수 a1, a2, a3이 한 줄에 주어진다. (-10,000 < a1, a2, a3 < 10,000) a1, a2, a3은 서로 같지 않다.

입력의 마지막 줄에는 0이 세 개 주어진다.

출력

각 테스트 케이스에 대해서, 등차수열이면 AP를, 등비수열이면 GP를 출력한 뒤, 다음 항을 출력한다. 모든 입력은 항상 등차수열이나 등비수열이다.


1. 쉬운 문제

문제

아래 예제 출력과 같은 J박스를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 박스의 크기가 주어진다. 박스의 크기는 10보다 작거나 같다.

출력

각 테스트 케이스에 대해서, 입력으로 주어지는 크기의 J박스를 출력한다. 박스와 박스 사이에는 빈 줄을 하나 출력한다.


1. 1 << 0 ~ j 까지 해보면 된다. 

2. 비트연산자를 사용한다.

3. 비트 시프트 연산을 제외한 비트 연산자는 관계 연산자 (< = >) 보다 우선순위가 낮다.

4. << >> 가 <= >= < > 보다 높고 <= >= < > 보다 & ^ | 가 낮다.

5. 헷갈리지 않게 괄호를 필수로 계속 사용하면 될거같다.

문제

양의 정수 n이 주어졌을 때, 이를 이진수로 나타냈을 때 1의 위치를 모두 찾는 프로그램을 작성하시오. 최하위 비트(least significant bit, lsb)의 위치는 0이다.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, n이 주어진다. (1 ≤ T ≤ 10, 1 ≤ n ≤ 106)

출력

각 테스트 케이스에 대해서, 1의 위치를 공백으로 구분해서 줄 하나에 출력한다. 위치가 낮은 것부터 출력한다.


1. L * P = N

2. 답: x[i] - N

문제

파티가 끝나고 나면, 사람들은 누가 파티에 왔는지와 얼마나 많은 사람들이 왔는지를 궁금해한다. 보통 파티는 매우 크게 열리기 때문에, 정확하게 몇 명이 참가했는지 알 수가 없다.

지난주 토요일에 상근이는 자신의 3학년 진학을 기념하면서 매우 성대한 파티를 열었다. 그리고, 상근이는 1m2당 몇 명의 사람이 있었는지 알고있다.

상근이의 파티는 정말 엄청난 규모였기 때문에, 대부분의 신문에도 기사가 실렸다. 상근이는 서로 다른 5개의 신문을 보면서 그 기사에 적혀져있는 참가자의 수를 적었다.

상근이는 자신이 알고있는 참가자의 수가 정확하다고 생각한다. 각 신문 기사에 실려있는 참가자의 수가 몇 명 만큼 잘못되어있는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 1m2당 사람의 수 L (1 ≤ L ≤ 10)과 파티가 열렸던 곳의 넓이 P (1 ≤ P ≤ 1000)가 주어진다.

둘째 줄에는 각 기사에 실려있는 참가자의 수가 주어진다. 106보다 작은 양의 정수 5개가 주어진다.

출력

출력은 첫째 줄에 다섯 개의 숫자를 출력해야 한다. 이 숫자는 상근이가 계산한 참가자의 수와  각 기사에 적혀있는 참가자의 수의 차이이다.


1. 재귀 호출로 모든 경우를 확인한다.

2. 뽑는 경우

3. 안뽑고 다음거로 넘어가는경우

4. 2 끝나면 3

문제

독일 로또는 {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가 주어졌을 때, 숫자를 고르는 모든 방법을 구하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 숫자는 k (6 < k < 13)이고, 다음 k개 숫자는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로 주어진다.

입력의 마지막 줄에는 0이 하나 주어진다. 

출력

각 테스트 케이스 마다 숫자를 고르는 모든 방법을 출력한다. 이 때, 사전 순으로 출력한다.

각 테스트 케이스 사이에는 빈 줄을 하나 출력한다.


+ Recent posts