망나니 AWOS의 일상
article thumbnail
[python] 백준 8892번 팰린드롬
알고리즘/백준 2022. 3. 10. 20:09

문제 풀이 내가 생각한 방법은 itertools라이브러리의 permutations(순열) 함수를 이용하는 것이었다. permutations에 대한 자세한 설명은 밑에 있다. 파이썬을 파이썬답게 - 순열과 조합 - combinations, permutations 본 강의는 파이썬 문법을 이미 알고 있는 분들을 대상으로 만들어졌습니다. ##### 이런 분들께 추천합니다 * 파이썬 문법을 알고 계시는 분 * 알고리즘 문제를 조금 더 쉽게 풀고 싶은 분 * Python 코 programmers.co.kr 간단히 요약하자면 aaba, ba, ababa, bbaa, baaba 총 5개의 단어가 입력으로 들어왔을 때 1. 5개의 단어 중에서 2개 단어를 합친다. 2. 합친 단어들 중에 *팰린드롬 단어를 찾는다. *팰..

article thumbnail
[python] 백준 10867번 중복 빼고 정렬하기
알고리즘/백준 2022. 3. 8. 23:57

문제 풀이 문제 출력 조건에서 같은 수는 한 번만 출력한다고 되어있기 때문에 set()으로 중복된 수들을 걸러주면 되겠다 싶었다. 또한 오름차순으로 정렬한 결과를 출력해야 되기 때문에 sorted()로 오름차순 정렬을 해주었다. 값만 출력해야 되기 때문에 빈 문자열을 하나 만들고 정렬된 리스트의 값들을 하나씩 넣어주는데 마땅한 방법이 생각나지 않아 f-string방식으로 값뒤에 공백을 하나 만들어 빈 문자열에 이어 붙이도록 했다. 마지막으로 strip()으로 불필요한 공백이 있으면 지워주도록 했다. 완성된 코드!!👍😊 num_count = int(input()) rs = '' for val in sorted(set(map(int, input().split()))): rs += f'{str(val)} ' ..

article thumbnail
[python] 백준 1312번 소수
알고리즘/백준 2022. 3. 7. 23:49

문제 풀이 해당 문제를 수학으로 접근하지 않고 나눈 다음 문자열로 생각하여 풀다 보니 IndexError와 틀렸습니다만 주구장창 떴다. 반례를 고려했다. 아래는 처음 짰던 코드다. 25, 7, 5 가 입력되었을 때 25/7의 결과가 str() 함수에 의해 문자열로 바뀌고 해당 문자열을 ' . ' 으로 구분하면 몫과 소수 부분으로 나뉘게 된다. 25/7을 했을 때 3.5714285... 을 split(' . ')을 해주면 3과 5714285... 두 문자열로 나뉜다. 뒤에 인덱스를 붙여주면 list 형태가 되어 인덱싱을 했을 때 해당 5714285... 이 부분만 가져올 수 있다고 생각하여 풀었다. a, b, n = map(int, input().split()) # 25/7 = 3.5714285... ->..

article thumbnail
[python] 백준 1934번 최소공배수
알고리즘/백준 2022. 3. 6. 23:37

문제 풀이 python의 내장 라이브러리 중 math 라이브러리에는 최대공약수를 구할 수 있는 함수들이 들어있다. from math import gcd 위와 같이 한 줄이면 최대공약수를 구할 수 있는 함수를 불러와 쓸 수 있다. 최대공약수와 최소공배수는 밀접한 관계를 갖고 있다. 최대공약수를 구하면 최소공배수는 덤으로 구할 수 있다. 입력으로 들어온 두 수의 곱에서 두 수의 최대공약수로 나누면 그게 최소공배수이다. 완성된 코드!!👍😊 from math import gcd def lcm(x, y): return x * y // gcd(x, y) t = int(input()) for _ in range(t): A, B = map(int, input().split()) print(lcm(A, B))

article thumbnail
[python] 백준 2729번 이진수 덧셈
알고리즘/백준 2022. 3. 1. 21:28

