자료구조와 알고리즘/개인적인 코딩테스트 관련 풀이 60

[이분탐색(결정알고리즘)][그리디 알고리즘] - 랜선 자르기(결정 알고리즘)

해당 알고리즘의 경우엔 답이 쉽게 보이며 이를 범위를 줄여가며 해당 답을 찾는 문제가 대다수이다. 문제 k개의 랜선들을 n개의 랜선으로 잘라야한다. n개보다 많이 만드는 경우는 n개를 만드는 경우에 포함된다. 이때 해당 n개의 개수만큼 만들 수 있는 최대 랜선의 길이를 구하라 문제 풀이 - 1 #랜선자르기(결정 알고리즘) k, n = map(int,input().split()) a = [int(input()) for _ in range(k)] lt = 1 rt = max(a) res = 0 while lt = n: res = mid lt = mid + 1 else: rt = mid -1 print(res) 이 경우 최대 값이 입력값의 최대수로 두면 된다. s의 경우엔 해당 값을 mid가 바뀔때마다 사용해..

[이분탐색(결정알고리즘)][그리디 알고리즘] - 이분 검색

문제 N개의 수를 오름차순하여 M값이 몇번째에 존재하는지 출력하라 단 중복값은 존재하지 않는다. 문제 풀이 - 1 n, m = map(int,input().split()) a = list(map(int,input().split())) a.sort() num = a.index(m) print(num+1) 정렬한 값을 index()를 사용해서 해당 인덱스를 가져오고 0부터 시작하지만 우리는 1부터 시작한다는 가정하에 문제를 진행하기에 +1 해준다. 문제 풀이 - 2 #이분탐색으로 문제 풀이 n, m = map(int,input().split()) a = list(map(int,input().split())) a.sort() lt = 0 rt = n-1 while lt m: rt = mid-1 else: lt..

[탐색][시뮬레이션] - 격자판 회문수(2차원 List)

문제 7X7 판에 있는 숫자들 중 5개의 숫자가 회문인지를 검사하라 이때 가로 5 세로 5만 허용한다. (꺾이면 안 됨) 문제 풀이 import sys #sys.stdin = open("input.txt","r") board = [list(map(int,input().split())) for _ in range(7)] cnt = 0 for i in range(3): for j in range(7): tmp = board[j][i:i+5] if tmp == tmp[::-1]: cnt +=1 #7X7에서 5글자만 비교하면 되기에 앞뒤로 2번만 확인해주면 됨(가운데는 어차피 다 같음) #세로의 경우엔 슬라이스 기능 사용 불가! for k in range(2): if board[i+k][j] != board[i..

[탐색][시뮬레이션] - 스토쿠(2차원 List)

문제 9X9 스토쿠가 정확하게 풀어졌는지를 확인하면 되는 문제이다. 스토쿠가 정확하게 풀어졌는지를 확인하기 위해서는 행, 렬, 3X3 부분을 확인해 겹치는 숫자를 사용하지 않았는지를 확인해주면 된다. 문제 풀이 import sys sys.stdin = open("input.txt", "r") def check(sudoku): for i in range(9): ch1 = [0]*10 ch2 = [0]*10 for j in range(9): ch1[sudoku[i][j]] = 1 ch2[sudoku[j][i]] = 1 if sum(ch1) != 9 or sum(ch2) != 9: return False #3X3 확인을 위한 i,j로 큰 범위 설정 for i in range(3): for j in range(..

[탐색][시뮬레이션] - 봉우리(2차원 List)

문제 주어진 2차원 리스트에서 현재 값의 상하좌우를 비교해 현재 값이 가장 큰 경우 봉오리라고 한다. 해당 2차원 리스트에 봉오리의 총갯수를 구하라 이때 2차원 리스트의 가장자리는 0이라고 한다. 문제 풀이 #봉우리 import sys #sys.stdin = open("input.txt", "r") n = int(input()) a = [list(map(int,input().split())) for _ in range(n)] a.insert(0, [0]*n) a.append([0]*n) for i in a: i.insert(0, 0) i.append(0) cnt = 0 dx = [-1,1,0,0] dy = [0,0,-1,1] for i in range(1,n+1): for j in range(1, n+1..

