개발/문제풀이

2월 1주차 백준 문제풀이 파이썬(듣보잡, 회의실 배정, 바이러스, 최대 힙, 집합 연결요소의 개수, 좌표압축)

2021. 2. 8. 16:21
목차
  1. 1764번 - 듣보잡 & 11723 - 집합
  2. 1764번
  3. 11723번
  4. 1931번 - 회의실 배정
  5. 1. 가장 빨리 시작하는 순으로 정렬하기
  6. 2. 짧은 것들 순으로 정렬하기
  7. 3. 가장 빨리 끝나는 순으로 정렬하기
  8. 2606번 - 바이러스 & 11724번 - 연결 요소의 개수
  9. DFS
  10. BFS
  11. 문제해설
  12. 11279 - 최대힙
  13. 18870 - 좌표압축
반응형

2월 1주차 문제해설

  • 1764 - 듣보잡 ✔
  • 1931 - 회의실 배정 ✔
  • 2606 - 바이러스 ✔
  • 11279 - 최대 힙 ✔
  • 11723 - 집합 ✔
  • 11724 - 연결 요소의 개수 ✔
  • 18870 - 좌표 압축 ✔

1764번 - 듣보잡 & 11723 - 집합

  • 1764: 시간제한 : 2초 | 메모리제한 : 256MB
  • 11723: 시간제한 : 1초 | 메모리제한 : 4MB

1764번

  • 파이썬 내장 클래스인 set의 intersection() 메소드를 사용하면 두 set 사이의 교집합을 얻을 수 있다. 이를 활용하면 된다.

11723번

  • 파이썬 내장 클래스인 set를 활용하면 쉽게 풀 수 있다.
  • add는 add()를 활용
  • remove는 숫자가 없는 경우에도 동작하기 위해 remove()가 아닌 discard()를 사용해야한다. remove()를 사용하면서 set내에 없는 엘리먼트를 삭제하면 keyError가 발생하지만 discard()는 그렇지 않다.
  • check는 in 키워드를 사용하자
  • toggle은 remove()와 add() 메소드를 사용하자. if문에서 엘리먼트의 존재여부를 판단했으므로 remove()를 사용해도 된다.
  • all는 update([...])를 사용하자. 리스트에 들어있는 모든 엘리먼트들을 add()해준다.
  • empty는 celar() 메소드를 사용하자. set을 공집합으로 만들어준다.


1931번 - 회의실 배정

시간제한 : 2초 | 메모리제한 : 128MB

그리디 알고리즘, 정렬을 활용해야 풀 수 있는 문제다.

우선 가장 많은 회의실 사용 횟수를 구할 수 있는 방법을 떠올리라고 하면 3가지를 선택할 것이다.

  1. 빨리 시작하는 순서대로 정렬하기
  2. 회의가 짧은 순서대로 정렬하기
  3. 빨리 끝나는 순서대로 정렬하기

하나씩 반례를 찾아보자

1. 가장 빨리 시작하는 순으로 정렬하기

  • 가장 빠르게 시작하는 회의가 엄청 길다면 다른 몇개의 회의를 진행 할 수 없을 수도 있다.

2. 짧은 것들 순으로 정렬하기

  • 2개의 회의시간 중간에 짧은 회의 하나가 겹처버리면 2번 회의를 진행 할 수 있는 걸 1번만 카운트 하게 된다.

3. 가장 빨리 끝나는 순으로 정렬하기

  • 회의가 시작되려면 그 이전에 회의가 끝나 있어야 한다. 더 빠르게 회의가 끝나는 순서대로 정렬 하면 그 순간순간 최적의 답을 찾을 수 있다.(그리디 알고리즘)
  • 주의할 점은 끝나는 시간이 같다면 시작시간이 빠른 순서대로 골라야 한다. (예시: 1~3, 3~3)

3번을 활용해서 각 회의시간을 입력 받은 후 끝나는 시간 순서대로 정렬 후 시작하는 시간 순서대로 다시 한번 정렬해주면 된다.

여기서 파이썬 기본 내장함수인 sort()를 사용할 것이다. sort() 함수는 파라미터로 key 값을 튜플 형태로 전달 할 수 있고, 각 인자 순서대로 오름차순 정렬해준다.

예시 : array = array.sort(key = lambda x : (x[1],x[0]))


2606번 - 바이러스 & 11724번 - 연결 요소의 개수

  • 2606: 시간제한: 1초 | 메모리제한: 128MB
  • 11724: 시간제한: 3초 | 메모리제한: 512MB

그래프 이론 중 BFS, DFS를 활용해서 풀 수 있는 문제다.

출처 : https://nick.balestrafoster.com/2015/depthFirst-vs-breadthFirst/

DFS

Depth Fisrt Search(깊이 우선 탐색법)으로 각 노드의 연결된 첫 자식부터 순차적으로 탐색해 나가는 방식이다. 빠르다는 장점이 있지만, 탐색한 경로가 최적의 경로가 아닐 수 있다. 재귀로 구현한다.

BFS