문제 풀이 간단하게 두 문자열을 받아 해당 문자를 정수로 바꿔준다. 바뀐 두 정수의 합을 구해 bin() 함수로 감싸주면 0b~~~~ 로 시작하는 이진수가 출력이 되는데 해당 0b를 잘라주어 출력해주면 된다. 완성된 코드!!😊👍 t = int(input()) for _ in range(t): n1, n2 = input().split() print(bin(int(n1, 2) + int(n2, 2))[2:])

article thumbnail
[python] 백준 5568번 카드 놓기
알고리즘/백준 2022. 2. 28. 22:46

문제 풀이 예제 1을 보면 첫째 줄에 카드의 총 개수(4장), 둘째 줄에 총 카드 중 몇 장(2장)을 뽑을지 셋째 줄부터 마지막째 줄까지 4장의 카드의 숫자를 입력 (1, 1, 2, 12) 받는다. 무작위로 2장씩 짝지어 보면 아래의 그림과 같이 된다. 조합은 총 12개지만 중복되는 수가 있으므로 제외하면 7개라는 결괏값이 나온다. python에서는 itertools 라이브러리에 내장되어 있는 permutations 함수가 있다. 이 permutations 함수는 위의 문제처럼 순열을 구할 때 잘 쓰이는 함수이다. 때문에 꼭 import를 해줘서 사용해야 한다. 05-05 itertools.permutations - 순열 `itertools.permutations(iterable, r=None)` 함수는..

article thumbnail
[python] 백준 1439번 뒤집기
알고리즘/백준 2022. 1. 31. 21:53

문제 풀이 문자열 S를 입력받아서 모든 문자를 1로 만들 때 최소한의 뒤집기 횟수를 출력해야 한다. 예제 입력 4를 보면 11001100110011000001 인데 연속된 0만 보자면 00, 00, 00, 00000 총 4개가 있고 연속된 1만 보자면 11, 11, 11, 11, 1 총 5개가 있는 것을 볼 수 있다. 여기서 생각한 방법은 split함수를 쓰는 것이었다. 문자열 S를 입력받고 해당 문자열을 0이나 1을 구분자로 두면 쉽게 풀 수 있을 것 같았다. s1 = s.split('0') s2 = s.split('1') 위와 같이 각각 0과 1로 구분하였을 때 결과이다. 배열에 빈 문자열이 있지만 값이 있을 때만 카운트하면 된다. s1은 연속된 0의 개수의 배열이 될 것이고 s2는 연속된 1의 개수..

article thumbnail
[python] 백준 15233번 Final Score
알고리즘/백준 2022. 1. 2. 18:13

입력 첫 번째 줄에는 A팀 인원수, B팀 인원수, 득점한 선수 인원수 두 번째 줄에는 A팀 선수들의 이름 세 번째 줄에는 B팀 선수들의 이름 네 번째 줄에는 득점한 선수들의 이름 출력 득점한 인원이 더 많은 선수팀 출력, A팀과 B팀의 득점한 인원이 같을 때 "TIE" 출력 문제 풀이 간단하게 득점한 선수가 A팀, B팀에 얼마나 있는지 확인하여 결과값을 출력해주면 된다. 또 중복된 코드가 있어서 함수를 하나 만들어 불필요한 코드를 없앴다. 완성된 코드!!👍 def p_count(p_l): cnt = 0 for val in p_l: cnt += g_p.count(val) return cnt a,b,p = map(int, input().split()) a_p = input().split() b_p = inp..

article thumbnail
[python] 백준 13229번 Selection Sum
알고리즘/백준 2022. 1. 1. 17:26

입력 첫 번째 줄에는 배열 크기 두번째 줄에는 배열 안의 값들 세 번째 줄에는 테스트 케이스 개수 네 번째 줄부터는 배열 위치(시작, 끝)에 해당하는 값들의 누적 합 출력 배열 1번째 요소에서 1번째 요소까지의 합 = 5 배열 0번째 요소에서 9번째 요소까지의 합 = 42 배열 5번째 요소에서 7번째 요소까지의 합 = 12 배열 9번째 요소에서 9번째 요소까지의 합 = 1 배열 1번째 요소에서 8번째 요소까지의 합 = 40 문제 풀이 내장 함수 sum을 이용하면 쉽게 풀 수 있다. 완성된 코드 n = int(input()) n_l = list(map(int, input().split())) for _ in range(int(input())): a, b = map(int, input().split()) p..

