포스트

백준 24025 돌의 정령 줄세우기 문제 풀이

백준 24025 돌의 정령 줄세우기 문제 풀이

문제 파악하기

문제의 요구사항은 제시된 “시야 점수와 관련된 정수”의 조건에 충족되는 배치를 출력하는 것입니다.

오른쪽을 바라보고 있는 각 돌의 정령들이 가질 수 있는 시야 점수는 j-i로 정의되어있는데, 주의할 점은 입력으로 들어오는 값이 시야 점수는 아니라는 것입니다.

정의상 시야점수는 양수만 나타날 수 있으나, 예제 입력들을 확인하면 음수 값도 주어짐을 알 수 있습니다.

“Ai가 음수라면 시야점수는 -Ai”라고 표현한 데에서 시야 점수는 항상 양수이고 ±는 다른 의미를 가지고 있음을 파악합니다.

이어지는 지문에서 값 Ai가 양수라면 시야점수는 |Ai| 이상이 되게, 음수라면 |Ai| 이하가 되게 배치하면 된다는 언급으로 ±의 의미를 확인할 수 있습니다.

문제 풀어보기

자신의 시야에 막힘이 없으면 시야 점수를 1e9로 정의한다라는 조건을 주목할 필요가 있습니다.

이 조건에 기반하여 다음과 같은 전략을 취할 수 있기 때문입니다.

  • Ai가 양수라면 시야에 막힘이 없도록 배치 (1e9)
  • Ai가 음수라면 시야가 바로 막히도록 배치 (1)

위 전략은 “양수는 이상, 음수는 이하가 되게 한다”라는 조건에 항상 부합하게 할 수 있습니다.

다시 정리해서 우선, Ai가 양수만 있을때 아래와 같이 배치할 수 있습니다.

이와 같은 배치는 쉽게 구현할 수 있습니다.

1
2
3
replace = [0] * n
for i in range(1, n):
    replace[-i] = i

파이썬으로 간단하게 표현했는데, 어쨌든 뒤에서부터 증가하도록 작성합니다.

Ai에 음수가 포함되어있다면 i번째 값이 주변보다 작게 작성하면 됩니다.

하지만 돌의 정령의 키는 중복되면 안되는 모양이므로 주변보다 1 작다거나 하는 전략은 나중에 처리하기 귀찮아질 수도 있습니다.

1
2
3
4
5
6
7
8
9
10
11
n = 5
requires = [2, -2, 4, 1, 2]
replace = [0] * n
incr, desc = 1, 0
for i in range(n):
    if requires[-i] > 0:
        replace[-i] = incr
        incr += 1
    else:
        replace[-i] = desc
        desc -= 1

따라서 위와 같이 모든 값이 유일하도록 작성합니다.

다만 키 값은 0 이하일 수 없으므로 출력 시 desc를 offset으로 사용해야 합니다.

1
print(replace[i] - desc + 1)

답안 구현

이 문제는 이해하는데 시간을 들여야 해서 어려운 문제이지, 풀이 과정이 어렵진 않은 것 같습니다.

24025 C++ 답안