망나니 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] 백준 1120번 문자열
알고리즘/백준 2022. 2. 27. 22:41

문제 풀이 문제 조건을 보면 A의 길이는 B의 길이보다 작다. A와 B의 길이가 같을 경우 B의 문자열 중에 A의 문자열 중에 어느 문자가 다른지를 판별해주어 개수를 세주면된다. 아래의 그림을 보면 A에 hello, B에 xello가 들어왔을때 for문을 돌려 각각의 요소들이 같은지 다른지를 판별해 개수를 세서 리턴해주면 된다. A와 B의 길이가 다를 경우 방법은 같은 경우의 방법과 유사하다. 아래의 그림을 보면 A에 abc, B에 topabcoder가 들어왔을때 해당 B의 문자열을 abc로 비교할 수 있는 횟수는 총 8번이다. B의 문자열들을 인덱스 값을 하나씩 증가시켜가며 대조하는 것으로 보면 된다. 총 8번을 비교하여 그 중 최소를 출력해주면 된다. 완성된 코드!!👍😊 def same_len(a, ..

article thumbnail
[python] 백준 7120번 String
알고리즘/백준 2022. 2. 21. 23:42

문제 풀이 글보다는 그림을 보고 설명을 하는 게 나을 것 같다. 입력으로 들어온 문자열 ppppppiaanooooo 가 있을 때 해당 문자열을 리스트에 담아 문자 하나하나를 원소로 갖는다. i번째 문자가 다음 순서인 i+1번째 문자와 같지 않을때만 추가해주면 된다. (0번째 문자와 1번째 문자가 같지 않으면 된다.) 하지만 예시 그대로 코드를 짜면 위의 그림과 같이 pian이라고 출력이 된다. 그래서 해당 문자열 첫번째 문자(p)를 먼저 빼두고 i번째 문자와 i+1번째의 문자가 같지 않을 때의 조건에서 i+1번째의 문자를 이어 붙여주면 piano라는 글자가 나오게 된다. 완성된 코드!!😊👍 s = list(input()) rs = s[0] for i in range(len(s)-1): if s[i] !=..

article thumbnail
[python] 백준 16499번 동일한 단어 그룹화하기
알고리즘/백준 2022. 2. 20. 00:08

문제 풀이 내가 생각한 방법은 이렇다. 단어들을 리스트로 받아 리스트의 원소(문자)들을 정렬하고 정렬된 문자들을 이어 붙여 하나의 단어로 만든 후에 그 문자들이 새로운 리스트에 담는데 만약에 새로운 리스트에 해당 문자가 없을때만 담으면 그룹을 출력할 수 있을 것 같았다. 글이 이해가 안되면 그림을 하나 보자. 예제 입력 1이다. 주어진 단어들이 총 4개인데 리스트로 만들어 정렬한 후 리스트의 원소들을 이어 붙여 하나의 새로운 단어로 만든 것이다. 만들어진 단어들을 새로운 리스트에 순차대로 넣어 만약에 해당 단어가 새로운 리스트에 없을 때에만 추가해주면 된다. 그렇게 하면 해당 그룹은 2개( act와 dgo )로 나뉘어진다. 완성된 코드!!👍😊 n = int(input()) word_list = list(..

article thumbnail
[python] 백준 1764번 듣보잡
알고리즘/백준 2022. 2. 1. 14:12

문제 풀이 간단하게 생각하면 듣도 못한 사람들과 보도 못한 사람들의 교집합을 구하면 되는 문제이다. 합쳐서 듣보잡의 수와 해당하는 사람들을 출력하면 되는 것이다. 예제 입력1에서 듣도 보도 못한 사람들의 교집합에는 ohhennrie baesangwook 두 사람이 있기 때문에 출력의 결과가 이렇다. 여기서 생각한 방법은 set함수를 이용하는 것이었다. list도 있겠지만 입력에서 보면 N, M은 500,000 이하의 자연수 즉 입력을 N, M 합쳐 백만 번 정도를 돌린다는 소리인데... 분명 시간초과가 날것이기 때문에 list보다는 set을 이용하게 되었다. 집합을 만들어주고 해당 교집합을 구하여 출력할 때 사전 순으로 출력하라고 했기 때문에 정렬 함수인 sorted를 이용해주면 된다. 완성된 코드!!👌..

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] 백준 11656번 접미사 배열
알고리즘/백준 2022. 1. 28. 23:42

문제 풀이 문제에서 나와있다시피 baekjoon의 접미사는 총 8개로 되어있다. 해당 문자열의 길이 = 접미사 개수라고 볼 수 있다. 해당 접미사들을 for문을 돌려 리스트에 넣어주면 모든 접미사들을 구할 수 있다. 사전 순이기 때문에 sort함수를 써서 정렬해주면 된다. 완성된 코드!!👌👌 def func(word): l = list() for i in range(len(word)): l.append(word[i:]) l.sort() return l s = input() for val in func(s): print(val)

article thumbnail
[python] 백준 2870번 수학숙제
알고리즘/백준 2022. 1. 27. 23:56

입력 첫 번째 줄 테스트 케이스 수 두 번째 줄부터 문자열 출력 문자열에 대해서 숫자만 뽑아서 비 내림차순으로 출력(비 내림차순에 대해서는 문제 내용에 쓰여있다) 문제풀이 테스트 케이스 수를 입력받고 다음 줄부터는 문자열에서 문자를 제외하고 숫자만 뽑아서 비 내림차순으로 정렬하여 출력해야 하는데 구분한다고 하면 split함수가 생각날 것이다. 하지만 일반적인 split함수로는 문자 하나에 대해서만 구분할 수 있는데 re라이브러리 안에 있는 split함수를 쓰면 구분할 문자가 여러 개여도 구분할 수 있다. re — 정규식 연산 — Python 3.10.2 문서 scanf() 시뮬레이션 파이썬에는 현재 scanf()에 해당하는 것이 없습니다. 정규식은 일반적으로 scanf() 포맷 문자열보다 강력하지만, 더..

article thumbnail
[python] 백준 1075번 나누기
알고리즘/백준 2021. 9. 13. 23:28

문제 요약 및 풀이 N이 1000이고 F가 3일 때, N의 일의 자리, 십의 자리를 적절하게 제일 작게 바꿔서 바뀐 N을 F로 나누어 떨어지게 만들어야 한다. 바뀐 N은 1001이고 결과 출력 값은 02가 되는 것. 내가 생각한 풀이는 1. N을 입력받아서 일단 해당 일의 자리와 십의 자리를 00으로 바꿔줌 2. 바뀐 N을 int형으로 바꾸어서 F와 떨어지는지 확인 후 떨어지지 않는다면 1씩 누적시켜서 F와 떨어질 때까지 확인 3. 나누어 떨어진다면 해당 N의 십의자리와 일의 자리를 출력 3번은 슬라이싱으로 쉽게 표현할 수 있다. 아래의 표를 통해 N = 266, F가 9일 때의 결과를 출력해보겠다. N (입력) F (입력) 바뀐 N N % F N[-2:] (출력) 266 9 200 False 201 F..

article thumbnail
[python] 백준 1357번 뒤집힌 덧셈
알고리즘/백준 2021. 9. 6. 17:30

문제 요약 및 풀이 X, Y가 주어졌을 때, X, Y를 Reverse 시키고 합을 구한 후에 다시 Reverse를 시키면 된다. 처음에 문제를 제대로 읽지 않아... X, Y의 합을 구하고 Reverse를 시켰다. 틀려서 다시 대충 읽고 X, Y의 각각에 대해 Reverse를 시키고 합을 구했다. 또다시 틀려서 제대로 읽고 풀었다. 표로 작성을 해보면 아래와 같이 된다. X, Y를 입력받고 표의 오른쪽으로 진행이 된다고 볼 수 있다. X Y T = reverse(X) K = reverse(Y) T+K reverse(T+K) 123 100 321 1 322 223 그냥 간단하게 문자열의 슬라이싱과 리스트를 이용하여 돌렸다. 슬라이싱을 통해 reverse를 구현하였다. 완성된 코드!! 👍😊 s = input..

article thumbnail
[python] 백준 20362번 유니대전 퀴즈쇼
알고리즘/백준 2021. 9. 5. 02:34

문제 요약 및 풀이 N개의 채팅 기록 중에 정답자 S의 채팅 내용과 같은 채팅 내용들을 찾으면 된다. 내가 생각한 풀이는 이렇다. 1. 딕셔너리를 만들어서 dict[name] = chat 로 한 쌍을 이루어서 저장 2. 해당 dict[S]를 정답 answer에 대입하여 for문을 돌려 answer와 같은 채팅 내용을 가진 사람들을 카운팅 3. dict[S]가 아닌 사람들을 카운팅 해야 되기 때문에 if문으로 break 예제 입력 1을 예로 들면 N = 3, S = duck일 때 N name chat answer cnt 출력 1 oridya hello 2 orihehe hi hi 1 1 3 duck hi hi 2 표 이해가 안될 수도 있을 텐데... 그 부분은 풀이 1, 2, 3을 참조하면 될 것 같다. ..

article thumbnail
[java] 백준 5586번 JOI와 IOI
알고리즘/백준 2021. 8. 2. 12:59

예제 입력 2 같은 경우 겹쳐서 보면 JOI가 1번 IOI가 3번 나온 것을 알 수 있다. 예제 입력3 도 마찬가지로 JOI가 2번 IOI가 3번 나온 것을 알 수 있다. 내가 생각한 방법은 이렇다. String으로 문자열을 입력받고 charAt()으로 JOI와 IOI가 있는지 확인해 count를 세는 것이다. import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.next(); int count1=0, count2=0; // 배열크기를 벗어나기 때문에 -2를 해줌 // 현재의 문자와 그 다음 첫번째 문자 두번째 문..