The Way

4월 25일/26일 백준 (17144, 16496, 1655, 8989, 4677, 1718, 15917, 9411) 본문

PS/백준 온라인 저지

4월 25일/26일 백준 (17144, 16496, 1655, 8989, 4677, 1718, 15917, 9411)

Jeonggyun 2019. 4. 27. 19:39

오랜만에 백준을 풀어보았다. 감이 좀 떨어진 것이 느껴진다.

오랜만에 codeforces도 해보았다. Div3이었는데도 참교육당했다.


백준 17144번: 미세먼지 안녕!

정직한 구현 문제. 미세먼지는 상하좌우 4방향으로 확산이 일어나고, 공기청정기 바람의 경로에 있는 먼지들은 바람의 방향대로 한 칸씩 이동한다.

공기청정기 바람의 방향 때문에 조금 노가다가 심하다. 더 짧게 짤 수는 있겠지만 빨리 짜는 것과 적당히 밸런스를 맞추어야 한다.




백준 16496번: 큰 수 만들기

주어진 숫자들을 이어붙여서 가장 큰 수를 만들어야 한다. 그냥 사전순으로 큰 수부터 이어붙이면 크겠다.

문제는 한 수가 다른 수에 포함되는 경우(예를 들어 32482, 324), 동일한 구간 뒤에 오는 숫자가 무엇인지 고려해주어야 한다.

이걸 어떻게 비교할까? 유심히 생각을 하다보면 한 가지 특징을 발견할 수 있다.

다음의 4가지 숫자가 있다고 가정해보자.


324|82

324|

122

20


사전순으로 가장 빠른 것을 찾다보면 324까지는 동일하며, 두 가지 후보가 생기게 된다.

32472는 82가 뒤에 오지만 324는?

324 뒤에는, 지금까지 사전 순으로 가장 컸던 324~ 가 또 와야만 한다.

즉, 반복을 할 때 324324324...의 순으로 채워가며 비교하면 되는 것이다.

나는 가장 긴 수를 기준으로 뒤를 다 채워놓고 정렬해주었지만 정렬의 comp함수를 재정의하면 훨씬 깔끔한 코드가 나온다.

comp함수를 쓸 때 매개변수에 &를 붙여주어야 하던가.. 잘 기억이 안 난다.




백준 1655번: 가운데를 말해요

숫자들이 차례로 들어올 때 중간값을 출력해야 하는 문제이다.

유명한 방법이 있는데, 최소 힙과 최대 힙 두가지를 이용하는 방법이다.

최대 힙에는 작은 절반의 원소를, 최소 힙에는 큰 절반의 원소를 넣는다. 숫자가 하나 들어올 때마다 둘의 갯수를 잘 유지해주면 된다.




백준 8989번: 시계

시간 5개가 주어졌을 때, 시계의 각도 순으로 중간 각도 값을 갖는 시간을 출력하는 문제이다.

핵심은 시계의 각도를 구하는 과정이라고 할 수 있다.


다들 알다시피 시침의 각도는 (30 * 시 + 0.5 * 분), 분침의 각도는 (6 * 분)이다.

각도가 주어지면 둘 중 작은 쪽의 각도를 보통 생각하기 때문에 180보다 크면 360 - 각도를 사용해야 한다.

소수가 나오면 오류를 유발하니 2를 곱해 생각하면 편하다.




백준 4677번: Oil Deposits

랜덤으로 풀다 보니 영어 문제가 걸렸다. @는 석유, *는 일반 땅인데 서로 붙어 있는 석유를 한 뭉텅이로 생각했을 때 석유 뭉텅이가 총 몇 개인지 구하는 문제이다.

대각선까지 같은 뭉텅이로 본다는 것이 특징이라면 특징. DFS나 BFS로 가볍게 풀 수 있다.




백준 1718번: 암호

생략




백준 15917번: 노솔브 방지문제야!!

노솔브 방지문제라길래 호다닥 풀었다. 각 쿼리가 2의 거듭제곱 꼴인지 묻는 문제인데,

https://jeonggyun.tistory.com/208

에서도 쓴 바 있지만 i & (i - 1) == 0으로 가볍게 판별할 수 있다.




백준 9411번: 실수 계산

실수의 합을 정확하게 계산하는 문제이다.

문제 설명이 약간 애매한데, 유효 숫자가 30자리라서 (0.000...(100만 개)...0001234) 이런 입력도 가능할 것 같아서 긴장했는데, 다행히 없는 것 같다.

+, -를 잘 처리해주고, 자릿수를 잘 맞추어 더해주고, 출력할 때 그냥 정수인지 / 0보다 한참 작은 소수인지 등을 잘 처리해주면 된다.

약간 예외 케이스가 있을 것 같기도 한 코드이다. 설마 없겠지.. ㅎ



Comments