15488 나이트가 체스판을 벗어나지 않을 확률 G5

더보기

#dp

 

bfs나 dfs로 관리해준다면 visited의 존재가 없기 때문에 8^50번의 탐색이 필요하다. 따라서 dp를 이용해 중복연산을 제거해보자.

dp[i][j] =  현재 i,j에 말이 있을 확률이라고 가정해보자.

그렇다면, 처음 위치 dp[x][y]는 1이 될 것이다. 매 이동횟수 k를 진행하면서 갈 수 있는 경우의수는 8가지 이기 때문에

dp[next_knight_move][] += dp[x][y] * 0.125될 것이다. 이 과정을 위치에 벗어나지 않는한 계속 해주자.

dp보단 브루트포스에 가깝다... 시간복잡도 O(n^4)

 

http://boj.kr/2056b85ab8084889bb78272196e1aa7e

1161 버스 P3

더보기

#greedy

 

탑승 정거장 기준으로 정렬을 해보자.

버스의 탑승 정거장으로 정렬되어 있으므로  그리디하게  현재 탑승한 정거장보다 이전에 내린 승객들을 모두 빼주고,
만약 버스가 비어있으면 넣을 수 있는데까지 넣은 다음, 비어있지 않다면 버스의 내리는 시간의 최대값이 더 줄어들 수 있을 때 까지 현재 승객들을 태운다.
 

25585 86 ─에이티식스─ 1 G5

더보기

#tsp #graph

 

대각선으로 BFS을 하여 adjust matrix를 만들 수 있다.

그런 다음, 접근을 못하는 정점이 있으면 불가능한 걸 알 수 있다.

그 다음 tsp를 활용 해 최단 거리를 구할 수 있다.

난이도에 비해 어렵게 풀었는데 n의 범위가 작아서 10!으로 permutation을 만들면 brute force으로도 풀리는 듯 하다.

 

http://boj.kr/de559f4525be4718827567bbee09fa6e

20757 Roadside optimization G5

더보기

#dsu

 

평범한 dsu 문제

adjust matrix를 순회하면서 i,j가 1인 경우,  parent를 find 했을 때, parent가 다르다면 union을 해준 다음, +=1 해주면 된다. 

그것이 최소의 간선으로 전체를 순회할 수 있는 방법 중 하나이다.

 

http://boj.kr/12f580657a204a99b1f4254ba858d488

20551 Sort 마스터 배지훈의 후계자 S4

더보기

#sort, #hash

 

정렬한 다음,  dictonary와 같은 hash set으로 처음 등장한 index를 관리해주면 된다.

풀고 난 다음 태그를 봤는데 이분탐색이 있어 이방법도 있겠구나 싶었다.

 

 

http://boj.kr/da8cf1e839bf4e7f9a53ebaa884725df

2141 우체국 G4

더보기

#greedy #prefix_sum

 

관찰 해보았을 때, 우체국은 사람이 있는 장소에 설치하는게 가장 최적일 것이다.

그리고 Greedy하게 푸는 방법을 생각해보았을 때 현재 index기준 사람이 전체 사람의 50%가 넘어가는 시점에 설치해야 한다. (이 과정이 증명하기 힘들지만, 가장 최적의 방법이다.) 이 과정을 누적합을 이용해서 구현해주자.

추가로 input으로 들어오는 우체국의 위치가 정렬이 되어 있지 않은듯하다. sort를 해주어야 함.

이 방법외에도 여러가지 풀이방법이 존재하는 듯하다.

 

http://boj.kr/78fd261e3b61497f89d693b9e9aad08d

23850 Cijanobakterije G2

더보기

#graph

 

트리의 지름을 구하는 문제와 유사하다.

다만, 모든 정점이 하나의 트리로 구성되어 있지 않기 때문에 bfs로 탐색 할 수 있는 트리들의 지름의 합을 구해주어야 한다.

트리의 지름을 구하는 방법은 임의의 정점 w를 잡고 가장 길이가 먼 x를 잡은 다음, x에서 가장 먼 정점 y를 잡는다면, x->w->y는 트리의 지름이 된다.

 

http://boj.kr/78fa6d73579a4dcc9792406988784b71

28251 나도리합 G3

더보기

#dsu

 

