문제
풀이 (Python)
n=int(input())
arr=list(input())
def check(): #전체 원소가 같은 색깔인지 점검하는 함수
for i in range(1,len(arr)):
if arr[i-1]!=arr[i]:
return False
return True
def paint_count():
arr_B,arr_R,result=0,0,0
if len(arr)==1 or check(): #예외처리 arr가 1개만 입력되거나 전체 원소가 같은 색깔일때
return False
for i in range(1,len(arr)):
if arr[i-1]!=arr[i]: #연속적으로 가다가 색깔이 달라지는지
if arr[i-1]=="B": #달라 지는 경우 달라지기 전 까지 연속된 색깔에 count++
arr_B+=1
else:arr_R+=1
if arr[-1]=="B":arr_B+=1 #마지막 원소는 위의 for문에 포함이 안되기 떄문에 if문으로 한번더 처리
else:arr_R+=1
result=1+min(arr_B,arr_R) #첫 원소를 칠할 때 1+ B로 칠할지 R로 칠할지 min값
print(result)
return True #예외처리가 아닌경우 정상적 return
if not paint_count(): #예외처리로 위의 함수가 종료된 경우 1출력
print(1)
설명 (Python)
블로그2 문제는 목적이 2가지 색 중 하나로 칠해져 있는 리스트를 같은 색으로 통일하여 색칠하는 것이다.
한 번에 연속된 한 색깔만 칠할 수 있으므로 최소의 색칠수를 구하기 위해서는
한 가지 연속으로 된 색깔 블록이 무슨 색으로 몇 개가 있는지 파악하는 것이 중요하다.
연속된 색깔 블록을 판단하기 위해 다음과 같은 코드로 작성하였다.
for i in range(1,len(arr)):
if arr[i-1]!=arr[i]: #연속적으로 가다가 색깔이 달라지는지
if arr[i-1]=="B": #달라 지는 경우 달라지기 전 까지 연속된 색깔에 count++
arr_B+=1
else:arr_R+=1
색깔 블록이 B가 더 적은 경우 B로 칠해야 하고, 색깔 블록 R이 더 적은 경우 R로 칠해야 하기 때문에 각각 색깔블록의 개수인 arr_B, arr_R을 통해 개수를 저장해 둔다.
위의 for문을 통해 색깔블록 개수를 arr_B와 arr_R에 저장했을 때 맨 끝 원소는 체크를 못하기 때문에 따로 확인하여야 한다. 그렇기 때문에 마지막 원소와 마지막 전 원소를 비교하여 달라졌는지 확인 후 맞는 색깔에 개수를 추가해 준다.
arr_B와 arr_R 중에 적은 수를 색칠하는 것이 최소의 경우의 수 이므로 min(arr_B, arr_R)와 어떤 색이든 한번 무조건 색칠하므로 +1을 해준다. 해당 논리의 코드는 아래와 같다.
if arr[-1]=="B":arr_B+=1 #마지막 원소는 위의 for문에 포함이 안되기 떄문에 if문으로 한번더 처리
else:arr_R+=1
result=1+min(arr_B,arr_R) #첫 원소를 칠할 때 1+ B로 칠할지 R로 칠할지 min값
그리고 또한 원소가 1개만 입력되거나 전부 다 같은 색깔로 칠해져 있는 경우 시간 단축과 for문에는 원소가 2개 이상 가정하에 작성되었기 때문에 따로 예외처리하여 작성하였다.
def check(): #전체 원소가 같은 색깔인지 점검하는 함수
for i in range(1,len(arr)):
if arr[i-1]!=arr[i]:
return False
return True
if len(arr)==1 or check(): #예외처리 arr가 1개만 입력되거나 전체 원소가 같은 색깔일때
return False
그리고 이와 같은 논리 과정을 전부 paint_count() 함수에 넣고 작성하였는데 예외처리 시에 바로 return False를 통해 함수를 빠져나오기 위해 함수를 사용하여 작성하였다.
if not paint_count(): #예외처리로 위의 함수가 종료된 경우 1출력
print(1)
'Baekjoon' 카테고리의 다른 글
[백준] 2839번 설탕 배달 (파이썬) (0) | 2023.09.19 |
---|---|
[백준] 14916번 거스름돈 (파이썬) (0) | 2023.09.19 |
[백준] 20115번 에너지 드링크 (파이썬) (0) | 2023.09.19 |
[백준] 1343번 폴리오미노 (파이썬) (0) | 2023.09.19 |
[백준] 28278번 스택 2 (파이썬) (0) | 2023.09.07 |