목록Algorithm/Implementation (20)
우노
문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/42576 풀이 해당 문제는 아래 3가지 방법으로 해결할 수 있습니다. 해결책 1 : 두 배열을 정렬한 뒤, 루프를 통해 1:1 비교를 하고, 서로 다른 항목을 찾는 방법 해결책 2 : 해시를 사용하는 방법 해결책 3 : collections.Counter를 사용하는 방법 해당 포스트에선 “해결책 3”에 대한 설명을 다루고 있습니다. collections.Counter는 리스트에 존재하는 각 요소의 개수를 세주는 모듈입니다. 세부 설명은 아래 예제 코드와 같습니다. 코드 import collections def solution(participant, completion): # 1. Count..
문제 링크 https://www.acmicpc.net/problem/5430 풀이 R 함수 시, 정말 배열의 모든 원소를 뒤집는다면, 시간 초과가 발생합니다. RR -> 그대로이므로 뒤집을 필요가 없습니다. 따라서, 모든 함수에 등장한 R의 개수가 홀수일 경우에만, 모든 함수들을 처리한 뒤, 마지막으로 reverse를 수행하면 됩니다. 함수 중간에 D가 등장하는 경우에는, 현재까지 등장한 R의 개수에 따라, 배열의 모든 원소를 ‘유지’ 또는 ‘reverse’ 한다고 가정한 뒤, deque의 popleft 또는 pop을 사용해 원소를 삭제하면 됩니다. 추가 예외처리 빈 배열(n이 0인 경우)이 입력으로 들어올 수 있습니다. 하지만, 배열이 비어있어도 R 함수는 실행할 수 있습니다. 코드 import sys..
문제 링크 https://www.acmicpc.net/problem/1790 풀이 단순히 문자열을 이어붙이면 메모리초과가 발생합니다. 따라서, 각각의 자릿수에 해당하는 숫자의 개수와 각 숫자의 글자수를 활용해 문제를 해결할 수 있습니다. 1의 자리인 숫자는 9개이며, 각 숫자의 글자수는 1개입니다. 10의 자리인 숫자는 90개이며, 각 숫자의 글자수는 2개입니다. 100의 자리인 숫자는 900개이며, 각 숫자의 글자수는 3개입니다. 따라서, 원하는 자릿수 K가 200이라면 아래와 같은 방식으로 해당하는 문자를 추측할 수 있습니다. 우선, 200을 넘지 않는 선에서, 1의 자리숫자와 10의 자리숫자가 모두 사용되는 것을 알 수 있습니다. 1 x 9 + 90 x 2 = 189 200 - 189 = 11 이므..
문제 링크 https://www.acmicpc.net/problem/2615 풀이 모든 칸을 순서대로 확인하며, 4가지 방향(→ ↓ ↘ ↗)을 탐색합니다. 연속된 다섯 개의 바둑알 중 가장 왼쪽에 있는 바둑알의 좌표를 출력해야하기 때문입니다. 또한, 5칸 연속으로 바둑알이 놓여져있을 경우, 육목인 케이스를 걸러줘야합니다. 첫 바둑알을 놓은 방향 이전에 바둑알이 하나 더 있는지 확인 마지막 바둑알을 놓은 방향 이후에 바둑알이 하나 더 있는지 확인 코드 import sys # 바둑판 초기화 board = [] for i in range(19): board.append(list(map(int, sys.stdin.readline().split()))) # 연속된 다섯 개의 바둑알 중 가장 왼쪽에 있는 바둑알의 ..
문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/12909?language=python3 문제 설명 괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어, "()()" 또는 "(())()" 는 올바른 괄호입니다. ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다. '(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요. 제한사항 문자열 s의 길이 : 10..
문제 링크 https://www.acmicpc.net/problem/16719 풀이 정답을 출력할 배열을 만듭니다. 입력 문자열을 통해 아래 알고리즘을 진행합니다. 입력 문자열에서 가장 작은 알파벳을 선택합니다. 해당 알파벳을 정답 배열에 추가합니다. 정답 배열의 모든 알파벳들을 취합해 출력합니다. 해당 알파벳을 기준으로 뒷 문자열을 입력 문자열로 정해, 위 알고리즘을 반복합니다. 해당 알파벳을 기준으로 앞 문자열을 입력 문자열로 정해, 위 알고리즘을 반복합니다. 현재 알파벳을 기준으로 뒷 문자열부터 확인한 뒤, 앞 문자열을 확인하는 이유는, 현재 알파벳이 입력 문자열에서 가장 작은 알파벳이기 때문에, 현재 알파벳이 가장 앞에 와야 가장 작아지기 때문입니다. 세부 알고리즘은 아래 예제 코드와 같습니다. ..
문제 링크 https://www.acmicpc.net/problem/1913 풀이 외각의 크기에 따라, 가운데 좌표를 시작점으로 상하좌우로 이동하는 횟수를 일반화할 수 있습니다. 시작점을 기준으로, 진행순서는 상 → 우 → 하 → 좌 → 상이며, 진행횟수는 n에 따라, 상 n번, 우 n-2번, 하 n-1번, 좌 n-1번이 됩니다. 또한, 진행하고 있는 외각의 크기에 따라 시작점이 항상 (n//2, n//2) 이 될 수 있도록 n을 조절해야합니다. 예를 들어, n이 7로 주어진다면, 현재 진행하고 있는 외각이 변경됨에 따라 시작좌표를 (3, 3) → (2, 2) → (1, 1)로 변경해야합니다. 세부 알고리즘은 아래 코드와 같습니다. 코드 import sys # 자연수 N 입력 n = int(sys.std..
문제 링크 https://www.acmicpc.net/problem/1212 풀이 파이썬 내장함수를 사용하면 됩니다. 입력을 8진수로 변환한 뒤, bin()을 통해 2진수로 변환하고, 맨 앞의 '0b'를 제외한 나머지를 출력하면 됩니다. 추가적으로, 각 숫자가 8 이상인 입력은 들어오지 않습니다. 코드 import sys # 입력을 8진수로 변환 n = int(sys.stdin.readline().rstrip(), 8) # 8진수를 2진수로 변환한 뒤, 맨 앞의 '0b'를 제외한 나머지 출력 print(bin(n)[2:])
문제 링크 https://www.acmicpc.net/problem/21608 풀이 주어진 조건에 따라 순서대로 구현하면 되지만, 조건문에 따라 학생을 앉힐 수 있는 좌석을 비교하는 방법보단, 모든 비어있는 칸을 중심으로 인접한 칸들을 탐색하며, [좋아하는 학생의 수, 비어있는 칸의 개수, 중심 칸의 행 번호, 중심 칸의 열 번호]를 저장하고, 모든 칸을 탐색했을 때, 위 리스트에 대해, 좋아하는 학생의 수와 비어있는 칸의 개수는 내림차순으로 정렬하고, 중심 칸의 행 번호와 중심 칸의 열 번호는 오름차순 정렬한 뒤, 리스트의 가장 첫번째 요소의 행과 열 위치에 해당 학생을 앉히는 방법이 더 효율적입니다. 코드 import sys n = int(sys.stdin.readline()) # 자리 정보 seat..
문제 NxN 크기의 복도가 있다. 복도는 1x1 크기의 칸으로 나누어지며, 특정한 위치에는 선생님, 학생, 혹은 장애물이 위치할 수 있다. 현재 몇 명의 학생들은 수업시간에 몰래 복도로 빠져나왔는데, 복도로 빠져나온 학생들은 선생님의 감시에 들키지 않는 것이 목표이다. 각 선생님들은 자신의 위치에서 상, 하, 좌, 우 4가지 방향으로 감시를 진행한다. 단, 복도에 장애물이 위치한 경우, 선생님은 장애물 뒤편에 숨어 있는 학생들은 볼 수 없다. 또한 선생님은 상, 하, 좌, 우 4가지 방향에 대하여, 아무리 멀리 있더라도 장애물로 막히기 전까지의 학생들은 모두 볼 수 있다고 가정하자. 다음과 같이 3x3 크기의 복도의 정보가 주어진 상황을 확인해보자. 본 문제에서 위치 값을 나타낼 때는 (행,열)의 형태로..