union을 했을 때, 그 그룹 내에 모든 power의 곱의 합을 쿼리로 출력하는 문제

union할 때 power라는 새로운 리스트를 만들어 parent를 관리함과 동시에 power을 update해주자.

쿼리가 들어오면 매 쿼리마다 그 그룹을 union하고, power을 출력해주면 되는 문제.

 

http://boj.kr/962d0551399341fca76e608c7a277f89

20153 영웅이는 2의 거듭제곱을 좋아해! 영웅이는 2의 거듭제곱을 좋아해! S2

더보기

#math

 

2^n개가 홀수개 있다는 거는, 해당 비트위치의 연산을 xor 했을때 1인 경우를 의미할 것이다.

그리고 최대 1개를 지운 다는 것은 전체 xor 한 값에 한번 더 해당 값을 xor연산 한것과 동치 일 것이다.

그렇게 해준 다음, 위 2 case의 최댓값을 출력시켜주자.

 

http://boj.kr/7d731722fa97414b9890186647ef5154

'ps > Solved' 카테고리의 다른 글

11월 1째주 PS정리  (0) 2024.10.28
10월 4째주 PS정리  (0) 2024.10.22
10월 2째주 PS 정리  (0) 2024.10.07
10월 1째주 PS 정리  (0) 2024.09.30
9월 4째주 PS정리  (2) 2024.09.24

32290 MEX vs OR B1

더보기

#bruteforce, #implementation

 

N이 매우 작기 때문에 매번 i or x한 값을 리스트에 넣은 다음, MEX를 구해주면 된다.

MEX를 구하는 방법은 여러가지 있겠지만 나는  i or x한값을  정렬했을때, 인덱스와 값이 다른 시점을 mex로 구현하였다.

XOR만 나오면 항상 정수론적인 생각을 먼저하게 된다...

 

http://boj.kr/9f0e9984f6f74a5bbc55140f7392a69e

32289 Max-Queen S5

더보기

#greedy #math

 

모든 자리에 퀸을 넣는 것이 가장 최적의 경우이다.

그렇다면 가로방향의 공격 쌍수, 세로방향의 공격 쌍 수 대각선 방향의 공격쌍수 이렇게 3가지로 나누어서 생각을 해보았을때, 점화식을 도출할 수 있다.

문제에비해 난이도가 저평가된것 같다..

 

http://boj.kr/abb650e031d34f4fa24702fc4788f6e7

3682 동치 증명 P3

더보기

#graph #scc

 

저번주에 푼다고 하고 못푼 문제다.

 

SCC으로 묶을수 있는 간선들은 모두 동치가 될 수 있다고 설명할 수 있다.

그렇기에 SCC단위를 정점으로 간소화 한다음, 이 정점 집합들을 하나의 SCC로 만들어야 하는 문제로 바꿀 수 있는데,

그렇다면 각 node의 indegree와 outdegree가 모두 1이상이 되어야 하기 때문에 max(indegree == 0, outdegree == 0)인 수를 찾으면 된다. 

SCC 구현 코드를 코사라주 알고리즘을 사용했는데, 아무래도 똑같은 그래프를 2개 만들다 보니 MLE가 자주 발생한다. 그렇기 때문에 비교적 느린 python3이나, 타잔 알고리즘으로 SCC를 구현해야 한다.

 

타잔알고리즘과 SCC를 정점으로 치환하는 방법을 배운 문제

 

http://boj.kr/08a130f1a4aa46f999147858eb0167d5

2812 크게만들기 G3

더보기

#greedy #stack

 

일단 m번 무조건 지워야 하기 때문에 최대 자릿수는 n-m자리일 것이다.

그렇다면 무조건 앞에 수를 가장 큰 수로 두어야 할 것이고, 스택에 하나씩 넣으면서 앞에 자리수가 뒤에자리수보다 작다면 계속 그 작업을 수행해주어야 할 것이다.

 

추가 반례로 모두 다 같은자리인경우 m번 연산을 안할경우가 있는데, 이 점을 따로 예외 처리해주자.

 

http://boj.kr/8dad6cb94d1f463d88f272ee0b64b3fe

27653 최소 트리 분할 G2

더보기

#dfs #greedy

 

