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

 

2118번: 두 개의 탑

첫째 줄에 지점의 개수 N(2 ≤ N ≤ 50,000)이 주어진다. 다음 N개의 줄에는 차례로 두 지점 사이의 거리가 양의 정수로 주어진다. 전체 거리의 총 합은 1,000,000,000을 넘지 않는다.

www.acmicpc.net

투포인터 문제다.

 

풀이

문제에 주어지는 두 지점사이의 거리는 시계방향과 반시계 방향 중 짧은 쪽이 거리가 된다고 한다. 즉 시계방향 기준 반시계 방향 거리라 함은 (전체 길이 - 시계방향 거리) 로 계산이 가능하며 해당 지점의 거리는 둘 중 적은 거리로 정해진다는 것이다.

 

시작 인덱스와 끝 인덱스를 생성하여 구간의 길이를 측정한다. 구간의 길이가 최대거리보다 짧거나 같다면, 끝 인덱스를 한칸 늘린다. 반대로 현재 구간의 길이가 최대값보다 크다면, 시작 인덱스를 증가한다. 

 

정답 코드

'Problem Solving > BOJ' 카테고리의 다른 글

[22862] 가장 긴 짝수 연속한 부분 수열 (large)  (0) 2023.01.19
[1484] 다이어트  (0) 2023.01.18
[1652] 누울 자리를 찾아라  (0) 2023.01.16
[15565] 귀여운 라이언  (0) 2023.01.15
[1337] 올바른 배열  (0) 2023.01.14

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

 

1652번: 누울 자리를 찾아라

첫째 줄에 방의 크기 N이 주어진다. N은 1이상 100이하의 정수이다. 그 다음 N줄에 걸쳐 N개의 문자가 들어오는데 '.'은 아무것도 없는 곳을 의미하고, 'X'는 짐이 있는 곳을 의미한다.

www.acmicpc.net

간단한 문자열 탐색 문제다. 문제를 이해하는 시간이 더 길었던 문제다.

 

풀이

문제에 대한 설명이 부실하다고 생각되지만, 내 문해력이 부족한 것이라고 생각해야겠다. 예제를 그림으로 설명하면 다음과 같다.

즉 두 칸 이상의 공간이 생기면 해당공간을 하나의 누울 자리로 취급하겠다는 이야기. 

주의해야 할 사항으로 자리는 벽과 짐으로 구분한다는 것을 잊지 말아야 한다.

 

입력되는 문자열을 기준으로 가로배열과 세로배열을 생성. 두 배열을 "X"문자열을 기준으로 split() 함수를 통해 빈 공간을 탐색하였다.

 

정답 코드

'Problem Solving > BOJ' 카테고리의 다른 글

[1484] 다이어트  (0) 2023.01.18
[2118] 두 개의 탑  (0) 2023.01.17
[15565] 귀여운 라이언  (0) 2023.01.15
[1337] 올바른 배열  (0) 2023.01.14
[10025] 게으른 백곰  (0) 2023.01.13

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

 

15565번: 귀여운 라이언

꿀귀 라이언 인형과, 마찬가지로 꿀귀인 어피치 인형이 N개 일렬로 놓여 있다. 라이언 인형은 1, 어피치 인형은 2로 표현하자. 라이언 인형이 K개 이상 있는 가장 작은 연속된 인형들의 집합의

www.acmicpc.net

기본적인 투포인터 문제다.

 

풀이

head, tail 두 개의 인덱스를 담는 변수와 인형의 개수를 담는 변수를 통해 조건을 판별한다. 개수가 k이상이라면, head를 증가 k보다 작다면 tail을 증가한다. 각 조건마다 head와 tail인덱스에 1이 담겨있는지 확인하여 개수를 갱신한다. 

개수가 k보다 적고, tail이 이미 n이라면, 더 이상 k개의 인형이 없다는 뜻이므로 반복문을 종료한다.

전체를 탐색했는데도 k개의 인형이 없다면 -1을 출력해야 한다는 조건도 까먹지 말자.

 

정답 코드

'Problem Solving > BOJ' 카테고리의 다른 글

[2118] 두 개의 탑  (0) 2023.01.17
[1652] 누울 자리를 찾아라  (0) 2023.01.16
[1337] 올바른 배열  (0) 2023.01.14
[10025] 게으른 백곰  (0) 2023.01.13
[14246] K보다 큰 구간  (0) 2023.01.12

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

 

1337번: 올바른 배열

첫째 줄에 배열의 크기 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 배열의 원소가 한 줄에 하나씩 주어진다. 원소는 1,000,000,000보다 작거나 같은 음이 아닌 정수이

www.acmicpc.net

투 포인터로 접근한 문제다.

 

풀이

기준이 될 인덱스 i는 1부터 n까지, 비교할 인덱스 k는 i+1부터 i+4까지 반복문을 수행. 둘의 차이가 5보다 작다면 올바른 배열로 판정한다.

기준 인덱스 i가 바뀔 때마다 최댓값을 갱신한 뒤, 반복문이 끝나고 나면 값을 출력하면 된다.

 

정답 코드

'Problem Solving > BOJ' 카테고리의 다른 글

[1652] 누울 자리를 찾아라  (0) 2023.01.16
[15565] 귀여운 라이언  (0) 2023.01.15
[10025] 게으른 백곰  (0) 2023.01.13
[14246] K보다 큰 구간  (0) 2023.01.12
[2018] 수들의 합 5  (0) 2023.01.11

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

 

10025번: 게으른 백곰

첫 줄에 정수 N과 K가 들어온다. 둘째 줄부터 N째 줄까지, 공백을 사이에 두고 각 양동이의 얼음의 양을 나타내는 gi와 양동이의 좌표를 나타내는 xi가 주어진다.

