본문 바로가기

백준 문제풀이

(42)
백준 2231 Python / 분해합 / 브론즈2 안녕하세요. 이번 문제는 백준 2231 분해합 문제입니다. 파이썬으로 풀어보겠습니다. 링크는 다음과 같습니다. https://www.acmicpc.net/problem/2231 2231번: 분해합 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 www.acmicpc.net 풀이 분해합을 구하기 위해서는, 숫자 + 숫자 각 자리 수의 합 을 구하면 됩니다. 파이썬을 이용하면, 숫자를 문자열로 변환 후, map 함수를 이용해서 한 글자씩 int로 바꿔준다면 간단하게 구할 수 있습니다. 1부터 시작해서 주어진 숫자가 될 때까지 반복문..
백준 1259 Python / 팰린드롬수 / 브론즈1 안녕하세요. 이번 문제는 백준 1259 팰린드롬수 입니다. 회문과 비슷한 문제겠네요. (소주만병만주소 와 같은..) 파이썬으로 풀어보겠습니다. 링크는 아래와 같습니다. https://www.acmicpc.net/problem/1259 1259번: 팰린드롬수 입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다. www.acmicpc.net 풀이 파이썬을 이용하면 짧고 간단하게 풀 수 있습니다. 리스트 슬라이싱을 이용해서, [::-1] 과 같은 형태면 역순정렬된 리스트가 나오기 때문입니다. reverse를 이용해서 같은지 비교해도 되겠습니다. import sys while True: ..
백준 1018 Python / 체스판 다시 칠하기 / 실버4 안녕하세요. 백준 1018 체스판 다시 칠하기 문제를 파이썬으로 풀어보겠습니다. 링크는 다음과 같습니다. https://www.acmicpc.net/problem/1018 1018번: 체스판 다시 칠하기 첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다. www.acmicpc.net 풀이 바꿔야 하는 갯수가 가장 적은 8x8 칸을 찾는 문제입니다. 처음 생각하면 막막하지만, 천천히 생각하면 어렵지 않습니다. 반복문을 써서, 8x8 을 일단 전부 검사합니다. 0 부터 N-7 까지, 0 부터 M-7 까지면 되겠죠? 시작점을 정하면, 거기로부터 8 x 8 칸 중에서 색칠..
백준 1085 Python / 직사각형에서 탈출 / 브론즈3 안녕하세요. 백준 1085 직사각형에서 탈출 문제를 python으로 풀어보겠습니다. 링크는 아래와 같습니다. https://www.acmicpc.net/problem/1085 1085번: 직사각형에서 탈출 한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램 www.acmicpc.net 풀이 처음 문제를 보면 복잡하다는 생각이 드실 수도 있겠습니다. 다만 그림을 그려보거나 머릿속으로 상상해보면 매우 간단한 문제입니다. 간단하게 예제 1번을 그림으로 그려보았습니다. 0, 0 부터 10,3 까지의 직사각형이고, 현재 위치는 6,2 입니다. 가장 가까운 경계..
백준 1181 Python / 단어 정렬 / 실버5 안녕하세요. 백준 1181 단어 정렬 문제를 python으로 풀어보겠습니다. 링크는 다음과 같습니다. https://www.acmicpc.net/problem/1181 1181번: 단어 정렬 첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다. www.acmicpc.net 풀이 보통의 문자열 문제들은 python으로 풀면 매우 간단하게 해결할 수 있습니다. 입력을 list로 받은 뒤, 중복 제거를 위해 set() 를 사용하고, 다시 list로 바꿔줍니다. 정렬을 위해 sort() 를 사용하는데, 일반적으로 sort를 사용하면 사전 순으로 정렬되게 됩니다...
백준 2577 C / 단계별로 풀어보기 - 1차원 배열 4 안녕하세요. 이번에는 1차원 배열 4번째인 2577 번, 숫자의 개수 입니다. (BOJ 2577 C) https://www.acmicpc.net/problem/2577 2577번: 숫자의 개수 첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 같거나 크고, 1,000보다 작은 자연수이다. www.acmicpc.net 세 숫자의 곱을 구하고 그 수에 0부터 9까지 몇 번 들어가있나 세는 문제로군요. 방법은 여러 가지가 있겠습니다만, 저는 10칸의 배열을 만들고, 수를 한자리씩 쪼개서 그 수의 갯수를 1개씩 늘려주는 방식으로 해보겠습니다. 예를 들어 12345 라고 하면 10보다 큰지 확인을 하고, 맞으면 10으로 나눈 것의 나머지를 구합니다. 그러면 5가 되겠죠. ..
백준 2920 C / 단계별로 풀어보기 - 1차원 배열 3 안녕하세요. 이번에는 3번째, 2920 번 음계 입니다. (BOJ 2920 C) https://www.acmicpc.net/problem/2920 2920번: 음계 문제 다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, ..., C를 8로 바꾼다. 1부터 8까지 차례대로 연주한다면 ascending, 8부터 1까지 차례대로 연주한다면 descending, 둘 다 아니라면 mixed 이다. 연주한 순서가 주어졌을 때, 이것이 ascending인지, descending인지, 아니면 mixed인지 판별하는 프로그램을 www.acmicpc.net 1 2 3 4 5 6 7 8 이면 ascending, 8 7 ..
백준 2562 C / 단계별로 풀어보기 - 1차원 배열 2 안녕하세요. 이번에는 2번째, 2562 번 최댓값 입니다. (BOJ 2562 C) https://www.acmicpc.net/problem/2562 2562번: 최댓값 9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오. 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61 이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다. www.acmicpc.net 드디어 배열을 써 볼만한 문제가 나왔군요. 자연수니까, 0으로 초기화를 해줘도 되겠습니다. 9칸짜리 1차원 배열을 선언해주고, 값을 저장한 다음, 최댓값을 찾아주면 되겠습니다. 코드를 짜보면 이렇게 되겠군요. #include ..
백준 10818 C / 단계별로 풀어보기 - 1차원 배열 1 안녕하세요. 이번에는 1차원 배열입니다. 변수를 하나하나 일일이 선언 안해줘도 되고 참 좋죠. 오늘은 그 첫 번째, 10818 번 최소, 최대 입니다. (BOJ 10818 C) https://www.acmicpc.net/problem/10818 10818번: 최소, 최대 첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다. www.acmicpc.net 이게 왜 1차원 배열 문제인지는 모르겠습니다... 배열을 굳이 쓸 필요가 없어보이네요. 그냥 풀겠습니다. 평소 변수를 0으로 초기화하지만, 최솟값과 최댓값은 다르게 선언해야 합니다. -1..
백준 1110 C / 단계별로 풀어보기 - while 문 3 안녕하세요. 이번에는 1110 번, 더하기 사이클 입니다. https://www.acmicpc.net/problem/1110 1110번: 더하기 사이클 0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자. 26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = www.acmicpc.net 참신하네요. 왜 이런 일을 하는지는 모르겠지만, 여튼 시키니까 해봅시다...