연산 내용이 주어진 트리의 부분 그래프의 가중치를 1 늘리는 과정이기 때문에 현재 노드를 기준으로 본다면, 현재 노드의 부모노드의 목표 weight보다 작으면 부모노드의 연산으로 수행할 수 있다.

 

그러기 때문에 대충 1번 노드를 root node으로 잡고 정답은 root node의 weight + sigma 2~n : max(node weight - parent node weight, 0)으로 정의할 수 있다.

dfs으로 각 노드의 부모노드와 목표 가중치를 비교하자

 

http://boj.kr/a09ad08634884c31a098ffded497cf20

17233 문자열 장식 P3

더보기

#kmp #sweeping

 

KMP알고리즘을 수행하면, 원본 문자열에서 부분문자열이 몇개 있는지, 어디에 있는지 모두 구할 수 있을 것이다. 그렇다면 투 포일터를 활용해 l~r 범위 내에 모든 부분문자열이 있느냐?를 체크할 수 있다. 매번 체크를 해주면서 최소 구간을 찾자.

 

대충 시간복잡도를 O(N+M+2N) 정도로... 선형시간내에 해결할 수 있을 것이다.

 

http://boj.kr/cceb8d4ecef14112bc5d6e4c24dfccc0

22217 Scales S2

더보기

#implementation, #math

 

m을 3진수로 나눌 때 bit가 2인 경우, 왼편, 그 외인경우 오른편에 두어 비트연산을 했을 때 그 수가 나올 수 있게 구현하면 된다.

 

http://boj.kr/0c05d9e6d3314b0a9cd8ca5efdcc19ff

16991 외판원순회 3 G1

더보기

#tsp 

 

각 좌표간의 거리를 n^2으로 구해 distance를 구한 다음, 그것을 활용 해 외판원순회를 해주면 된다.

Bitonic Tour라는 좌표상의 외판원순회 알고리즘이 있던데, 이 문제인줄 알았는데, 알고보니 더 쉽게 해결할 수 있었다. 

 

Bitonic Tour 공부해보면 좋을듯. .

http://boj.kr/c10781df6e05442d9b9a98e5476d1a15

1251 단어 나누기 S5

더보기

#bruteforce

 

그리디하게 접근해볼까 하다가 같은 가장 사전순 작은 문자열 일때, 얼마나 더 길게 나눌것인가 생각을 좀 해보았는데, n이 매우작기 때문에 n^3으로 모든 문자열조합을 만드는 방식으로 풀 수 있다.

 

http://boj.kr/d743bf5e470f4c3e9548127e69f6bc6d

2993 세 부분 S5

더보기

#bruteforce

 

1251과 동일

17413 단어뒤집기 2 S3

더보기

#stack #implementation

 

스택을 사용해 구현해주면 된다. 다만 신경써줘야할 부분은 태그 내에 공백이 있는 case를 예외처리 해주면 쉽게 풀린다.

 

http://boj.kr/25acd514eba14c8db23fb88953dca17f

'ps > Solved' 카테고리의 다른 글

10월 4째주 PS정리  (0) 2024.10.22
10월 3째주 PS 정리  (1) 2024.10.14
10월 1째주 PS 정리  (0) 2024.09.30
9월 4째주 PS정리  (2) 2024.09.24
9월 3째주 PS 정리  (0) 2024.09.16

13576 Prefix와 Suffix P2

더보기

#string #z

 

Z알고리즘 연습용으로 풀었다.

Z알고리즘이란, 각각의접미사와 전체 문자열의 가장 긴 공통 접두사의 길이를 빠르게 구하는 알고리즘으로, O(n)으로 해결할 수 있다.Z알고리즘에 관해선 따로 포스팅을 해보거나 해야겠다. 여기서 더 얘기하면 길어질것 같고..

 

Z알고리즘을 돌려 배열을 만든 뒤, 접미사와 접두사가 일치한지, 그리고 bisect를 활용해 몇번 등장하는지 체크해주었다.

 

http://boj.kr/a8c73387d9d648c598068aa554adf430

32136 소신발언 G1

더보기

#parametric search

 

반대로 생각해 T가 주어 졌을때, 모든 시간안에 얼음을 녹일 수 있는가? 라는 문제로 변경해보면, parametric search으로 T시간안에 녹일 수 있냐 없냐? 문제로 변경하게 된다.  이점을 이분탐색으로 찾아나갈 수 있다

 

