본문 바로가기

코딩테스트26

[코딩테스트] 파이썬 프린트 이 문제는 Deque를 사용하여 순차적으로 비교하여 순서를 찾아내면 되는 문제! from collections import deque def solution(priorities, location): answer = 0 # deque 구조 만들기 myDeque = deque([v,i] for i ,v in enumerate(priorities)) idx = 0 while myDeque: idx += 1 firstData = myDeque.popleft() # myDeque 데이터가 존재하고, 먼저 가져온 가장 높은 데이터가 가져온 데이터보다 크다면 if myDeque and max(myDeque)[0] > firstData[0]: # 가져온 데이터를 뒤에추가하기 myDeque.append(firstData.. 2022. 4. 30.
[코딩테스트] 회의실 배정 (그리디) 현재 가장 좋은게 무엇인지 선택하는 알고리즘 보통의 그리디 문제는 정렬이다. 순서대로 찾아야한다 문제 한 개의 회의실이 있는데 이를 사용하고자 하는 n개의 회의들에 대하여 회의실 사용표를 만들려고 한다. 각 회의에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 최대수의 회의를 찾아라. 단, 회의는 한번 시작하면 멈출 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다 그리디 알고리즘 문제는 정렬을 만들어 내면 된다 입력예제 5 1 4 2 3 3 5 4 6 5 7 다음과 같이 입력예제가 주어졌을때 끝에 번호로 정렬을 하는게 이 문제의 핵심이다 왜냐하면 아무리 일찍 시작해도 끝나는 시간이 오래 걸리면 효율적인 순서대로 진행될 수 없다 n.. 2022. 4. 12.
[Python] 완주하지 못한 선수 HashMap HASH를 처음 사용해서 찍어가면서 문제를 풀었다 문제를 풀때 해시 테이블 개념을 사용했는데 만드는 방법은 간단하다 #딕셔너리 생성 dic = {} kk = ["abc", "edf"] dic[hash(kk)] = kk 이런식으로 값을 넣어주면 dic[hash(kk)] 에 "abc", "edf" 에 대한 아스키 값이 들어가게 된다 이 방법을 사용해서 문제를 풀었다 코드와 결과를 보면 쉽게 이해할 수 있다 participant = list(input().split()) completion = list(input().split()) tmp = 0 dic = {} for p in participant: dic[hash(p)] = p print("hash (p) = " + str(hash(p))) print("d.. 2022. 3. 25.
[코딩 테스트] 마구간 정하기 (결정 알고리즘) 파이썬 마구간 정하기 (결정 알고리즘) 파이썬 N개의 마구간이 수직선상에 있습니다. 각 마구간은 x1, x2, x3 .... 개의 좌표를 가지며, 마구간간에 좌표가 중복되는 일은 없다 현재 C마리의 말을 가지고 있는데, 이 말들이 서로 가까이 있는 것을 좋아하지 않는다 각 마구간에는 한 마리의 말만 넣을 수 있고, 가장 가까운 말의 거리가 최대가 되게 말을 마구간에 배치하고 싶다 C마리의 말을 N개의 마구간에 배치했을 때 가장 가까운 두 말의 거리가 최대가 되는 그 최대 값을 출력하는 프로그램 결정 알고리즘의 핵심은 시작과 끝을 정하여 최적의 답을 구하는 것이다 이 문제에서 최적에 값을 구하기 위해서는 시작값과 끝값을 더해서 2로 나눈 뒤 중간값으로 설정한 뒤 앞 뒤로 최적의 값을 구해나가면 된다 n, c = .. 2022. 2. 22.
[코딩 테스트] 헨드폰 번호 가리기 파이썬 문제 설명 프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요. 제한 조건 s는 길이 4 이상, 20이하인 문자열입니다. def solution(phone_number): num = len(phone_number) back = phone_number[-4:] return "*"*(num-4) + back 헨드폰 정보를 받아 앞 번호는 * 로 뒤 번호는 숫자로 처리하면 되는 문제 슬라이스를 사용하여 뒤에 4자리를 back에 넣어 문제를 해결 2022. 2. 18.
[코딩 테스트] 뮤직비디오 (결정알고리즘) 파이썬 뮤직비디오 (결정알고리즘) 오랜지레코드에서는 유명 가수의 라이브 동영상을 DVD로 만들어 판매하려 한다 DVD에는 총 N개의 곡이 들어가는데, DVD에 녹화할 때에는 라이브에서의 순서가 그대로 유지 되어야 한다. 순서가 바뀌는 것을 유명 가수가 매우 싫어한다 즉 1번 노래와 5번 노래를 같은 DVD에 녹화하기 위해서는 1번과 5번 사이의 모든 노래도 같은 DVD에 녹화해야한다 오랜지레코드 입장에서는 이 DVD가 팔릴 것인지 확신할 수 없기 때문에 이 사업에 낭비되는 DVD를 가급적 줄이려고 한다 고민 끝에 오랜지레코드는 M개의 DVD에 모든 동영상을 녹화하기로 했다 이 때 DVD의 크기를 최소화 하려고한다 그리고 M개의 DVD는 모두 같은 크기여야 제조원가가 적게 들기 때문에 꼭 같은 크기로 해야한다 아.. 2022. 2. 17.
[코딩 테스트] 랜선 자르기 (결정 알고리즘) 파이썬 랜선자르기(결정알고리즘) 결정 알고리즘을 사용하는 문제에서는 어떠한 수가 특정 값이 있다는것을 가정으로 기준 값을 설정해서 범위를 나눈 뒤 특정 값을 도출하는 과정을 갖는다 대표적인 문제인 랜선자르기 문제이다 K개의 랜선은 길이가 제각각이다. 어떤사람이 랜선을 모두 N개의 같은 길이의 랜선으로 만들고 싶었기 때문에 K개의 랜선을 잘라서 만들어야 한다 예를 들어 300cm 짜리 랜선에서 140cm 짜리 랜선을 두 개 잘라내면 20cm는 버려야 한다 (이미 자른 랜선은 붙일 수 없다.) 편의를 위해 랜선을 자를때 손실되는 길이는 없다고 가정하며, 기존의 K개의 랜선으로 N개의 랜선을 만들 수 없는 경우는 없다고 가정한다 자를 때는 센티미터 단위로 정수 길이만큼 자른다고 가정한다 이때 만들 수 있는 최대 랜선.. 2022. 2. 16.
[코딩 테스트]이분검색 파이썬 임의의 N개의 숫자가 입력으로 주어진다 N개의 수를 오름차순으로 정렬한 다음 N개의 수중 한 개의 수인 M이 주어지면 이분검색으로 M이 정렬된 상태에서 몇 번째에 있는지 구하는 프로그램을 작성하시오 아이디어 정렬된 값을 반으로 나누어 같은 값을 찾아낸다 맨 처음과 끝을 기준으로 한 개씩 비교하여 값을 찾아낸다 n,m = map(int, input().split()) a = list(map(int, input().split())) a.sort() 값을 받아온 후 오름차순 정렬한다 입력 예제 8 32 23 25 32 65 12 43 67 99 lt = 0 rt = n-1 맨처음과 끝 번호를 기준으로 삼는다 맨 끝값은 문자열이기 때문에 n-1이다 while lt m: rt = mid-1 else : lt = .. 2022. 2. 16.
[코딩 테스트] 3진법 뒤집기 문제 설명 자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요. 제한사항 n은 1 이상 100,000,000 이하인 자연수입니다. def solution(n): answer = '' while n > 0: n, re = divmod(n,3) answer += str(re) return int(answer, 3) 3진법 문제는 자주 나오는 유형이니 알아두는것이 좋다 진법 문제는 메커니즘을 정확히 알아야한다 45라는 값이 들어오면 3진법으로 1200으로 간단하게 45를 3으로 나누어서 나머지를 반대로 해주면 값이된다 즉 while 문을 돌려서 n이 0보다 작아 질 때까지 돌린다 div함수를 이용.. 2022. 2. 10.
[코딩 테스트] 직사각형 별찍기 직사각형 별찍기 문제 설명 이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요. 제한 조건 n과 m은 각각 1000 이하인 자연수입니다. a, b = map(int, input().split(' ')) for i in range(b) : for j in range(a) : print('*', end ='') print() 직사각형으로 별을 찍으면 완성되는 간단한 문제 먼저 값을 받는 변수를 설정한다 만약 값이 5 3 이렇게 들어온다면 0 - 0,1,2,3,4 / 1 - 0,1,2,3,4 / 2 - 0,1,2,3,4 이런 형식으로 진행될 것이다 2022. 2. 10.
[코딩 테스트] 격자판 회문수 격자판 회문수 1부터 9까지의 자연수로 채워진 7x7 격자판이 주어지면 격자판 위에서 가로 방향으로 또는 세로방향으로 길이 5자리 회문수가 몇 개 있는지 구하는 프로그램 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 for k in range(2): if board[i+k][j] != board[i+5-k-1][j]: break else : cnt += 1 첫 번째로 배열을 받을 수 있는 2중 배열을 만든다 일단 가로로 회문하는 수가 있는지 확인해야한다 j는 행 i는 열을 슬라.. 2022. 2. 8.
[코딩 테스트] 스도쿠 파이썬 스도쿠 매우 간단한 숫자 퍼즐 스도쿠를 구현하는 문제 9 X 9 크기의 보드가 있을 때, 각 행과 각 열, 그리고 9개의 3 X 3 크기의 보드에 1부터 9까지의 숫자가 중복 없이 나타나도록 보드를 채우면 된다 def check(a): for i in range(9): ch1=[0]*10 ch2=[0]*10 for j in range(9): ch1[a[i][j]]=1 [ ch2[a[j][i]]=1 if sum(ch1)!= 9 or sum(ch2) != 9: return False for i in range(3): for j in range(3): ch3=[0]*10 for k in range(3): for s in range(3): ch3[a[i*3+k][j*3+s]]=1 if sum(ch3) != 9:.. 2022. 2. 7.
[코딩 테스트]곳감 (모래시계) 파이썬 N*N 격자판으로 이루어져 있는 마당이 있다 해의 위치에 따라 특정위치의 감은 잘 마르지 않습니다. 그래서 회전시켜 위치를 변경해서 모든 감이 잘 마르게 해야함 만약 회전명령 정보가 2 0 3이면 2번째 행을 왼쪽으로 3만큼 회전시키는 명령 첫번째 수는 행 번호, 두 번째 수는 방향 0이면 왼쪽, 1이면 오른쪽, 세 번째 수는 회전하는 격자의 수 n = int(input()) a = [list(map(int, input().split())) for _ in range(n)] m = int(input()) for i in range(m) : h , t , k = map(int, input().split()) if t == 0: for _ in range(k): a[h-1].append(a[h-1].pop(.. 2022. 2. 4.
[코딩 테스트] 다이아몬드 합 구하기 N*N 으로 이루어져있는 격자판이 있다 N의 크기는 항상 홀수이다 다이아몬드 모양으로 합을 구할 예정 n = int(input()) a = [list(map(int, input().split())) for _ in range(n)] res = 0 s=e=n//2 for i in range(n): for j in range(s, e+1): res+=a[i][j] if i 2022. 2. 4.
[코딩 테스트] 격자판 최대합 파이썬 N*N의 격자판이 주어지면 각 행의합, 각 열의 합, 두 대각선의 합 중 가장 큰 합을 출력하시오 n = int(input()) a = [list(map(int, input().split())) for _ in range(n)] largest = -2147000000 for i in range(n): sum1=sum2=0 for j in range(n): sum1 += a[i][j] sum2 += a[j][i] if sum1>largest: largest =sum1 if sum2>largest: largest =sum2 sum1 = sum2 = 0 for i in range(n): sum1 += a[i][i] sum2 += a[i][n-i-1] if sum1>largest: largest =sum1 if.. 2022. 2. 4.
[코딩 테스트] 수의 합 구하기 파이썬 수의 합 구하기 파이썬 N개의 수로 된 수열 A[1], A[2], a[N] 이 있다 이 수열의 i 번째 수부터 j번째 수까지의 합 A[i] + a[i+1] + + a[j]가 M이 되는 경우의 수를 구하는 프로그램을 작성하시오 입력예제 8 3 1 2 1 3 1 1 1 2 출력예제 5 m, n = map(int, input().split()) a= list(map(int, input().split())) lt = 0 rt = 1 tot = a[0] cnt = 0 while True : if tot < n: if rt < m : tot += a[rt] rt += 1 else : break elif tot == n: cnt+=1 tot-=a[lt] lt+=1 else : tot -= a[lt] lt+=1 pri.. 2022. 2. 4.
[코딩 테스트] 프로그래머스 정수 제곱근 판별 n = int(input()) for i in range(2 , n): if n % (i*i) == 0: res = i print(res) result = (res+1)*(res+1) break else : result = -1 print(result) 2022. 2. 4.
[코딩 테스트] 프로그래머스 완주하지 못한 선수 파이썬 문제 설명 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요. 제한사항 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다. completion의 길이는 participant의 길이보다 1 작습니다. 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다. 참가자 중에는 동명이인이 있을 수 있습니다. 입출력 예participantcompletionreturn입출력 예 설명 예제 #1 ".. 2022. 1. 31.
[코딩 테스트] 프로그래머스 내적 파이썬 문제 설명 길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요. 이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이) 제한사항 a, b의 길이는 1 이상 1,000 이하입니다. a, b의 모든 수는 -1,000 이상 1,000 이하입니다. 입출력 예 설명 입출력 예 #1 a와 b의 내적은 1*(-3) + 2*(-1) + 3*0 + 4*2 = 3 입니다. 입출력 예 #2 a와 b의 내적은 (-1)*1 + 0*0 + 1*(-1) = -2 입니다. def solution(a, b): result = 0 for i in range(len(a.. 2022. 1. 31.
[코딩 테스트] 오름차순 된 리스트 합치기 오름차순 된 리스트 합치기 오름 착순 정렬된 리스트를 합치면 된다 변수 p1, p2를 만들어서 값의 크기를 비교하여 각 리스트의 값을 순차적으로 넣어준다 a = int(input()) n = list(map(int, input().split()) b = int(input()) m = list(map(int, input().split()) p1 = p2 = 0 c=[] while p1 2022. 1. 30.
[코딩 테스트] 무작위 카드 셔플 무작위 카드 셔플하기 무작위 셔플을 하기 전 0~20까지의 값이 들어간 20개의 리스트를 생성한다 각 인덱스에 값으로 셔플할 숫자를 결정한다 a = list(rnage(21)) 값을 순서대로 입력을 받아서 s,e변수에 넣어준다 for 문을 돌려서 셔플은 해준다 이때 0번째 인덱스에 들어간 숫자로 5~10까지의 숫자를 셔플 해줘야 하니 (10-5+1)//2를 범위로 for문을 돌린다 a = list(ragne(21)) #[0,1,2,3,~20] for _ in range(10) : s,e = map(int, input().split()) for i in range((e-s+1)//2) : a[s+i], a[e-i] = a[e-i], a[s+i] for x in a: print(x, end=' ') for .. 2022. 1. 30.