백준 26

백준 1291: 이면수와 임현수 (Python)

문제 중급반을 담당하는 배성경 조교는 이 세계에 있는 모든 자연수들을 분석했다. (중간 생략...) 숫자 4는 위대한 숫자 1과 시작의 숫자 3의 합으로 “완벽하다”라는 의미를 갖는 완벽한 숫자이다. 그와 동시에, 이 완벽한 숫자와 태초의 숫자들(2와 3)의 합으로 표현되는 숫자들, 즉 6, 7, 8, 9, 10 ... 들 역시 포함해서 “처음부터 완벽했던, 태초부터 존재했던”이라는 의미인 “완전[피-얼프 에크트(perfect)]” 혹은 “신이 태초부터 완성시켜져 있었던 계급[어비스 오엘 우테(absolute)]”이라고 부른다. (중간 생략...) 숫자 2는 최초의 짝수로 “사람 둘이 모이면 스타 1:1을 할 수 있다.”라는 의미로 “starcraft number”라고 불렀다. (중간 생략...) 숫자 ..

개발/백준 2024.04.17

백준 1774: 우주신과의 교감 (Python)

문제황선자씨는 우주신과 교감을 할수 있는 채널러 이다. 하지만 우주신은 하나만 있는 것이 아니기때문에 황선자 씨는 매번 여럿의 우주신과 교감하느라 힘이 든다. 이러던 와중에 새로운 우주신들이 황선자씨를 이용하게 되었다. 하지만 위대한 우주신들은 바로 황선자씨와 연결될 필요가 없다. 이미 황선자씨와 혹은 이미 우주신끼리 교감할 수 있는 우주신들이 있기 때문에 새로운 우주신들은 그 우주신들을 거쳐서 황선자 씨와 교감을 할 수 있다. 우주신들과의 교감은 우주신들과 황선자씨 혹은 우주신들 끼리 이어진 정신적인 통로를 통해 이루어 진다. 하지만 우주신들과 교감하는 것은 힘든 일이기 때문에 황선자씨는 이런 통로들이 긴 것을 좋아하지 않는다. 왜냐하면 통로들이 길 수록 더 힘이 들기 때문이다. 또한 우리들은 3차원 ..

개발/백준 2024.03.28

백준 1654: 랜선 자르기 (Python)

문제집에서 시간을 보내던 오영식은 박성원의 부름을 받고 급히 달려왔다. 박성원이 캠프 때 쓸 N개의 랜선을 만들어야 하는데 너무 바빠서 영식이에게 도움을 청했다.  이미 오영식은 자체적으로 K개의 랜선을 가지고 있다. 그러나 K개의 랜선은 길이가 제각각이다. 박성원은 랜선을 모두 N개의 같은 길이의 랜선으로 만들고 싶었기 때문에 K개의 랜선을 잘라서 만들어야 한다. 예를 들어 300cm 짜리 랜선에서 140cm 짜리 랜선을 두 개 잘라내면 20cm는 버려야 한다. (이미 자른 랜선은 붙일 수 없다.)  편의를 위해 랜선을 자르거나 만들 때 손실되는 길이는 없다고 가정하며, 기존의 K개의 랜선으로 N개의 랜선을 만들 수 없는 경우는 없다고 가정하자. 그리고 자를 때는 항상 센티미터 단위로 정수길이만큼 자른..

개발/백준 2024.03.26

백준 10844: 쉬운 계단 수 (Python)