추가로 삼분탐색으로도 풀수 있는데, 2차원 그래프에서 y를 녹는 정도 max(D), x축을 i번째 히터의 위치로 둔다면, convex한 형태의 그래프가 나오는데 이 그래프의 극솟값이 최적으로 놔둘 수 있는 위치 i가 된다.

두 방법에 대해 둘다 풀어봤다. 재미있는 문제

 

parametric search

http://boj.kr/e49d28bae70644588301cf277803e28f 

tenary search

http://boj.kr/4a5de21ad8454c478a65ef7a57c32f04   

11662 민호와 강호 G4

더보기

#tenary search

두 사람의 거리차 d를 y축으로 time을 x축으로 둘 때, 그래프의 형태는 아래로 볼록한 convex한 형태로 나타내지고, 이 그래프의 극솟값은 최소거리차이 가 된다.

위 극솟값을 삼분탐색으로 찾아주면 된다.

 

http://boj.kr/1c9f769c1d1d412a82d787d7e9c9a75e

27488 Sum of Two Numbers S2

더보기

#math #ad_hoc

 

n이 주어지면 x, y의 합이 n이 되어야 하고, x, y의 각 자릿수의 합이 최대 1차이가 나는 x, y를 찾는 문제

n의 각 자릿수 / 2가 x,y의 그 자리수가 되어야 하고, 짝수면 그냥 /2 나누면 된다.

만약 홀수 일 때  x,y를 /2, /2+1 두개로 나누어야 하는데 이에 대한 예외처리를 잘 해주어야 한다.

 

"최대" 라는 키워드를 안봐서 무조건 1차이가 나게 해야하는줄 알고 맞왜틀을 좀 한 문제

 

http://boj.kr/69fa722882684894b13221939d5a8e4d

22352 항체 인식 G5

더보기

#graph


BFS, DFS 아무거나 사용하여 그래프 내에 연결되어 있는 component를 찾은 다음,

각 component별 백신의 작용 대상이 될 수 있는지를 검사해야 한다.

 

http://boj.kr/abb4485a04cb4965b254a0c03fbce12a

27028 Distance Queries P5

더보기

#lca

 

lca의 weight가 붙어 있는 버전

direction이 주어지는데, 아~무쓸데없다. 혼동을주기 위한용

lca의 깊이를 dfs로 수행할때 현재 노드까지의 누적 weight를 같이 계산해주자.

lca 전체 코드는 log n으로 수행할 수 있는 템플릿을 사용했다. 

 

http://boj.kr/f5303fc3ee484382906ea347cee1f3ea

3682 동치 증명 P2

더보기

#scc

 

TBD

과제 때문에 바빠 많이 못풀었다.

'ps > Solved' 카테고리의 다른 글

10월 4째주 PS정리  (0) 2024.10.22
10월 3째주 PS 정리  (1) 2024.10.14
10월 2째주 PS 정리  (0) 2024.10.07
9월 4째주 PS정리  (2) 2024.09.24
9월 3째주 PS 정리  (0) 2024.09.16

2406 안정적인 네트워크 G3

더보기

#mst

 

지문에 낚시가 많지만 1번 정점은 아~~~무 쓸데가 없다.

adjust matrix를 구성할때도, 1번해당되는 edge는 연결안해도 된다.

이후 mst를 무난하게 구성하고, 필요한 weight, edge정보, 갯수를 다 추출하면 된다.

 

http://boj.kr/11e5c7b37a974c37b613863185406485

1557 제곱 ㄴㄴ D5

더보기

#math

 

우선 https://gratus-blog.tistory.com/74  이걸 많이 참고해서 공부하여 구현하였다.

뫼비우스 함수를 정의해야하는데,

μ(1)=1

이 제곱수로 나누어지면 μ(n)=0

이 서로 다른 k개의 소인수의 곱이면 μ(n)=(−1) ^ k으로 정의 할 수 있다.

 

이후 포함배제 원리에 따라 1부터 N까지 제곱인수가 없는 수를 계산하고, 이분 탐색을 통해 k번째수를 찾아보자.

 

http://boj.kr/55e8a5d137594aa2bb06e038568883fb

8464 Non-Squarefree Numbers D5

