1. 출제자가 의도한 풀이는 이분매칭

2. 이 문제를 보고 감이 안와서 질문들을 보고 해결

3. min, max 범위를 계속 구하고

4. 마지막에 min > max + 앱실론 으로 확인

5. 실수 연산에는 앱실론을 앞으로 거의 계속 사용하자.

문제

심술쟁이 해커 임준오(동탄 주민)는 오늘도 점심시간을 기다리고 있다. 준오와 친구들은 매일 복도 어딘가의 한 지점에 모여서 함께 밥을 먹으러 간다. 선린의 복도는 직선형으로 되어있고, 준오와 친구들은 이 복도 어딘가에 위치한 교실에서 종이 치기만을 기다리고 있다.

‘띵~ 디딩~ 띵디딩디딩~’

종이 울렸다! 준오와 친구들은 최대한 빨리 한 지점에서 만나야한다. 그렇지 않으면 홍수처럼 쏟아지는 학생들에 휩쓸려 제각각 급식실로 떠내려갈지도 모른다.

준오를 포함한 친구들의 교실 위치 xi와 각 학생들의 달리기 속도 vi, 그리고 홍수가 밀려오기까지 남은 시간 T가 주어진다. 과연 준오와 친구들은 함께 밥을 먹으러 갈 수 있을까?

교실은 1차원 직선 위 어딘가에 위치해있다. 학생들의 달리기 속도는 항상 일정하며, 모든 학생들이 종이 울림과 동시에 뛰어나온다. 홍수가 터지는 시점과 친구들이 만나는 시점이 일치한다면 홍수에 떠내려가기 전에 만날 수 있는 것으로 간주한다.

입력

첫째 줄에는 준오를 포함한 친구들의 수 N과 홍수까지 남은 시간 T가 주어진다. (1 ≤ N ≤ 50,000, 1 ≤ T(초) ≤ 1,000,000,000) 남은 시간 T는 소숫점 넷째자리의 실수로 주어진다.

둘째 줄에는 N명 학생들의 위치 x1, x2, ..., xn(1 ≤ xi ≤ 1,000,000,000)가 주어진다. (자연수, 미터 단위)

셋째 줄에는 N명 학생들의 속도 v1, v2, ..., vn(1 ≤ vi ≤ 1,000,000,000)가 주어진다. (자연수, 초당 미터)

출력

준오와 친구들이 모두 만날 수 있으면 1을, 그렇지 않으면 0을 출력한다.


1. 최소공배수 = A * B / 최대공약수

2. 오버플로우를 조심해라

문제

두 수 a와 b가 주어졌을 때, a와 b의 최소 공배수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 n이 주어진다. 다음 n개 줄에는 a와 b가 주어진다. a와 b사이에는 공백이 하나 이상 있다. 두 수는 백만보다 작거나 같은 자연수이다.

출력

각 테스트 케이스에 대해서 입력으로 주어진 두 수의 최소공배수를 출력한다.


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의 위치를 공백으로 구분해서 줄 하나에 출력한다. 위치가 낮은 것부터 출력한다.


+ Recent posts