문제45656이란 수를 보자.이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다.N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다.해설 인접한 모든 자리의 차이가 '1'인 수를 계단 수라고 할 때, 길이 N ( 1 다이나믹 프로그래밍으로 문제에 접근해야 한다.  DP 문제의 핵심은 복잡한 문제를 간단한 문제로 나누어 문제를 풀어가는 것이다. 제일 쉬운 것부터 생각해보자.N이 1일 때, 계단 수는 몇개일까? 제일 앞의 자릿수가 i인 경우에 대해 모든 계단수를 구해보자.  i계단수DP[N][i]0-0111221331441551661771881991  DP[N][i]는 '길이가 N이고 앞자리가 i인 계단 수의 개수'를 저장하는 리스..

개발/백준 2024.03.20

백준 11722: 가장 긴 감소하는 부분 수열 (Python)

문제수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분 수열은 A = {10, 30, 10, 20, 20, 10}  이고, 길이는 3이다.해설 '가장 긴 ~ 하는' 시리즈의 문제이다. 우선 문제를 보았을 때 '연속적'으로 감소하는 수열의 길이를 구한다는 점에서, 다이나믹 프로그래밍을 이용하지 않을까 유추해볼 수 있다. 주로 이런 수열 패턴의 문제가 '이전의 답' 을 활용해 다음 답을 결정해나가기 편리하기 때문이다.  이 문제에서 DP 리스트는 'i번 원소까지 보았을 때 가장 긴 감소하는 수열의 길이' 로 정의하였다. 예를 들어, {5, 3, 4, 2, 1} 이라는 수열..

개발/백준 2024.03.18

백준 16469: 큰 수 만들기 (Python)

문제음이 아닌 정수가 N개 들어있는 리스트가 주어졌을 때, 리스트에 포함된 수를 나열하여 만들 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오.해설처음에는 "?? 뭐지 이런게 플래5라고?" 싶을 정도로 단순히 풀릴 것 같은 문제였다.각 숫자들을 '가장 큰 자릿수'에 맞춘 다음, 정렬시킨 후 원본 값을 불러오면 되는거 아닌가 했던 것이다.예를 들어,3 30 34 5 9 의 경우3 30 34 5 9(자릿수 맞추기)30 30 34 50 90(정렬)90 50 34 30 30(원본값 불러오기)9 5 34 3 30 로 풀 수 있지 않을까 했던 것이다.  실제로 이렇게 생각을 하고 제출하니 83%까지는 올라가는 듯 했다. 그러나 여지없는 실패.위 방식으로 코드를 짜면 다음과 같은 반례가 생긴다.21211 121A..

개발/백준 2024.03.05

백준 1715: 카드 정렬하기 (Python)

문제정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장의 숫자 카드 묶음을 합치려면 50번의 비교가 필요하다. 매우 많은 숫자 카드 묶음이 책상 위에 놓여 있다. 이들을 두 묶음씩 골라 서로 합쳐나간다면, 고르는 순서에 따라서 비교 횟수가 매우 달라진다. 예를 들어 10장, 20장, 40장의 묶음이 있다면 10장과 20장을 합친 뒤, 합친 30장 묶음과 40장을 합친다면 (10 + 20) + (30 + 40) = 100번의 비교가 필요하다. 그러나 10장과 40장을 합친 뒤, 합친 50장 묶음과 20장을 합친다면 (10 + 40) + (50 + 20) ..

개발/백준 2024.03.03

백준 12094: A와 B (Python)

문제수빈이는 A와 B로만 이루어진 영어 단어가 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다.이런 사실에 놀란 수빈이는 간단한 게임을 만들기로 했다. 두 문자열 S와 T가 주어졌을 때, S를 T로 바꾸는 게임이다. 문자열을 바꿀 때는 다음과 같은 두 가지 연산만 가능하다.문자열의 뒤에 A를 추가한다.문자열을 뒤집고 뒤에 B를 추가한다.주어진 조건을 이용해서 S를 T로 만들 수 있는지 없는지 알아내는 프로그램을 작성하시오. 해설문제 설명이 단순한 것에 비해 발상이 조금 까다롭게 느껴진 문제다.S를 T로 바꿀 때, 두 가지 연산이 가능하다.문자열의 뒤에 A를 추가한다.문자열을 뒤집고 뒤에 B..

개발/백준 2024.03.02

백준 1932: 정수 삼각형 (Python)

문제 1932번: 정수 삼각형 첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다. www.acmicpc.net 위 그림은 크기가 5인 정수 삼각형의 한 모습이다. 맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다. 삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다. 해설 다이나믹 프로그래밍(DP)를 이용해 풀 수 있는 문제다. 위에서부터 아래로, ..

개발/백준 2024.03.02

백준 13549: 숨바꼭질 3 (Python)

문제 13549번: 숨바꼭질 3 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 www.acmicpc.net 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 0초 후에 2*X의 위치로 이동하게 된다. 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장..

개발/백준 2024.02.29