Study/Algorithm
[백준] 2578번 : 빙고 (Python)
문제 코드 코드는 다음과 같은 방식으로 구현했다. 일단 철수의 빙고판은 2차원 배열로 받고, 사회자가 부르는 숫자는 하나의 리스트로 받았다. 1. 사회자가 숫자를 하나씩 부르며 그 숫자와 일치하는 빙고판의 숫자는 0으로 변환함과 동시에 빙고인지 확인한다. 2. 일치하는 숫자의 위치를 기반으로 빙고를 체크한다. 가로와 세로는 항상 체크하며 일치하는 숫자의 위치가 대각선이라면 대각선 방향으로도 빙고를 확인한다. 3. 빙고가 3개 이상이라면 지금까지 부른 숫자의 갯수를 출력한다. import sys board = [] count = 0 bingo = 0 # Make bingo board (2D-metrix) for i in range(5): board.append(list(map(int, sys.stdin.r..
[백준] 1655번 : 가운데를 말해요 (Python)
문제는 간단하다. 숫자를 하나씩 받고 지금까지의 숫자들 중에서 중앙값을 답하면 된다. (단, 짝수의 경우 두 수 중에서 작은 값을 답해야 한다) 처음에는 정말 간단하게, sort()를 통해서 중앙값을 답하였으나, 역시나 시간 초과. 이를 해결하기 위해서는, 매번 중앙값을 찾기 위해서 sort()하는 과정을 생략해야 한다. 해결과정은 다음과 같다. 숫자 리스트를 두 가지로 나누어서 생각한다. 왼쪽에는 작은 값들이, 오른쪽에는 큰 값들이 들어간다. 왼쪽의 리스트에서 가장 큰 값은 중앙값이다. 위의 조건이 만족하도록 숫자를 입력한다. 숫자는 왼쪽, 오른쪽 번갈아가며 채우며, 왼쪽에 오른쪽보다 큰 숫자가 들어가는 경우 두 숫자를 교환한다. 즉, 왼쪽의 가장 큰 값과 오른쪽의 가장 작은 값을 비교한다. 이를 위해..
[프로그래머스] 가장 큰 수 (Python)
정수 리스트에서 조합 가능한 가장 큰 수를 찾는 문제. 처음에는 직관적으로 가능한 조합을 모두 찾은 뒤 그중에서 가장 큰 수를 출력해봤다. import itertools def solution(numbers): answer = [] number_list = list(itertools.permutations(numbers, len(numbers))) for number in number_list: answer.append("".join(map(str,number))) return max(answer) 당연하게도 순열로 가능한 조합을 만드는 과정이 시간이 많이 걸려서, 시간 초과로 fail. 다음으로 생각한 방법은 숫자의 앞자리를 기준으로 내림차순으로 숫자를 정렬하기. def solution(numbers)..
[프로그래머스] 주식가격 (Python)
처음에는 단순하게, 시간이라는 배열을 만들어서 가격들에게 각 시점마다 현재 시점의 가격과 비교해서 떨어지지 않을때마다 1초라는 값을 추가 해줬다. 추가로 한번 떨어진 것은 flag를 통해 다시 비교하지 않도록 만들었다. def solution(prices): answer = [0] * len(prices) flag = [0] * len(prices) for time, price in enumerate(prices): if time == len(prices)-1: break for i in range(time+1): if prices[i] prices[j]: break else: cnt += 1 answer.append(cnt) return answer
[백준] 9663번 : N-Queen (Python)
코드의 구현 자체는 간단하다. DFS를 돌면서, 조건에 맞도록 구현하면 된다. 발목을 잡았던 부분은 바로 시간초과였다. 15 * 15의 경우 상당한 연산 시간이 필요하기 때문으로 보인다. 이미 이전의 퀸들이 있는 곳은 제외하고 넘어가도록 해야 최대한 시간을 아껴야 통과할 수 있다. 결국 PyPy3에서는 성공했지만, Python3에서는 여전히 시간초과가 발생했다. Python3에서도 성공하려면 뭔가 다른 방법이 필요할 것으로 보이지만, 시간이 아까우니 패스. import sys N = int(sys.stdin.readline()) row = [0] * N cnt = 0 visit = [False] * N # Queen이 서로 공격할 수 없는 지 확인 def check(q): for i in range(q)..
[백준] 5430번: AC (Python)
문제는 어렵지 않으나, 입출력을 약간 번거로운 편인 문제. import sys from collections import deque for test_case in range(int(sys.stdin.readline())): error = False command_list = sys.stdin.readline().strip() num_cnt = int(sys.stdin.readline()) num_list = deque(sys.stdin.readline().strip()[1:-1].split(",")) if num_cnt == 0: num_list = deque() for command in command_list: if command == "R": num_list.reverse() else: if num..
[백준] 10828번: 스택 (Python)
풀이 import sys cnt = int(sys.stdin.readline()) stack = [] for i in range(cnt): command = sys.stdin.readline().split() if command[0] == "push": stack.append(command[1]) elif command[0] == "pop": if len(stack): print(stack.pop()) else: print(-1) elif command[0] == "size": print(len(stack)) elif command[0] == "empty": if len(stack): print(0) else: print(1) elif command[0] == "top": if len(stack): pr..
[백준] 1920번: 수 찾기, 10815번: 숫자 카드 (Python)
풀이 import sys from collections import Counter N = int(sys.stdin.readline()) N_list = list(map(int, sys.stdin.readline().split(' '))) M = int(sys.stdin.readline()) M_list = list(map(int, sys.stdin.readline().split(' '))) N_cnt = Counter(N_list) for num in M_list: if N_cnt[num]: print(1) else: print(0) split( )으로 input을 받아주는게 포인트 나는 몇개인지 출력하는지 알고 Counter를 사용했다. 단순히 중복 여부라면 더 가벼운 코드로 구현하지만... 통과했으니..