1. 처음에는 DP 인듯 DP 아닌 반복문으로 풀었었다. (실수로 -1 안해서 계속 오답..)

2. 생각해보니까 b a 중간 c b 중간으로만 이동이 가능한거다.

3. 그래서 생각해보니 큰 수 - 작은 수 1 씩 밀려서 답이 나온다. 결과적으로. (-1 해줘야됨)

4. 틀에박힌 생각으로 DP 로 풀려했었다.

5. 앞으로는 좀 열린 생각을 하도록 노력해봐야지

문제

캥거루 세 마리가 사막에서 놀고 있다. 사막에는 수직선이 하나 있고, 캥거루는 서로 다른 한 좌표 위에 있다.

한 번 움직일 때, 바깥쪽의 두 캥거루 중 한 마리가 다른 두 캥거루 사이의 정수 좌표로 점프한다. 한 좌표 위에 있는 캥거루가 두 마리 이상일 수는 없다.

캥거루는 최대 몇 번 움직일 수 있을까?

입력

첫째 줄에 세 캥거루의 초기 위치 A, B, C가 주어진다. (0 < A < B < C < 100)

출력

캥거루가 최대 몇 번 움직일 수 있는지 출력한다.


1. 그냥 대놓고 피보나치같은 수열이다.

2. long 주의 (오버플로우)

문제

오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의 길이를 k라 했을 때, 그 변에 길이가 k인 정삼각형을 추가한다.

파도반 수열 P(N)은 나선에 있는 정삼각형의 변의 길이이다. P(1)부터 P(10)까지 첫 10개 숫자는 1, 1, 1, 2, 2, 3, 4, 5, 7, 9이다.

N이 주어졌을 때, P(N)을 구하는 프로그램을 작성하시오.

입력

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

출력

각 테스트 케이스 마다 P(N)을 출력한다.


1. 현재의 숫자보다 낮은곳으로 이동 가능 ( 상하좌우 )

2. DP 다 보니까 거꾸로 계산 ( 피보나치를 생각하면 마지막에 1 을 해준다. )

3. 도착지점에 1 세팅

4. -1 로 초기화 하는 이유는 0 이 있으니까 ( 못갈수도있음 )

5. memoization 해주면 성공

6. 안하면 TLE

문제

여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으며, 각 지점 사이의 이동은 지도에서 상하좌우 이웃한 곳끼리만 가능하다.

현재 제일 왼쪽 위 칸이 나타내는 지점에 있는 세준이는 제일 오른쪽 아래 칸이 나타내는 지점으로 가려고 한다. 그런데 가능한 힘을 적게 들이고 싶어 항상 높이가 더 낮은 지점으로만 이동하여 목표 지점까지 가고자 한다. 위와 같은 지도에서는 다음과 같은 세 가지 경로가 가능하다.

지도가 주어질 때 이와 같이 제일 왼쪽 위 지점에서 출발하여 제일 오른쪽 아래 지점까지 항상 내리막길로만 이동하는 경로의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에는 지도의 세로의 크기 M과 가로의 크기 N이 빈칸을 사이에 두고 주어진다. 이어 다음 M개 줄에 걸쳐 한 줄에 N개씩 위에서부터 차례로 각 지점의 높이가 빈 칸을 사이에 두고 주어진다. M과 N은 각각 500이하의 자연수이고, 각 지점의 높이는 10000이하의 자연수이다.

출력

첫째 줄에 이동 가능한 경로의 수 H를 출력한다. 모든 입력에 대하여 H는 10억 이하의 음이 아닌 정수이다.


1. testcase 만큼 돌림

2. hashmap 사용해서 부위별로 정리

3. result *= v + 1 인 이유는

4. 3 집합에 3 개의 원소들이 있다고 해보자.

5. 3, 3, 3 가능하고 (A, B, C)

6. 3 * 3, 3 * 3  (A * B) (A * C)

7. 3 * 3 * 3 ( A * B * C )

8. 3 * 3 (B * C)

9 정리해서 보면 (A)(A*B)(A*B*C)(A*C)(B)(B*C)(C)

10. A 는 첨에 A 만 추가되고,

11. B 가 추가되는 시점을 보면 A * B 하고, A 가 들어가는 느낌

12. 반복

13. 정리해보면 처음에 A

14. 들어가있는 A 가 A * B 로 변경되면서 기존의 A 를 만들어주기 위함으로 + 1

15. 마지막 출력 - 1 를 해주는 이유는 공집합을 제외하기 위해서

문제

해빈이는 패션에 매우 민감해서 한번 입었던 옷들의 조합을 절대 다시 입지 않는다. 예를 들어 오늘 해빈이가 안경, 코트, 상의, 신발을 입었다면, 다음날은 바지를 추가로 입거나 안경대신 렌즈를 착용하거나 해야한다. 해빈이가 가진 의상들이 주어졌을때 과연 해빈이는 알몸이 아닌 상태로 몇 일동안 밖에 돌아다닐 수 있을까?

입력

첫째 줄에 테스트 케이스가 주어진다. 테스트 케이스는 최대 100이다.

  • 각 테스트 케이스의 첫째 줄에는 해빈이가 가진 의상의 수 n(0 ≤ n ≤ 30)이 주어진다.
  • 다음 n개에는 해빈이가 가진 의상의 이름과 의상의 종류가 공백으로 구분되어 주어진다. 같은 종류의 의상은 하나만 입을 수 있다.

모든 문자열은 1이상 20이하의 알파벳 소문자로 이루어져있으며 같은 이름을 가진 의상은 존재하지 않는다.

출력

각 테스트 케이스에 대해 해빈이가 알몸이 아닌 상태로 의상을 입을 수 있는 경우를 출력하시오.