Breadth(깊이 우선 탐색법)으로 모든 자식 노드를 순서대로 탐색하고 그 노드들의 자식노드.. 순으로 탐색해 나가는 방식이다. 두 노드간의 최단경로를 찾고 싶을때 주로 사용하고 DFS보다 구현이 살짝 어렵다.

문제해설

  • 2606번은 노드와 링크를 입력 받은 후 DFS,BFS 등을 구현한 후 1번 노드와 연결된 모든 노드를 탐색 하였으면 지금까지 방문한 노드의 개수 중 자기자신인 1개를 제외한 수를 출력하면 된다.

  • 11724번은 1번 노드부터 마지막 노드까지 순서대로 DFS,BFS를 이용해 탐색하되 방문한 노드에 기록되지 않은 노드만 탐색하면 된다. 그 후 각 탐색이 끝날 때마다 카운트를 1개씩 늘려 그 수를 출력하면 된다.


11279 - 최대힙

시간제한: 1초 | 메모리제한: 128MB

출처: https://www.geeksforgeeks.org/max-heap-in-java/

최대 힙 : 부모노드가 자식노드보다 작지만 않으면 성립하는 힙. 완전 이진 트리이다.

가장 큰 값을 출력할땐 최상위 노드를 제거하고 최하위 노드를 최상위 노드 위치에 넣은 뒤 자식 노드들과 비교하며 내리면 된다. 새로운 노드를 추가할땐 최하위에 노드를 삽입하고 부모노드와 비교해가며 위치를 바꾸면 된다.


18870 - 좌표압축

시간제한: 2초 | 메모리제한: 512MB

주어진 좌표들 중 특정 영역 내의 좌표 값을 구하고 싶은데, 각 좌표 사이의 거리가 너무 넓으면 메모리, 시간에 제한이 걸릴 수도 있다. 이럴때 좌표 압축을 시행하는데, 각각의 좌표를 상대적인 좌표로 나타내면 된다.

  • 예시 : [-10000000,0,10000000] -> 좌표압축 시행 후 -> [0,1,2]

dots에 각 점을 넣고 dotset으로 중복된 좌표를 제거 해준다. 그리고 dictonary클래스를 이용해 dotdic에 key값을 좌표값으로, value값을 for문을 통해 0부터 len(dotset)-1까지 지정해주면 각 좌표당 할당된 새로운 좌표를 얻을 수 있다.

 

728x90

'개발 > 문제풀이' 카테고리의 다른 글

[카카오 2023 BLIND RECRUITMENT, Python] 이모티콘 할인행사 문제풀이  (0) 2023.03.07
[BOJ 27211, Python] 도넛 행성 풀이  (0) 2023.02.01
[BOJ 27210, Python] 신을 모시는 사당 풀이  (0) 2023.02.01
백준 1697,12851,13913 파이썬 풀이 (숨바꼭질 1, 숨바꼭질 2, 숨바꼭질 3)  (0) 2021.04.08
백준 1927번 최소 힙 파이썬 문제풀이  (0) 2021.02.15
  • 1764번 - 듣보잡 & 11723 - 집합
  • 1764번
  • 11723번
  • 1931번 - 회의실 배정
  • 1. 가장 빨리 시작하는 순으로 정렬하기
  • 2. 짧은 것들 순으로 정렬하기
  • 3. 가장 빨리 끝나는 순으로 정렬하기
  • 2606번 - 바이러스 & 11724번 - 연결 요소의 개수
  • DFS
  • BFS
  • 문제해설
  • 11279 - 최대힙
  • 18870 - 좌표압축
'개발/문제풀이' 카테고리의 다른 글
  • [BOJ 27211, Python] 도넛 행성 풀이
  • [BOJ 27210, Python] 신을 모시는 사당 풀이
  • 백준 1697,12851,13913 파이썬 풀이 (숨바꼭질 1, 숨바꼭질 2, 숨바꼭질 3)
  • 백준 1927번 최소 힙 파이썬 문제풀이
Junhyung-Choi
Junhyung-Choi
Junhyung-Choi
TheOldFace 개발 블로그
Junhyung-Choi
전체
오늘
어제
  • 분류 전체보기 (29)
    • 개발 (29)
      • 개발환경 설정 (4)
      • 문제풀이 (6)
      • Unity (2)
      • [시리즈] Unity 튜토리얼 (0)
      • Django (0)
      • [시리즈] DRF + React (8)
      • 이슈 해결 모음 (6)
      • [시리즈] Effective C++ (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준
  • M1 MacBook
  • 쇼미더코드3차
  • Shell
  • Python
  • mediapipe
  • django
  • React
  • 원티드
  • 쇼미더코드 3차
  • 문제풀이
  • 알고리즘
  • 파이썬
  • #ec++
  • DFS&BFS
  • zsh
  • BOJ
  • 개발
  • c++
  • ec++

최근 댓글

최근 글

hELLO · Designed By 정상우.
Junhyung-Choi
2월 1주차 백준 문제풀이 파이썬(듣보잡, 회의실 배정, 바이러스, 최대 힙, 집합 연결요소의 개수, 좌표압축)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.