알고리즘 66

[백준 baekjoon] 백준 21608번 상어 초등학교 by 파이썬(Python) : 구현

https://www.acmicpc.net/problem/21608 21608번: 상어 초등학교 상어 초등학교에는 교실이 하나 있고, 교실은 N×N 크기의 격자로 나타낼 수 있다. 학교에 다니는 학생의 수는 N2명이다. 오늘은 모든 학생의 자리를 정하는 날이다. 학생은 1번부터 N2번까지 번호 www.acmicpc.net 난이도 골드5 문제 설명 n*n크기의 교실에 n^2 명의 학생이 있다. 학생들을 일정한 조건에 따라 교실에 배치해야한다. 조건 비어있는 칸 중에서 좋아하는 학생이 인접한 칸에 가장 많은 칸으로 자리를 정한다. 1을 만족하는 칸이 여러 개이면, 인접한 칸 중에서 비어있는 칸이 가장 많은 칸으로 자리를 정한다. 2를 만족하는 칸도 여러 개인 경우에는 행의 번호가 가장 작은 칸으로, 그러한 ..

[구현] 알고리즘 - 구현 (Implementation)

구현 문제에 대한 알고리즘을 소스코드로 만드는 과정이 구현이다. 어떤 문제를 풀든 간에 소스코드를 작성하는 과정은 필수적이므로 구현 문제 유형은 모든 범위의 코딩 테스트 문제 유형을 포함하는 개념이다. 구형 유형의 문제는 풀이는 떠올리는 것은 쉽지만 그것을 소스코드로 옮기는 과정이 어려운 문제를 의미한다. 구현 유형 완전 탐색 : 모든 경우의 수를 주저 없이 다 계산하는 해결 방법 시뮬레이션 : 문제에서 제시한 알고리즘을 한 단계씩 차례로 직접 수행 구현 문제 풀이시 생각해야 될 점 메모리 제약 사항 채점 환경 접근 방법 파이썬의 경우 1초에 2*10^7(2000만번)의 연산을 수행한다. pypy3 지원시 사용하면 1초에 1억번의 연산을 수행할 수 있다. pypy3의 속도는 c/c++에 견줄만큼 빠르기 ..

알고리즘/개념 2023.07.24

[프로그래머스] 2022 KAKAO BLIND RECRUITMENT 파괴되지 않은 건물 by 파이썬 (Python) :누적합

https://school.programmers.co.kr/learn/courses/30/lessons/92344 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 2차원 배열에 두 좌표(r1,c1) (r2,c2)사이의 값을 type에 따라 감소 또는 회복 시켜야한다. type == 1 이면 degree만큼 감소한다. type == 2 이면 degree만큼 회복한다. 모두 마친 후 0 이상인 좌표의 갯수를 return해준다. 시간 복잡도는 O(1)로 해결해야 한다. 접근법 브루토 포스로 해결할 경우 시간 복잡도가 O(N*M*K)이므로 시간초과 발생..

[누적합] 알고리즘 - 누적합(Prefix Sum)

누적합 구간의 누적합을 구하는 문제이다. 배열의 각 원소까지의 누적 합을 미리 계산해 놓은 배열을 생성하는 기법이다. 장점 배열 특정가간의 합을 빠르게 계산할 수 있다. 이론 구간 합 알고리즘을 활용하려면 우선 누적 합 배열을 구해야 한다. 0번 인덱스에는 0을 저장하고 1번 인덱스 부터 배열을 담아야 한다. 누적 합 배열 arr를 구할 때 아래와 같이 구한다. // 1차원 배열 arr[i] = arr[i-1] + inputArr[i] // 2차원 배열 arr[i][j] = inputArr[i][j] + arr[i-1][j] + arr[i][j-1] + arr[i-1][j-1] 누적 합 배열 arr를 이용해 구간 합을 구하자고 할때에는 아래와 같이 구한다. // 1차원 배열 arr[end] - arr[s..