더보기

#math

 

앞서 설명한 #1557번에 n의 범위가 다르고 반대로 K번째 제곱수를 찾는 문제이다.

이분탐색하는 코드에서 전체 갯수가 아닌 N-전체 갯수하면 되는 덤으로 따라오는 문제

(이걸 오랫동안 생각했다)

 

http://boj.kr/79f6802fb1084766a7eec6932fe10b80

4991 로봇청소기 G1

더보기

#bfs #tsp

 

내가 푼 방법은 현재 위치를 1번, 나머지 청소해야할 부분을 2,3,4.. 노드라고 생각하고 각 node별로 갈 수 있는 distance를 인접행렬로 만든 다음, 외판원 순회를 해주었다.

 

이거보다 더 쉽게 푸는 방법이 있는 듯하다. 구현 + tsp 무조건 플레이상이라고 생각하는데 G1인거봐선..

 

http://boj.kr/e9f75bd538f54ad7b5751ac563df6ee0

8336 Chess G1

더보기

#ad_hoc, #math

 

배치는 순열의 사이클 구조를 이용하여 n이 4의 배수이거나 n ≡ 1 mod 4일 때만 가능하며, 그 외의 경우는 불가능하다.

조건을 만족할땐, 팩토리얼 연산을 통해 배치 수를 구해보자.

 

http://boj.kr/1c2d6b729bfb4dcaa5a087d12aa26bde

28449 누가 이길까 G5

더보기

#binary_search, #sorting #hash

 

나이브하게 풀면 n^2이 난다. n <= 100000이기 때문에 시간초과 남.

target배열을 정렬한 다음, binary search를 통하여 몇번쨰 인덱스에 넣을수 있는지 찾아보자. 

결과 인덱스보다 앞에있으면 이길수있는 상대, 뒤에있으면 지는 상대일것이다.

추가로 비기는 경우를 대비해 미리 hash map에다 count해 비기는 상대의 수는 미리 구할 수 있을 것이다.

 

http://boj.kr/cf25dc06258f490782015d263405f442

1068 트리 G5

더보기

#dfs #tree

 

트리를 구성하고 제거할 정점을 graph를 돌면서 제거해주자.

제거하는데 있어 인덱스 문제가 생길수 있으니 그래프를 deepcopy하여 처리하자.

이후 dfs해서 leaf node들을 체크해 1씩 증가시켜주자.

만약 제거할 node가 정점이라면 답은 0으로 따로 예외처리를 해주자.

 

http://boj.kr/d6475b90e6aa4991a43f148d568f143f

3987 보이저 1호 G5

더보기

#implement #graph

 

그냥 머... 지문에 있는 대로 구현해주면 된다.

맵 넘어가면 그만 탐색하고500x500이라 10^6회 순회하면 무한 루프라고 판단되어 그만하게 처리해주었다.

개인적으로 같은 난이도였던 #2344보다 훨씬 쉬웠음.

그 문제는 배열의 인덱스를 수식으로 관리해주었어야 했는데 이건 그런것도 없다.

http://boj.kr/70e67c6b98b44b87b4a21ff28debf544

28448 광기의 PS P5

더보기

#greedy

 

관찰을 해보면, 5 * K >= K * T 라면, 그 문제를 푼다해도 무조건 광기력이 0이 된다. 다음과 같은 case들은 우선적으로 바로 풀어주자.

나머지 case들에 대해선, 문제의 난이도에 대해 정렬을 해주고, 따로 tuple에 최소 n만큼 되어야 그 문제를 풀이 할 수 있는 시간을 정의해 주었다. 

이후엔 구현

 

http://boj.kr/df79d52185a7415d9abd35f392a77e6d

2660 회장뽑기 G5

더보기

#bfs

 

각 node를 시작으로 하는 BFS를 수행해주고 가장 긴 distance를 구하는 문제이다.

머.. 무난무난해서 설명할게 없다.

 

http://boj.kr/5b1a0643aab84b9fa2af34f29fa3c210

17839 Baba is Rabbit G5

더보기

#bfs

 

간단한 BFS 문제지만, 정점번호가 string으로 되어 있는 문제이다.

dictonary에서 정점번호 - string을 매칭시켜준 다음, bfs하면된다.

