목록알고리즘 & 코딩테스트 (73)
한 걸음씩 기록하며
⛏ 문제 파악 스택을 직접 간단하게 구현보는 문제 큰 어려움은 없지만 제한 시간이 짧은 문제이다. 👉🏻 답안 import sys N = int(sys.stdin.readline()) stack = [] for _ in range(N): x = sys.stdin.readline().split() if x[0] == "push": stack.append(x[1]) elif x[0] == "pop": if len(stack) != 0: print(stack.pop()) else : print(-1) elif x[0] == "size": print (len(stack)) elif x[0] == "empty": if len(stack) == 0: print(1) else: print(0) elif x[0] =..
[방금그곡] 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV, 라디오 등에서 나온 음악에 관해 제목 등의 정보를 제공하는 서비스이다. 네오는 자신이 기억한 멜로디를 가지고 방금그곡을 이용해 음악을 찾는다. 그런데 라디오 방송에서는 한 음악을 반복해서 재생할 때도 있어서 네오가 기억하고 있는 멜로디는 음악 끝부분과 처음 부분이 이어서 재생된 멜로디일 수도 있다. 반대로, 한 음악을 중간에 끊을 경우 원본 음악에는 네오가 기억한 멜로디가 들어있다 해도 그 곡이 네오가 들은 곡이 아닐 수도 있다. 그렇기 때문에 네오는 기억한 멜로디를 재생 시간과 제공된 악보를 직접 보면서 비교하려..
⛏ 문제 파악 두 개의 터렛의 좌표가 주어지고, 각 터렛에서 타깃과의 거리가 주어지고, 타깃이 위치할 수 있는 경우의 수를 출력하는 문제 타깃이 이을 수 있는 위치의 수를 구하라는 것은, 각 테럿의 좌표와 반지름을 가지고 원의 접점을 구하라는 뜻이다. 1) 이것을 위해서는 먼저 두 터렛 간의 거리가 필요한데, 이는 원의 방정식을 이용해서 구하면 된다. 원의 방정식은 다음과 같다. (피타고라스 정의) 2) 그리고 각 터렛의 좌표와 반지름, 두 터렛 간의 거리를 가지고, 원의 접점을 구하면 된다. (타깃과의 위치를 원의 반지름이라 생각하고 원을 그려서 접점을 구한다고 생각하면 된다.) 원의 접점을 구하는 경우의 수는 4가지이다. 아래 그림에서 각 터렛의 반지름을 r1, r2, r은 터렛 간의 거리이다. ..
⛏ 문제 파악 x지점부터 y지점까지 가는데 필요한 최소한의 이동 횟수를 구하는 문제 단순한 이동이 아니라 조건이 있다. 이전에 이동한 거리의 -1, 0, +1 을 하여 이동할 수 있다. (가속과 감속이 가능한 시스템) 그리고 y지점에 도착하기 바로 직전의 이동거리는 1이어야한다. (도착 직전에는 1이어야한다.) 이 조건대로 이동을 해보면 다음과 같다. 아래와 같이 기록하여 발견할 수 있는 법칙은 2가지이다. 👉🏻 답안 위의 법칙으로 문제를 풀면 다음과 같다. T = int(input()) for _ in range(T): x, y = map(int,input().split()) distance = y - x # 이동해야하는 거리 count = 0 # 이동한 횟수 movement = 1 # 최대 이동 가..
⛏ 문제 파악 주어진 수가 한자리 수면, 앞에 0을 붙여서 두 자리 수로 만들고, 십의 자리와 일의 자리 숫자를 더한다. 1) 기존 숫자의 일의 자리 숫자 2) 더한 값의 일의 자리 숫자 1)을 십의 자리로, 2)를 일의 자리로 한 새로운 숫자를 생성한다. 이러한 더하기 사이클을 반복하여 생성된 숫자가 처음 주어진 수와 동일하면 멈추고, 사이클이 몇번 진행됐는지 리턴한다. 👉🏻 답안 1) 문자열로 푸는 방법 문자열로 풀려고 했는데.. 이게 시간초과가 났습니다. 여러 도전을 해봤는데 실패하여 이 방법을 포기하고 연산하는 방법으로 진행했습니다. n = input() x = n count = 0 while True: if len(x) == 1: x = "0"+x sumX = str(int(x[0])+int(..
⛏ 문제 파악 M 이상 N 이하의 소수를 모두 출력하는 프로그램 일렬로 출력되어야한다. 👉🏻 답안 에라토스테네스의 체 그 자체인 코드 M , N = map(int, input().split()) sieve = [True] * (N + 1) sieve[0] = False sieve[1] = False for i in range(2, N + 1): if sieve[i]: for j in range(i + i, N + 1, i): sieve[j] = False for i in range(M, N + 1): if sieve[i]: print(i) 소수인지 판별하는 함수 만들어 바로 출력 M , N = map(int, input().split()) def isPrime(num): if num==1: retur..
⛏ 문제 파악 H층이고 W호실까지있는 호텔에 방 배정하는 문제 처음에 입력되는 값이 테스트 데이터이기에 그 숫자만큼 for문을 돌려야한다. n이 h의 배수일 경우와 아닐 경우를 나누어 작성해야한다. 👉🏻 답안 t = int(input()) for i in range(t): h, w, n = map(int, input().split(' ')) x = n // h + 1 y = n % h if n % h == 0: x = n // h y = h print(f'{y*100+x}') 📑 간단한 설명 x가 일반적이라면 // h+1을 해준다. 가령 15층짜리 호텔이라면 16번째 손님이 오면 102호를 주는 꼴이 된다. 그러나 x가 0이 된다면 // h를 해준다. 가령 15층 짜리 호텔에 15번째 손님이 오면,..
⛏ 문제 파악 주어지는 임의의 숫자 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수의 값을 구하는 문제 에라토스테네스의 체의 방법으로 문제를 풀면 된다. 제한 사항에서 n이 123,456까지 주어진다는 것을 생각하여 체를 만들면 된다. 👉🏻 답안 import math import sys def isPrime(n): if n == 1: return False else: for i in range(2, int(math.sqrt(n))+1): if n % i == 0: return False return True all_list = list(range(2, 246912)) prime_list = [] for i in all_list: if isPrime(i): prime_list.append(i) n..