전체 글(7)
-
[C] 백준 1003 (피보나치 함수)
*문제에 대한 내 생각 재귀에 대한 좋은 문제라고 생각한다. 그러나 종종 런타임오류가 나와 사람들을 당황하게 만드는 것 같다. *문제 풀이 -아이디어 내 경우 두 코드를 작성했다. 하나는 재귀, 하나는 배열을 이용한 방법이다. 사실상 서로 코드의 진행방향이 반대라고 생각하면 된다. 즉, 뿌리에서 각 가지로 나아갈지, 가지들을 모아 뿌리로 갈지의 차이다. -코드1(재귀) 문제를 읽어보면, 결국 출력해야 하는 숫자는 0과 1의 개수다. 나무로 따지자면, 제일 끝에 있는 잎새에 해당하는 것. 이 경우 문제에 나와있는 fibonacci함수를 변형시켰다.(코드에서는 fibo라는 함수) 구체적으로 말하자면 원래 0또는 1을 출력하는 부분을, 배열을 이용해 개수를 더하는 것으로 수정했다. 1 2 3 4 5 6 7 8..
2019.10.08 -
[C] 백준 1002 (터렛)
*문제에 대한 내 생각 기본적인 수학능력만 있다면 괜찮게 풀 수 있다. 다만 경우의 수를 잘 나눠야 비교적 깔끔하게 풀 수 있는 문제. *문제 풀이 -아이디어 원의 중심들을 이은 거리 d와, 각 반지름의 합 또는 차를 비교하는게 핵심이다. 두 점에서 만나는 경우가 애매하기 때문에, else로 처리하면 깔끔하게 코드를 작성할 수 있다. -코드 몇가지의 트릭이 있다만 그리 중요한 부분은 아니다. 다만 계산의 편리성을 위한 부분이 어느정도 있으니, 주석을 보고 이해를 하면 좋은 편. main함수 하나에다 코딩을 해도 괜찮았지만, 그리 좋은 코드는 아니므로 함수를 좀 사용했다. 위부터 보지말고 main부터 천천히 읽어갈 것. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ..
2019.10.08 -
[Python] 백준 2555 (생일)
*문제에 대한 내 생각 어.....음.....그래......그냥 쉬어가는 시간 *코드 이걸 쓰는건 좀 그러니까 힌트(?)를 알려주자면, 백준 문제중 컨닝이라는 문제가 있다(https://www.acmicpc.net/problem/1014). 이 문제에 나오는 숫자들 중에 답이 있다(정확하게는 문제가 아니라 문제가 있는 페이지...)
2019.07.02 -
[Python] 백준 2869 (달팽이는 올라가고 싶다)
*문제에 대한 내 생각 만일 시간제한이 없었다면 파이썬 자습서에나 나오는 예제였을 것이다. 문제자체가 어렵지는 않지만 실수할 것들이 많아 나도 4번의 시도끝에 성공했다. *문제 풀이 -아이디어 가장 처음 이 문제를 마주쳤을 때 나오는 실수는 올라가는 거리와 내려오는 거리의 차를, 높이에 나누어 그 몫에 1을 더하는 경우다.(즉 V//(A-B) + 1) 그러나 이 경우는 중대한 문제가 있다. 아침에 올라가는데 성공하는 경우를 제외한 것이다. 만일 3M를 올라가고 1M를 내려온다면, 높이가 4일때 위의 식으로는 3이 나온다. 그러나 실제로는 2가 답이다. 다시말해 위의 식은 아침에 막대기를 다 올랐음에도, 다시 밤에 내려갔다가 다음날 다시 올라오는 구조다. 하지만 이러한 실수를 하는 경우는 거의 없을 것이다..
2019.06.11 -
[Python] 백준 1032 (명령 프롬프트)
*문제에 대한 내 생각 뭐...비교에 대한 문제다. 딱히 달 코멘트는 없다만, 왜인지 모르게 내 코드들중 이 문제를 읽어본 사람이 꽤 있었다. *문제 풀이 -아이디어 앞서 말했듯 각 입력값을 비교하는 문제다. 다만 약간의 기본상식이다만 문자열은 변경이 불가능해 다른 방법으로 출력값을 저장해야 했다. 내 경우는 리스트를 사용했다. -코드1 먼저 b라는 리스트에다 문자열을 n개만큼 집어넣어, 이차배열과 비슷한 형태를 구성했다. 그리고 출력값을 c로 두고, 이 변수에 b[0](딱히 0이 아니어도 상관없음)을 할당해 리스트화 시켰다. 이후 for문을 사용해 각 b[i]의 값과 대조했다. 입력값의 길이는 전부 같기 때문에 기준은 c의 길이로 했다. n = int(input()) b = [] for i in ran..
2019.06.11 -
[Python] 백준 15873 (공백 없는 A+B)
*문제에 대한 내 생각 문제자체는 어렵지 않았다. A와 B를 구분해서 더해주기만 하면 되는 문제였다. 중점은 A 혹은 B가 10인 경우였다. (둘 다 10이면 매우 간단) *문제 풀이 -아이디어 위에서 언급했든 중점은 둘 중 하나가 10인 경우다. 따라서 경우를 나눌 필요가 있었다. 먼저 비교적 조건문을 작성하기 쉬운 경우 두가지(둘 다 10이 아닌 경우와 둘 다 10인 경우)를 문자열의 길이를 통해 판단했다(둘 다 10이 아니면 문자열의 길이가 2, 둘 다 10이면 문자열의 길이가 4). 남은 부분은 둘 중 하나가 10일테니, 0의 위치로 다시 if문을 사용해 경우를 나누었다. 참고로 문제의 조건에서 필요없는 0은 붙지 않는다고 제한했기 때문에 0의 위치를 기준으로 문제없다. -코드 n = input(..
2019.06.11