체크해야하는 점은 매번 value를 찾는 과정을 O(n)으로 수행하면, TLE가 발생하기 때문에, 역방항 dictionary를 만들어서 O(1)로 해결해주어야 한다.

 

http://boj.kr/88482fc719b6431093b8c30907137e48

12634 Stock Charts (Large) P2

더보기

#bipartite_matching 

 

주식차트를 이분그래프로 변경하기 위해서 (i, k)번째 시점이 (j, k) 시점 보다 값이 적다면, 이분그래프를 그릴 수 있다.

그뒤론 적절하게 이분매칭의 최대 수는 같이 그릴 수 있는 차트와 같기 때문에 n - 이분매칭 최대수가 답이 된다.

여담으로 똑같은 코드로 12633, 12988을 해결할 수 있다.

 

http://boj.kr/b07bfed22b0b441ab71104a5392e8934

'ps > Solved' 카테고리의 다른 글

10월 4째주 PS정리  (0) 2024.10.22
10월 3째주 PS 정리  (1) 2024.10.14
10월 2째주 PS 정리  (0) 2024.10.07
10월 1째주 PS 정리  (0) 2024.09.30
9월 3째주 PS 정리  (0) 2024.09.16

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

문제 설명

여러분은 요즘 유행하는 심리검사인 MBTI에 대해 들어보았는가?

MBTI(Myers-Briggs Type Indicator)는 C.G.Jung의 심리유형론을 근거로 하여 Katharine Cook Briggs와 Isabel Briggs Myers가 보다 쉽고 일상생활에 유용하게 활용할 수 있도록 고안한 자기보고식 성격유형지표이다. (출처: 위키백과)

MBTI는 아래와 같이 네 가지 척도로 사람들의 성격을 구분한다.

  • 외향(E) / 내향(I)
  • 감각(S) / 직관(N)
  • 사고(T) / 감정(F)
  • 판단(J) / 인식(P)

각 척도마다 두 가지 분류가 존재하므로, MBTI는 총 2^4=16가지 유형이 있음을 알 수 있다. 일반적으로 MBTI의 유형들은 각 분류를 나타내는 알파벳 한 글자씩을 따 네 글자로 표시하게 된다. 모든 유형의 목록은 다음과 같다.

  • ISTJ, ISFJ, INFJ, INTJ, ISTP, ISFP, INFP, INTP, ESTP, ESFP, ENFP, ENTP, ESTJ, ESFJ, ENFJ, ENTJ

MBTI 성격 유형을 이용하면 두 사람 사이의 심리적인 거리를 정의할 수 있다. 이는 두 사람의 MBTI 유형에서 서로 다른 분류에 속하는 척도의 수로 정의된다. 예를 들어, MBTI 유형이 ISTJ인 사람과 ISFJ인 사람 사이의 거리는 1이며, INTP인 사람과 ENTJ인 사람 사이의 거리는 2이다.

이 정의를 확장해서 세 사람 사이의 심리적인 거리도 정의할 수 있다. 세 사람 A,B,C가 있을 때 이들의 심리적인 거리는

(A와 B 사이의 심리적인 거리) + (B와 C 사이의 심리적인 거리) + (A와 C 사이의 심리적인 거리)

로 정의한다.

대학교에서 심리학 교수로 일하는 종서는 자신이 가르치는 학생들의 심리적인 특성을 분석하고 싶어한다.

오늘이 생일인 종서를 위해 N명의 학생들의 MBTI 유형이 주어질 때, 가장 가까운 세 학생 사이의 심리적인 거리를 구해보자.

입력

첫 줄에는 테스트 케이스의 수를 나타내는 정수 T가 주어진다.

각 테스트 케이스의 첫 줄에는 학생의 수를 나타내는 하나의 정수 N이 주어지며, 두 번째 줄에는 각 학생의 MBTI 성격 유형을 나타내는 문자열들이 사이에 공백을 두고 주어진다.

출력

각 테스트 케이스에 대한 답을 정수 형태로 한 줄에 하나씩 출력한다.

올해까지 2천문제 푸는걸 목표로 해보자.

추가로 개인적으로 notion에 정리해논 각종 알고리즘들, 풀어보면서 재미있는 문제 리뷰 등 블로그를 좀 활성화 해보자.

+ Recent posts