알고리즘 315

[백준, 파이썬, 12871번] 무한 문자열

풀이 우선 s와 t중 긴 문자열을 t에 저장하기 위해 조건문을 추가 이후 단순히 len(t) // len(s)를 한 값 만큼 s를 곱한 결과가 t와 같은지 비교를 했을 때 나와있는 반례는 맞아 제출을 시도했지만 3%에서 실패 그래서 길이가 딱 떨어지지 않는 조건을 생각하였을 때 aa, aaa 를 생각하게 되어 or 뒤에 조건을 붙여 조건분기 하여 문제 해결 import sys input = sys.stdin.readline s, t = input().rstrip('\n'), input().rstrip('\n') result = 0 if len(s)> len(t): tmp = s s = t t = tmp if len(t)//len(s)*s == t or len(t)*s == len(s)*t: print(1..

알고리즘 2023.08.31

[백준, 파이썬, 17266번] 어두운 굴다리

풀이 처음 접근한 방법은 height를 하나씩 높혀가며 visit를 활용해서 해당 범위를 채우는 풀이로 접근 해당 방법은 알 수 없는 while 루프에 빠져서 인지 7%에서 계속 맴돌게 되는 현상 발생... 이후 다른 접근 방법을 생각 가로등 사이의 거리에 따른 범위, 즉 가로등 간의 거리 차를 구한 다음 해당 거리를 각각의 가로등이 같이 채우는 곳이 없도록 //2를 해주기! 단 차이가 홀 수의 경우 하나의 빈 공간이 생기기에 +1 해주기 그리고 사이의 가로등이 아닌 양 끝에 해당하는 가로등의 경우 시작 가로등의 경우엔 해당 가로등의 위치에서 시작 위치까지 모두 비춰야하기에 if i == 0: result = max(li[i], result) 해당 코드를 적용 마지막 가로등의 경우엔 마지막 거리에서 현재..

알고리즘 2023.08.30

[백준, 파이썬, 2217번] 로프

풀이 처음에 해당 문제를 이해하지 못했다. 역시 알고리즘은 잘 읽고 이해하는 것이 중요하다는 것을 새삼 느끼게 되었음... 해당 문제는 여러 로프가 있고 해당 로프가 버틸 수 있는 최대 중량이 있는데 예를 들어 아래 예시처럼 2개의 로프가 주어지며 해당 로프는 [10,15] 의 무게를 버틸 수 있는 최대 중량이 있다고 하자. 그렇다면 1개의 로프만 주어질 경우 가질 수 있는 최대 중량은 10보단 15가 더 크기에 15가 최대 중량이 될 테고 2개의 로프가 주어질 경우엔 10과 15가 모두 버틸 수 있는 중량인 10이 2개인 20이 결과 값이 될 테니까 1개의 로프인 10보다 2개의 로프의 값인 20이 더 크기에 20을 최대 중량으로 볼 수 있다. 위의 방법으로 해당 문제를 해결 import sys inp..

알고리즘 2023.08.29

[백준, 파이썬, 1764번] 듣보잡

풀이 파이썬의 집합의 특성을 활용하여 교집합인 intersection을 사용하여 풀이 여기서 처음에는 문자 하나하나에 rstrip() 메서드를 적용하는 것이 더 많은 시간이 사용될 것 같아 적용하지 않고 제출했는데 이후 적용 후 제출한 시간과의 차이가 어마어마한 것을 보고 역시 입력 값이 많으면 무조건 readline을 사용하긴 해야겠다라고 생각을 다시 하게 됨. import sys input = sys.stdin.readline n,m = map(int,input().split()) no_listen = set([input().rstrip('\n') for _ in range(n)]) no_show = set([input().rstrip('\n') for _ in range(m)]) result = s..

알고리즘 2023.08.29

[백준, 파이썬, 1026번] 보물

풀이 단순히 해결하기 위해선 a는 오름차순, b는 내림차순 정렬 후 첫 번째 코드와 같이 a와b의 인덱스 값을 곱한 값을 누적합 하면 되는 단순한 문제지만. 문제의 의도는 a만 정렬하고 b는 정렬하지 않는 것을 중점으로 두고 있기에 두 번째 코드와 같이 해결 b에 있는 가장 큰 값을 제거 하는 방식을 적용 cnt는 a는 오름차순 정렬을 했기에 순서대로 적용하기 위함. # 일반적으로 푸는 방식 import sys input = sys.stdin.readline n = int(input()) a = sorted(map(int,input().rstrip('\n').split())) b = sorted(map(int,input().rstrip('\n').split()),reverse=True) print(sum..

알고리즘 2023.08.29

[백준, 파이썬, 1931번] 회의실 배정

풀이 이런 회의실 배정과 같은 문제는 마치는 시간부터 접근하면 쉽게 해결할 수 있기에 정렬을 한 다음 풀기 정렬시 마치는 시간을 기준으로 정렬 한 뒤 같은 값이 있는 경우엔 시작 시간을 기준으로 한 번 더 정렬하여 해결 그래서 현재 result에 있는 시작시간 보다 현재 li의 마치는 시간이 작거나 같을 경우엔 새롭게 추가 아닐 경우엔 아래의 조건처럼 한번 더 조건 분기를 거친 다음 교체하여 해결 import sys input = sys.stdin.readline n = int(input()) li = sorted([list(map(int,input().rstrip('\n').split())) for _ in range(n)], key= lambda x: (x[1],x[0]), reverse=True) ..

알고리즘 2023.08.28

[백준, 파이썬, 11399번] ATM

풀이 우선 받은 값을 정렬한 다음 누적 합을 구하면 되는 문제가 됨 그래서 두 가지 방법을 생각 첫째. DP를 활용하여 이전 값을 더 한 값을 해당 배열에 넣고 최종적으로 합산하기. 둘째. 누적 합은 결국 계속해서 다음 값에 해당 값을 남은 수 만큼 더하기 때문에 해당 로직을 생각해서 풀기 첫 번째 방식 import sys input = sys.stdin.readline n = int(input()) result = 0 li = sorted(map(int,input().rstrip('\n').split())) for i in range(1,n): li[i] += li[i-1] print(sum(li)) 두 번째 방식 import sys input = sys.stdin.readline n = int(inp..

알고리즘 2023.08.28