Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

:)

[백준] 오리, [백준] 달력 본문

Algorithm(python)

[백준] 오리, [백준] 달력

mihee 2022. 9. 28. 15:10

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

 

12933번: 오리

첫째 줄에 영선이가 녹음한 소리가 주어진다. 소리의 길이는 5보다 크거나 같고, 2500보다 작거나 같은 자연수이고, 'q','u','a','c','k'로만 이루어져 있다.

www.acmicpc.net

 

구현

1. 'quack' dict 선언. 문자열 탐색, 이전 소리가 있는지 check

2. 'q' 일때 count +1, 'k' 일때 concurrent -1

 

import sys

q_list = sys.stdin.readline()

def solution(q_list):
    quack = {x:0 for x in q_list}
    prev_quack = {x:y for x,y in zip('uack','quac')}
    
    concurrent = 0
    answer = 0
    
    for q in q_list:
        quack[q] +=1
        if q == 'q':
            concurrent +=1
            answer = max(answer, concurrent)
        else:
            if quack[prev_quack[q]] < 1:
                return -1
            quack[prev_quack[q]] -= 1
            if q == 'k':
                concurrent -=1    
    return -1 if concurrent else answer

print(solution(q_list))

 

 

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

 

20207번: 달력

 수현이는 일년의 날짜가 1일부터 365일로 표시되어있는 달력을 가지고있다. 수현이는 너무나도 계획적인 사람이라 올 해 일정을 모두 계획해서 달력에 표시해놨다.  여름이 거의 끝나가자 장

www.acmicpc.net

 

구현

1.  paper_start, paper_ends : 달력 시작, 각 라인 일정 끝 값들

2. 경우를 나눔

  • 끝값+1 보다 start 값이 더 크면 그 전까지 넓이를 구함
  • 각 라인 일정 끝값 반복문 -> start > end : 같은 라인 이어지는 날짜 일정
  • 다음 라인에 오는 일정
import sys

def solution(arr):
    def get_area(paper_start, paper_ends):
        return len(paper_ends)*(max(paper_ends) - paper_start + 1)
             
    arr.sort(key=lambda x:(x[0],-x[1]))
    
    paper_start, paper_ends = 1, [0]
    answer = 0
    
    for start, end in arr:
        if start > max(paper_ends) + 1: # 달력 한칸 띄운 수 보다 크면 넓이 구함
            answer += get_area(paper_start, paper_ends)
            paper_start,paper_ends = start, [end]
        else:
            for i, paper_end in enumerate(paper_ends):
                if start > paper_end:   # 해당 라인 바로 다음에 오는 일정
                    paper_ends[i] = end
                    break
            else:
                paper_ends.append(end) # 날짜 겹치기로 다음 라인 일정 추가
            
    return answer + get_area(paper_start, paper_ends)

N = sys.stdin.readline()
arr = [[*map(int,row.split())] for row in sys.stdin.readlines()]

print(solution(arr))
python 문법 (for ~ else)

- for 문이 break 등으로 끊기지 않고 끝까지 수행했을 때 else가 수행 됨.

 

Comments