www.acmicpc.net

투 포인터, 슬라이딩 윈도우로 접근한 문제다.

 

풀이

투 포인터를 사용하여 곰이 얼음에 닿을 수 있는 최대거리 (2*k+1) 범위의 얼음합을 좌표값 0부터 1000,000까지 탐색을 하면 된다. 단 k의 크기가 500,000을 넘는다면 모든 좌표에 있는 얼음을 가져올 수 있으므로, 입력을 받으면서 얼음의 최댓값을 미리 계산하여 출력하면 된다.

 

정답 코드

'Problem Solving > BOJ' 카테고리의 다른 글

[15565] 귀여운 라이언  (0) 2023.01.15
[1337] 올바른 배열  (0) 2023.01.14
[14246] K보다 큰 구간  (0) 2023.01.12
[2018] 수들의 합 5  (0) 2023.01.11
[1504] 특정한 최단 경로  (0) 2023.01.04

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

 

14246번: K보다 큰 구간

n개의 자연수로 이루어진 수열이 주어질 때, 특정 구간 [i,j](i≤j)의 합이 k보다 큰 모든 쌍 i,j의 개수를 출력하시오.

www.acmicpc.net

투포인터 문제다. 간단한 문제라고 생각하고서 접근했지만, 약간의 시간이 걸린 문제다.

 

풀이

head와 tail 두 개의 변수에 구간 합의 시작 인덱스와 끝 인덱스를 할당. 처음에는 둘 다 0으로 시작한다. 주어지는 수는 무조건 자연수다. 그 이야기는 해당 구간의 합이 k보다 크다면, 그 이후의 구간은 모두 조건을 만족한다는 뜻이다. 조건이 맞는다면 tail에 해당하는 인덱스부터 n까지의 개수를 모두 더해준 뒤, head 인덱스를 증가하여 다시 조건을 탐색. 이런 방법으로 구간을 탐색한다.

만일 sum이 k보다 작고, tail이 더 이상 증가할 수 없는 상황이라면, 반복문을 종료하면 된다.  

 

정답 코드

'Problem Solving > BOJ' 카테고리의 다른 글

[1337] 올바른 배열  (0) 2023.01.14
[10025] 게으른 백곰  (0) 2023.01.13
[2018] 수들의 합 5  (0) 2023.01.11
[1504] 특정한 최단 경로  (0) 2023.01.04
[1238] 파티  (0) 2023.01.04

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

 

2018번: 수들의 합 5

어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1 ≤ N ≤ 10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 알고 싶어한

www.acmicpc.net

기초적인 투포인터 문제다.

 

풀이

1부터 N까지의 수를 오름차순으로 담은 배열을 생성한 뒤, 인덱스를 활용한 구간탐색을 통해 답을 구하면 된다. 시작 인덱스와 끝인덱스는 동일하게 0으로 시작한 뒤, 아래와 같은 조건으로 반복을 수행한다.

  • 누적합이 목표 숫자보다 크다면 시작 인덱스가 가리키는 숫자를 뺀 뒤 시작 인덱스 증가
  • 누적합이 목표 숫자보다 작거나 같다면 끝 인덱스가 가리키는 숫자를 더 해준 뒤 끝 인덱스 증가
  • 누적합이 목표숫자와 같다면 카운트 증가
  • 끝 인덱스가 증가할 부분이 없다면 종료
연속된 수 행동
(없음) 0 +1
1 1 +2
1+2 3 +3
1+2+3 6 +4
1+2+3+4 10 -1
2+3+4 9 -2
3+4 7 +5, cnt++
3+4+5 12 -3
4+5 9 -4
5 5 +6
5+6 11 -5
6 6 +7
6+7 13 -6
7 7 cnt ++, 종료

정답코드

'Problem Solving > BOJ' 카테고리의 다른 글

[10025] 게으른 백곰  (0) 2023.01.13
[14246] K보다 큰 구간  (0) 2023.01.12
[1504] 특정한 최단 경로  (0) 2023.01.04
[1238] 파티  (0) 2023.01.04
[2056] 작업  (0) 2023.01.02

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

 

1504번: 특정한 최단 경로

첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존

www.acmicpc.net

다익스트라 알고리즘 문제. 마찬가지로 Rhyno님이 작성한 힙을 사용했다.

 

풀이

1번에서 n번 정점까지의 최단경로, 하지만 반드시 두지점을 거쳐야 한다는 조건이 붙었다.

[1 -> v1 -> v2 -> n ] 또는 [1 -> v2 -> v1 -> n] 두 가지 최단 경로중 가중치가 더 적은 경로를 반환하면 된다. 1번 정점에서 각 정점으로 향하는 최단경로, v1 정점에서 각 정점으로 향하는 최단경로, v2 정점에서 각 정점으로 향하는 최단경로 총 다익스트라 3번을 돌린 뒤 각 가중치를 적절히 조합해서 반환하면 된다.

 

하지만 여기서 경로가 없는 조건에 대해 처리해주어야 하므로 이 부분만 신경 써준다면 정답을 받을 수 있다. 본인의 경우 최단경로를 담은 배열을 -1로 초기화한뒤 다익스트라를 통해 갱신하였는데, 아무리 조건을 신경 써서 제출해도 오답판정을 받아 결국 계산 가능한 가중치의 최댓값인 2억으로 초기화하며 예외처리하였다.

 

정답 코드

'Problem Solving > BOJ' 카테고리의 다른 글

[14246] K보다 큰 구간  (0) 2023.01.12
[2018] 수들의 합 5  (0) 2023.01.11
[1238] 파티  (0) 2023.01.04
[2056] 작업  (0) 2023.01.02
[14567] 선수과목  (0) 2023.01.01

+ Recent posts