알고리즘 (코딩테스트)

그리디 알고리즘

soultreemk 2024. 11. 7. 13:25


1. 백준 회의실배정

https://www.acmicpc.net/problem/1931

- 주어진 회의 일정들을 회의실 하나에서 최대한 많이 배정하는 것이 목표

- 주요 아이디어는 빨리 끝나는 회의를 먼저 선택하는 것

  • 빨리 끝나는 회의를 먼저 배정하면 남은 시간 동안 더 많은 회의를 배치할 수 있습니다.
  • 따라서 종료 시간이 빠른 회의부터 배정하면, 회의가 겹치지 않으면서 최대한 많은 회의를 배정할 수 있습니다.
import sys
input = sys.stdin.read

def max_meetings(meetings):
    # 종료 시간을 기준으로 오름차순 정렬 (종료 시간이 같으면 시작 시간 기준)
    meetings.sort(key=lambda x: (x[1], x[0]))
    
    count = 0
    last_end_time = 0  # 마지막으로 배정된 회의의 종료 시간
    
    for start, end in meetings:
        # 현재 회의의 시작 시간이 마지막 회의 종료 시간 이후인 경우에만 배정
        if start >= last_end_time:
            count += 1
            last_end_time = end  # 마지막 종료 시간 갱신
            
    return count

 

 

2. 백준 폴리오미노

https://www.acmicpc.net/problem/1343

 

X의 연속 개수 세기가 핵심.. X를 마주쳤을때, while문을 다시 돌려서 갯수 카운팅

def polynomio(board):
    result = ""
    i = 0
    n = len(board)
    
    while i < n:
        if board[i] == 'X':
            x_count = 0
            # 연속된 X 개수 세기
            while i < n and board[i] == 'X':
                x_count += 1
                i += 1
            
            # 홀수 개의 X가 있으면 -1 반환
            if x_count % 2 != 0:
                return -1

            # 짝수 개의 X 처리
            # 4의 배수는 AAAA로 채우고, 나머지는 BB로 채우기
            result += 'AAAA' * (x_count // 4) + 'BB' * ((x_count % 4) // 2)
        
        else:
            # X가 아닐 경우(즉, .일 경우) 그대로 추가
            result += board[i]
            i += 1
    
    return result

# 입력 예시
board = input().strip()
print(polynomio(board))