article thumbnail
[python] 백준 1037번 약수
알고리즘/백준 2021. 12. 6. 22:17

문제 풀이 보자마자 그림을 한번 그려봤다. 검은색 : 테스트 케이스의 입, 출력 빨간색 : 테스트 케이스 출력에서의 1과 자기 자신 파란색 : 찾아낸 규칙 처음에 짜 본 코드다. sorted 내장 함수로 입력받은 수들을 정렬하였다. 또한 N의 약수의 개수가 홀수일 때, 짝수일 때를 판별하여 N을 구하도록 했다. ex) 홀수일 경우, N의 약수의 개수 = 1, input = 5, out = 25 25의 약수는 1을 제외한 5 뿐이기 때문에 제곱하여 반환시켜주면 25가 나온다. ex) 짝수일 경우, 입력받은 약수들이 list형태로 있기 때문에 최솟값 * 최댓값을 하면 N이 나오게 된다. N = int(input()) l = sorted(map(int, input().split())) if N % 2 == 1..

article thumbnail
[python] 백준 11723번 집합
알고리즘/백준 2021. 9. 16. 22:46

문제 풀이 및 요약 문제 이해가 잘 안 되시는 분들에게 직접 그림을 그려서 보여드리겠다. check x를 통해서만 x가 있는지 없는지를 판단하여 있으면 1을 출력, 없으면 0을 출력한다. 나머지 add, remove, toggle / empty, all 등은 값 삽입, 삭제가 이루어진다. 문제에도 나와 있다시피 집합이기 때문에 set()을 써야 한다. 얼핏 보면 set 도 {} 중괄호를 사용하고 있어 {} 중괄호를 사용하는 딕셔너리와 헷갈릴 수도 있으나 set 같은 경우 값이 하나 {1, 2, 3}이고 딕셔너리 같은 경우 {'key1' : 'value1', 'key2' : 'value2'}와 같이 key와 value로 이루어져 있다. 처음에 set()을 생각을 못하고 list로 접근하여 풀어서... 당연..

article thumbnail
[python] 백준 1094번 막대기
알고리즘/백준 2021. 9. 16. 21:14

문제 요약 및 풀이 문제를 보자마자 아 그림으로 풀어야겠다 싶어서 그림으로 그려봤다. 순서는 ① -> ② -> ③ 순대로 보면 될 것 같다. 64를 반으로 나누면 32, 32 2개의 막대가 나오는데 하나의 막대는 버려야 하므로 절반으로 나누어 떨어질 때까지 문제에 있는 2가지 과정을 반복하다 보면 ②번과 같은 64 32 16 8 4 2 1 이 보여진다. 수 들의 공통점은 2^n 승이라는 것. 즉, 2진수로 표현이 가능하다. ③번과 같이 10진수로 입력을 받아 2진수로 변환을 해준후 1의 개수가 총 몇 개인지를 반환해주면 된다. 완성된 코드!!👍😊 print(bin(int(input()))[2:].count('1'))

article thumbnail
[python] 백준 1158번 요세푸스 문제
알고리즘/백준 2021. 8. 28. 23:44

문제 요약 및 풀이 입력이 7 3일 때 (1 2 3 4 5 6 7) 번까지 총 7명의 사람이 원을 이루고 있게 되고 3번째 사람을 제거하게 되는데 표로 보여주겠다. 리스트를 이용해서 풀면 되겠다 싶었다. 배열의 index값은 0번째부터 시작이니 k=3이라면 list[2]라고 생각하면 된다. K번째 사람이 제거 될때마다 리스트의 사이즈가 하나씩 줄어드는 걸 볼 수 있다. 1 2 3 4 5 6 7 [0] [1] [2] [3] [4] [5] [6] 3 1 2 4 5 6 7 [0] [1] [2] [3] [4] [5] 6 1 2 4 5 7 [0] [1] [2] [3] [4] 2 1 4 5 7 [0] [1] [2] [3] 7 1 4 5 [0] [1] [2] 5 1 4 [0] [1] 1 4 [0] 4 빨간색만을 보면..