1. DP 는 당연히 안됨 (2^31 2^31) 나오면 망함

2. 이전에 사용했던 bottom-up 방식을 사용

3. 시간초과가 나네?

4. 약분을 할 수 있으면 약분을 하고 하는방식을 사용

5. N-K 를 하는데 K 가 1이면 시간초과가 나네?

6. 조건문을 넣어보자!

7. BufferedWriter 를 쓰니까 틀리네?

8. 버그!

문제

n개의 원소 중에서 k개를 순서 없이 선택하는 방법의 수는 몇 가지 일까?

입력

입력은 하나 또는 그 이상의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 두 자연수 n(n ≥ 1)과 k(0 ≤ k ≤n)로 이루어져 있다.

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

출력

각 테스트 케이스에 대해서, 정답을 출력한다. 항상 정답이 231보다 작은 경우만 입력으로 주어진다.


1. 이전에 사용했던 dp 로 이항계수 구함

2. 어라? 숫자가 높네

3. BigInteger 사용

문제

nCm을 출력한다.

입력

n과 m이 주어진다. (5 ≤ n ≤ 100, 5 ≤ m ≤ 100, m ≤ n)

출력

nCm을 출력한다.


1. 규칙을 찾아보자

2. 맨 뒷자리의 숫자는 짝수만 나온다.

3. 5를 곱하기 전에는 4를 곱한다.

4. 짝수 * 4 > 2

5. 5 의 배수마다 자릿수가 늘어난다

6. 5의 거듭제곱도

문제

N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (0 ≤ N ≤ 500)

출력

첫째 줄에 구한 0의 개수를 출력한다.



문제

로마 시대 때는 현재 사용하는 아라비아 숫자가 아닌 다른 방법으로 수를 표현하였다.

로마 숫자는 다음과 같은 7개의 기호로 이루어진다.

기호IVXLCDM
1510501005001000

수를 만드는 규칙은 다음과 같다.

  1. 보통 큰 숫자를 왼쪽에 작은 숫자를 오른쪽에 쓴다. 그리고 그 값은 모든 숫자의 값을 더한 값이 된다. 예를 들어 LX = 50 + 10 = 60 이 되고, MLI = 1000 + 50 + 1 = 1051 이 된다.
  2. V, L, D는 한 번만 사용할 수 있고 I, X, C, M은 연속해서 세 번까지만 사용할 수 있다. 예를 들어 VV나 LXIIII 와 같은 수는 없다. 그리고 같은 숫자가 반복되면 그 값은 모든 숫자의 값을 더한 값이 된다. 예를 들어 XXX = 10 + 10 + 10 = 30 이 되고, CCLIII = 100 + 100 + 50 + 1 + 1 + 1 = 253 이 된다.
  3. 작은 숫자가 큰 숫자의 왼쪽에 오는 경우는 다음과 같다. IV = 4, IX = 9, XL = 40, XC = 90, CD = 400, CM = 900 을 나타낸다. 이들 각각은 한 번씩만 사용할 수 있다. 그런데 IV 와 IX 는 같이 쓸 수 없으며 XL 과 XC, CD 와 CM 또한 같이 쓸 수 없다. 이들 외에는 작은 숫자가 큰 숫자 왼쪽 어디에도 나올 수 없다. 예를 들어 XCXC 나 CMCD, VX 나 IIX 와 같은 수는 없다. 참고로 LIX = 50 + 9 = 59, CXC = 100 + 90 = 190 이 된다.
  4. 모든 수는 가능한 가장 적은 개수의 로마 숫자들로 표현해야 한다. 예를 들어 60 은 LX 이지 XLXX 가 아니고, 5 는 V 이지 IVI 가 아니다.

아래의 예를 참고 하시오.

  • DLIII = 500 + 50 + 3 = 553
  • MCMXL = 1000 + 900 + 40 = 1940
  • 235 = CCXXXV
  • 2493 = MMCDXCIII

로마 숫자로 이루어진 두 수를 입력받아 그 둘을 더한 값을 아라비아 숫자와 로마 숫자로 출력하는 프로그램을 작성하시오.

입력

첫째 줄과 둘째 줄에 하나씩 로마 숫자로 표현된 수가 주어진다. 입력된 각 수는 2000 보다 작다.

출력

입력으로 주어진 두 수를 더한 값을 첫째 줄에 아라비아숫자로 출력하고 둘째 줄에는 로마 숫자로 출력한다.


저번에 푼걸로는 못 푼다고한다.

그래서 위키백과에서 설명하는 점화식을 사용해서 풀었다.

nCr = n-1Cr-1 + n-1Cr

1. memoization


문제

자연수 N과 정수 K가 주어졌을 때 이항 계수 (NK)를 10,007로 나눈 나머지를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ K ≤ N)

출력

 (NK)를 10,007로 나눈 나머지를 출력한다.


수학공부를 안해서 그런가. 이항계수가 뭔지 몰라서 검색했다.


단순하게 생각하면 N 개의 숫자를 K 번 사용한 조합을 구하면 된다.


1. 공식이 있길래 그냥 썼다.

2. 풀어볼까?

3. 1 * 2 * 3 * 4 * 5 / (2 * 3 * 2 * 1)

4. = 120 / 12

5. = 10

6. 정리해보면

7. 1 ~ N 까지 돈다고 생각해보자

8. 그리고 그 숫자를 i 라고 하면 또 1 + i ~ N 까지 간다. ( 이 과정을 K 번 반복 )

9 그러면 공식이 나올거같은데 머리가 안돌아간다 ㅠ.ㅠ

문제

자연수 N과 정수 K가 주어졌을 때 이항 계수 (NK)를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 0 ≤ K ≤ N)

출력

 (NK)를 출력한다.


+ Recent posts