[탐색][시뮬레이션] - 곶감(2차원 List)

문제 주어진 2차원 리스트를 정해진 룰에 따라 회전한 뒤 모래시계 모양으로 출력하라 a, b, c = 행 정보, 0이면 왼쪽 1이면 오른쪽으로 회전, 횟수(3면 3만큼 회전) 문제 풀이 import sys sys.stdin=open("input.txt", "r") n = int(input()) gotgam = [list(map(int,input().split())) for _ in range(n)] m = int(input()) for _ in range(m): a,b,c = map(int,input().split()) if b == 0: #왼쪽으로 돌 경우 #맨 앞의 숫자를 빼서 맨 뒤로 돌려 보내주는 작업을 c번 해야 한다. for _ in range(c): gotgam[a-1].append(gotg..

[탐색][시뮬레이션] - 사과나무(2차원 List)

문제 N(홀수) X N의 사과나무 대지가 주어질 때 빨간 부분만 수확한다고 한다면 총 몇개의 사과를 수확할 수 있는지 출력해라 문제 풀이 import sys sys.stdin = open("input.txt", "r") n = int(input()) apple = [list(map(int,input().split())) for _ in range(n)] s = e = n//2 result = 0 for i in range(n): #start부분에서 end부분까지만 돌게 j 범위를 설정한다. for j in range(s,e+1): result += apple[i][j] if i < n//2: s -= 1 e += 1 else: s += 1 e -= 1 print(result) 1 ~ n//2 지점까지는 ..

[탐색][시뮬레이션] - 격자판 최대합(2차원 List)

문제 주어진 N X N 리스트에서 행, 렬, 두 개의 대각선의 합 중에 가장 큰 값을 출력하라 문제풀이 import sys #sys.stdin = open("input.txt", "r") #격자판 최대합 n = int(input()) a = [list(map(int,input().split())) for _ in range(n)] sum1 = sum2 = sum3 = sum4 = 0 largest = -2147000000 # 행, 렬의 최대합 for i in range(n): #0,0 ~ 0,n까지 확인이 끝나면 sum1, sum2 다시 초기화 sum1 = sum2 = 0 for j in range(n): sum1 += a[i][j] sum2 += a[j][i] #매번 행 확인이 끝날 때 max값을 확인..

[탐색][시뮬레이션] - 수들의 합(List)

문제 주어진 n개의 수들의 합이 m값이 되는 경우가 몇개인지를 출력해라 문제 풀이 import sys #sys.stdin = open("input.txt", "r") #수들의 합 n,m = map(int,input().split()) a = list(map(int,input().split())) cnt = 0 left = 0 right = 1 total = a[0] while True: if total < m: if right < n: total += a[right] right += 1 else: break elif total == m: cnt += 1 total -= a[left] left += 1 else: total -= a[left] left += 1 print(cnt) list를 두 개의 2 p..

[탐색][시뮬레이션] - 카드 역배치(List)

문제 1부터 20까지의 카드를 정해진 구간이 주어지면 그에 맞게 역순으로 정렬한 뒤 10번의 정렬이 끝난 card 배치를 출력하라 문제 풀이 import sys sys.stdin = open("input.txt", "r") card = list(range(21)) # 1 ~ 20까지 초기화 for _ in range(10): a, b = map(int,input().split()) x =(b-a+1)//2 for i in range(x): card[a+i], card[b-i] = card[b-i], card[a+i] for j in card[1::]: print(j, end =" ") index를 이용해서 값을 하나씩 저장하고 접근하기 위해서 0부터 저장을 했다. 이는 출력 시에 pop을 사용해 빼버리는..