알고리즘 315

[백준, 파이썬, 15652번] N과 M (4)

풀이 해당 문제는 백트래킹 문제로 현재 위치의 값을 변경 후 끝에 도달했다면 처리 후 돌아와서 초기 값인 0 으로 변경하는 문제이며 여기서 다른 문제와의 차별점으로는 이후의 값의 시작값이 이전의 값부터 시작한다는 것이 다르다. 그래서 아래와 같이 s ~ n+1 값 까지 반복하게 되는데 반복문으로부터 나온 i의 값을 다시 함수의 s로 보내서 해당 값부터 시작하도록 하여 문제를 해결 import sys def find(s,cnt): global n,m if cnt == m: print(*li) return for i in range(s,n+1): li[cnt] = i find(i,cnt+1) li[cnt] = 0 input = sys.stdin.readline n,m = map(int,input().spli..

알고리즘 2023.09.25

[백준, 파이썬, 7795번] 먹을 것인가 먹힐 것인가

풀이 해당 문제는 단순히 2중 for문으로 해결하기엔 불필요한 시간이 많이 사용될 것 같아 이분 탐색 알고리즘으로 해결 우선 받아오는 A,B의 입력 값을 sorted로 정렬해야 찾은 인덱스 아래의 값들은 모두 해당 값보다 작다고 판단할 수 있기에 오름차순 정렬 이후 이분 탐색으로 해결하는데 처음 제출한 값이 25%에서 에러가 난 이유를 확인해보니 elif 문에 result에 더하는 값을 그냥 mid+1로 제출 하다보니 틀렸다 반례로는 1 1 2 3 1 3 위와 같이 제출해보니 mid가 1로 되어져 결과가 2로 되어지는 것을 확인 후 e와 s중 작은 값 +1 로 변경 후 해결 import sys inpyt = sys.stdin.readline for _ in range(int(input())): n,m =..

알고리즘 2023.09.24

[백준, 파이썬, 11478번] 서로 다른 부분 문자열의 개수

풀이 해당 문제는 문자열 슬라이싱을 활용해서 문제를 해결 단, 슬라이싱을 사용하다 보니 길이를 초과해도 결과값이 나오기에 따로 에러처리는 하지 않고 조건문을 추가해서 길이가 i와 같을 경우면 추가하기로 하고 또 같은 값이 없어야하는 서로 다른 값의 개수를 구하는 문제이기에 set안에 추가하는 형식으로 문제 해결 import sys input = sys.stdin.readline n = input().rstrip('\n') _set = set() for i in range(1,len(n)+1): for j in range(len(n)): if len(n[j:j+i]) != i: break else: _set.add(n[j:j+i]) print(len(_set))

알고리즘 2023.09.24

[백준, 파이썬, 4158번] CD

풀이 해당 문제는 집합, 이진 탐색 두 방법으로 풀이가 가능하기에 각각 접근을 따로 해봤다. 그런데 해당 문제에서는 내가 시도한 이진 탐색 방식은 pypy 제출만 가능했어서 조금 아쉽... 집합은 둘 다 잘 나오는데.... 무튼 집합 풀이 단순히 입력 값들을 set() 메서드에 넣은 다음 intersection인 교집합을 조회한 뒤 개수를 출력하는 형식으로 간단하게 풀이 이진 탐색 풀이 우선 n의 길이만큼 받아지는 입력 값을 li에 넣은 다음 m 길이 만큼 반복해서 해당 값을 find로 담은 뒤 이진 탐색을 위한 시작과 끝 값을 0과 n-1값으로 하여 find 값을 li에서 찾도록 하기 이후 이진 탐색 코드는 다른 이진 탐색 코드랑 유사할 것이기에 생략 집합 풀이 import sys input = sys..

알고리즘 2023.09.22

[백준, 파이썬, 13777번] Hunt The Rabbit

풀이 이분 탐색 알고리즘에 대해 익숙해지기 위해 푼 문제 단순히 이분 탐색을 통해 만들어지는 mid 값을 출력만 해주면 되는 문제이기에 간단하게 풀 수 있었다. import sys input = sys.stdin.readline while True: n = int(input()) if not n: break s,e = 1,50 while e >= s: mid = (s+e)//2 if n == mid: print(mid) break else: print(mid, end=' ') if mid >= n: e = mid-1 else: s = mid+1

알고리즘 2023.09.22

[백준, 파이썬, 2615번] 오목

풀이 기존 그래프 탐색처럼 방문 체크를 해서 풀려고 했지만 뭔가 엄청나게 꼬이는 것을 감지했다. 그래서 단순히 이전과 이후의 값을 비교하며 풀이. 다만 이 또한 엄청 꼬이는 것을 감지 그래서 그냥 조건을 많이 추가하더라도 하나씩 풀기로 마음 먹음 처음 방향은 8방향으로 다 적용했지만 불필요하다고 생각이들어 4방향(오른쪽 위 대각선, 오른쪽, 오른쪽 아래 대각선, 아래)으로만 탐색 후 해당 방향을 li에 저장 후 해당 방향으로만 탐색하고자 함. 여기서 이전 방향의 값이 현재 값과 같은 경우엔 중간의 값이기에 탐색을 하지 않도록 해야하는데 어떻게 조건처리를 해야할지 고민을 엄청나게 했다... 그래서 너무 복잡해진 나머지 그냥 if문을 오지게 달아서 해결했음. 그리고 마지막으로 sys.exit(0)을 하게 되..

알고리즘 2023.09.19

[백준, 파이썬, 13413번] 오셀로 재배치

풀이 초기 의도는 중복된 값+중복된 값 제거한 나머지 값이었는데 생각해보니 그냥 둘 중 큰 값을 출력만 해주게 되면 위의 식이 되는 것이어서 아래와 같이 다를 경우 각각에 카운팅 해주고 큰 값을 출력하는 식으로 해결 import sys input = sys.stdin.readline for _ in range(int(input())): n = int(input()) before,after = input().rstrip('\n'),input().rstrip('\n') w_cnt,b_cnt = 0,0 result = 0 for i in range(n): if before[i] != after[i]: if before[i] == "W": w_cnt += 1 else: b_cnt += 1 if b_cnt > w..

알고리즘 2023.09.19