알고리즘/개념 2023.07.23

[프로그래머스] 2020 KAKAO BLIND RECRUITMENT 문자열 압축 by 파이썬(Python)

https://school.programmers.co.kr/learn/courses/30/lessons/60057 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr LV2 문제이해 문자를 일정 단위로 압축할 수 있다. 최대로 압축하는 한 경우의 문자열 길이를 찾아내기. 풀이법 파이썬의 리스트 슬라이싱을 활용해 문자열을 잘라내 압축 문자열을 만든다. 현재 문자열과 이전 문자열이 같다면 압축 성공 다른 경우에 한번도 압축이 되지않는다면 그대로 표시, 압축이 두번이상 되었다면 압축해서 표시해준다. arr에 현재 i만큼 자르면서 만든 압축 문자열의 길이를 저장한다...

[프로그래머스] 연속된 부분 수열의 합 by 파이썬 (python) Lv2

https://school.programmers.co.kr/learn/courses/30/lessons/178870 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr lv2 문제 이해 붙어 있는 수들의 합으로 k를 만들어야 한다. 답이 여러개인 경우 길이가 가장 짧은 수열을 찾아야 한다. 길이가 가장 짧은 수열이 여러개인 경우 앞쪽에 나오는 수열을 찾는다. 접근법 투포인터 알고리즘을 사용하여 합이 k 인 부분 수열을 찾는다. right가 오른쪽 끝까지 갈때 까지 반복문을 돌린다. 1. 합이 k와 같은 경우 - 해당 부분의 수열의 길이를 계산하고 가장 짧은 길..

[프로그래머스] 호텔 대실 LV2 by 파이썬 (python)

https://school.programmers.co.kr/learn/courses/30/lessons/155651 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 이해 1. 최소한의 객실만을 사용하여 예약손님 받기 2. 퇴실 기준 10분이후에 다음 손님 사용 가능 3. 00:00 ~ 23:59 접근법 1. heapq를 사용하여 객실의 끝나는 시간을 저장하기 2. 가장 빨리 끝나는 시간과 다음 이용자의 시작 시간을 비교 3. 다음 이용자의 시작시간이 더 느리다면 같은 객실을 이용 가능한 것 => heappop으로 앞의 시간 제거 4. 마지막에 heap..

[baekjoon] 백준 9465번 : 스티커 (by python 파이썬)

https://www.acmicpc.net/problem/9465 9465번: 스티커 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의 www.acmicpc.net 정답 code #스티커 import sys input = sys.stdin.readline t = int(input()) for _ in range(t): case = [] n = int(input()) for i in range(2): case.append(list(map(int,input().split()))) for j in range(1,n): if j == 1: case[0][..

[baekjoon] 백준 2638번 : 치즈 (by python 파이썬) bfs

https://www.acmicpc.net/problem/2638 2638번: 치즈 첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로 www.acmicpc.net 정답 code # 치즈 import sys input = sys.stdin.readline from collections import deque dx = [-1,1,0,0] dy = [0,0,-1,1] # bfs로 외부 공기를 탐색하며 외부공기와 접촉시마다 +1 카운트해줌 def bfs(): queue = deque() #맨 가장자리에는 치즈가 안놓이는 외부공기 queue.append..

[baekjoon] 백준 2407번 : 조합 (by python 파이썬) 수학 조합

https://www.acmicpc.net/problem/2407 2407번: 조합 n과 m이 주어진다. (5 ≤ n ≤ 100, 5 ≤ m ≤ 100, m ≤ n) www.acmicpc.net 정답 code # 조합 import math # nCm = n! / (n-m)! *m! n,m = map(int,input().split()) top = math.factorial(n) bottom = (math.factorial(n-m)) * (math.factorial(m)) print(top//bottom) solution math모듈에 factorial 함수를 이용하여 쉽게 구현 하였다. nCm = n! / (n-m)! * m!를 위아래로 나눠 계산후 출력해주면 된다.