알고리즘 문제 풀기 61

SWEA 4861. 회문 - 파이썬

SWEA 4861 회문 🎮 문제 접근 방법 - N-M+1 만큼 돌면서 한줄씩 건너뛰며 가로에서 먼저 패턴을 찾고 없으면 세로에서 패턴을 찾는다. - 회문 1개만 찾으면 되니, 회문을 찾으면 BREAK 🎈 문자열을 뒤집는 4가지 방법 - 거꾸로 읽어오는 것 - swap해서 가져오는 것 - reverse 함수를 사용하는 것 - slicing 해서 거꾸로 가져오는것 이 문제는 뒤집진 않아도 되서 swap해서 값을 가져오진 않았지만, swap을 응요한 앞과 뒤를 비교하는 방법을 활용했습니다. 그리고 flag 말고도, for else 혹은 elif 를 활용해서 작성 가능합니다! T = int(input()) for tc in range(1, T+1): N, M = map(int, input().split()) a..

[백준 알고리즘] 1259. 펠린드롬 수_ 파이썬

🎮 문제 접근 방법 펠린드롬의 수란, 앞글자와 뒷글자를 차례대로 비교하면서 같은지 비교하는 것입니다. 그러므로 전체 길이 N에 2 나눈 몫만큼만 비교해주면 됩니다. 🎈 여기서 주의할 것은, 010은 해당 문제에서 펠린드롬의 수로 취급하지 않는다는 것입니다. 앞에 0은 정수형으로 봤을때 10이나 마찬가지이므로 무의미하다고 판별합니다. 그래서 저는 input 받을 때 int 정수형으로 바꿔 010이 10으로 들어오게 처리하였습니다. def pelindrome(num): N = len(num) for i in range(N//2): if num[i] != num[N-1-i]: return 'no' return 'yes' while True: num = int(input()) if num == 0: break ..

SWEA 4836. 색칠하기 2차원 배열(파이썬)

SWEA 4836 문제의 저작권은 SW Expert Academy에 있습니다 T = int(input()) for tc in range(1, T+1): N = int(input()) arr = [[0] * 10 for i in range(10)] for i in range(N): sketch = list(map(int, input().split())) for i in range(sketch[0], sketch[2]+1): for j in range(sketch[1], sketch[3]+1): arr[i][j] += sketch[4] count = 0 for i in range(10): for j in range(10): if arr[i][j] == 3: count += 1 print(f'#{tc} {co..

SWEA 4839. 이진탐색 알고리즘 - 파이썬

SWEA 문제 4839. 이진탐색 문제의 저작권은 SW Expert Academy에 있습니다. 🎈 이진탐색은 범위의 중간값과 비교하며 범위를 줄여나가는 탐색으로 for문을 돌면서 하나씩 찾는 것보다 훨씬 빠릅니다! 시간복잡도는 log N입니다. 다만, 이진탐색은 정렬이 되어 있어야 가능하단 것!! 정렬되지 않은 경우에는 정렬하는 시간+ 이진탐색 시간 이렇게 함께 생각해줘야 합니다! # 이진탐색 구현 함수 def binary_search(page, P): start = 1 end = page middle = 0 count = 1 while P != middle: middle = int((start + end) / 2) if middle > P: end = middle else: start = middle ..

정렬 알고리즘 (버블정렬, 카운팅 정렬, 선택정렬) - 파이썬 예시코드

버블정렬 인접한 숫자를 비교하여 큰 숫자를 뒤로 (혹은 앞으로) 보내는 정렬 arr = [3, 4, 1, 5, 1] #리스트 전체 for문 돌리는 횟수 for i in range(len(arr), 0, -1): # 도는 범위를 전체길이의 1씩 감수시키며 둘씩 비교 for j in range(1, i): if arr[j - 1] > arr[j]: arr[j - 1], arr[j] = arr[j], arr[j - 1] print(arr) 카운팅 정렬 카운트 배열을 만들어, 리스트 안에 존재하는 숫자를 카운트하고 이를 이용하여 정렬 K = 5 # 숫자범위 A = [0, 5, 1, 2, 4, 3, 2, 1] B = [0] * len(A) #카운팅 배열 만들기 cnt = [0] * (K + 1) # 리스트에 해당..

[백준 알고리즘] 8979. 올림픽 _ 파이썬

💻 문제 풀이의 2가지 방법 - 딕셔너리 사용 - 2차원 배열사용 문제에 답이 있다고, 문제 잘 읽으라는 소리를 초등학생부터 들어왔던 것 같은데.. 이 문제가 딱 문제에 해답? 힌트? 가 있는 문제였습니다. 6번째 줄에 자신보다 더 잘한 나라수 + 1 라고 되어있으니, 자신보다 더 잘한 나라수만 체크하면 되겠구나! 라는 아이디어를 문제를 통해 얻었습니다 그리고 조심해야할 부분이자, 처음에 제가 놓쳤던 부분이기도 한데요. - 동메달이 아무리 많아도 1000개가 있어도, 금메달이 1개 있으면 금메달을 가진 나라가 높은 순위라는 것입니다. 즉, 합산으로 풀 수 없고, 금메달부터 봐야 한다는 거죠 (물론, 메달수 의 총합이 1,000,000 이하로 정해져 있기 때문에 가중치를 두어 합산으로 푸는 경우도 있었습니..

[백준 알고리즘] 2847. 게임을 만든 동준이 _ 파이썬

💻 문제 풀이 접근 방법 1) 점수 리스트 만들고 2) for 문 돌려서 다음 숫자의 차이 만큼 감소 3) 계산하는 값 누적하기 🎈 여기서 실수하기 좋은데, 오름차순으로 for문을 돌리며 반례로 레벨 4, 4 5 6 4 가 있습니다. 이럴경우 6만 3으로 바꾸고 for문이 끝나게 되서 틀린 정답이 나옵니다. 그러므로 전체 값을 오름차순으로 만들경우 뒤에서부터 접근해야합니다!! 저도 처음에 이걸 간과했어요ㅠㅠ # 입력받아서 각 레벨별 점수 리스트 만들기 level = int(input()) scores = [0] * level for i in range(level): scores[i] = int(input()) # 점수 차이만큼 빼주고, cnt에 추가해서 세기 cnt = 0 for i in range(le..

[백준 알고리즘] 2804. 크로스워드 만들기 _ 파이썬

💻 문제 풀이 접근 방법 1) A와 B의 공유 글자를 A를 기준으로 찾고 글자와, A의 idx 저장 (공유 글자가 여럿인 경우 A에서 제일 먼저 등장하는 글자가 공유 글자이기 때문) 2) B에서의 공유 글자 위치를 찾고 3) 각각의 idx 값을 이용해 출력 A, B = input().split() # 공유글자 찾기 for i in range(len(A)): if A[i] in B: share = A[i] A_idx = i break # B에서의 공유 글자 위치 찾기 for i in range(len(B)): if B[i] == share: B_idx = i break result = ['.'] * len(A) for i in range(len(B)): result[A_idx] = B[i] if i == ..

[백준 알고리즘] 2953. 나는 요리사다 _ 파이썬

💻 문제풀이 접근 방법 1) 입력받으면서 총점 더하기 2) max, max_idx 값 구해서 출력 별로 어렵지 않은 문제라 금방 풀었지만, 처음 풀었을 때는 코드가 깔끔하게 잘 안 써진다ㅠㅠ 풀고 나서 코드 최적화를 해보면 굳이 적지 않아도 될 필요없는 코드가 보이곤 한다! 반복과 연습만이 길인듯 하다..ㅎㅎ max = 0 max_idx = 0 for i in range(1,6): s = sum(int(x) for x in input().split()) if max < s: max = s max_idx = i print(max_idx, max) www.acmicpc.net/problem/2953 2953번: 나는 요리사다 "나는 요리사다"는 다섯 참가자들이 서로의 요리 실력을 뽐내는 티비 프로이다. 각 ..

[백준 알고리즘] 2851. 슈퍼마리오 _ 파이썬

💻 문제 풀이 접근 방법 1. 합을 쌓아 가다가 2. 100이 넘었을 때 중단시키고 그 앞의 값과 비교 그런데 이렇게 풀었더니, 틀리게 되었습니다ㅠㅠ 바로 100 미만 일 경우를 고려해주지 않았기 때문입니다. 🎈 문제 풀 때 다양한 경우를 함께 고려해주는 것은 정말 기초이면서도 종종 놓치는 경우가 많다. => 문제 제출 전에 오류가 뜰만한 반례를 대입해보자! import sys scores = 0 for _ in range(10): score = int(sys.stdin.readline()) pre_scores = scores scores += score if scores >= 100: if abs(100-scores) > abs(100-pre_scores): scores = pre_scores brea..