alpyrithm_알파이리즘

[알고리즘][Python] 백준(BOJ) 2816 디지털 티비_파이썬 본문

Algorithm/백준 알고리즘_Python

[알고리즘][Python] 백준(BOJ) 2816 디지털 티비_파이썬

알파이 2020. 8. 5. 08:18

 

2816 디지털 티비    https://www.acmicpc.net/problem/2816

 

2816번: 디지털 티비

문제 2012년 12월 31일 새벽 4시부터 지상파 아날로그 TV방송이 종료되었다. TV를 자주보는 할머니를 위해서, 상근이네 집도 디지털 수신기를 구입했다. 원래 상근이네 집에는 KBS1과 KBS2만 나왔다. ��

www.acmicpc.net

 

 

 

 

 

 

 

 

문제 풀기 전 공부할 것 : 문자열 처리, 그리디 알고리즘

 

 

 

 

 

문제 힌트 : 예제 입력 1을 넣었을 때 예제 출력 1로 반드시 출력되지 않아도 괜찮다. 본인의 규칙대로 KBS1과 KBS2를 첫 번째 두 번째 있도록 만들면 된다.

 

 

 

 

 

 

 

 

 

 

풀이 1

<내용>

- KBS1를 첫 번째로, KBS2를 두 번째로 순서를 바꾸는 방법을 구하는 것으로 1, 2, 3, 4번을 모두 사용할 필요가 없다.

- 1, 4번 버튼을 이용해서 해결할 계획이다.

- 1번을 이용해서 KBS1, KBS2가 있는 곳으로 화살표를 보낸다.

- 4번을 이용해서 KBS1과 KBS2를 위의 채널과 바꾸면서 첫 번째, 두 번째로 향하도록 한 칸씩 올린다.

- KBS1, KBS2를 순차적으로 진행한다.

- 단, KBS1이 KBS2보다 아래에 있을 때 KBS1을 올리면서 KBS2를 내리므로 KBS2의 위치가 한 칸 더 내려감을 주의한다.

 

 

<코드>

n = int(input())
channel = []
for i in range(n):
    name = input()
    if name == 'KBS1':
        idx1 = i
    elif name == 'KBS2':
        idx2 = i
    channel.append(name)
    
res = ''
res += '1' * idx1   # KBS1이 있는 곳으로 1번을 이용해서 화살표를 내린다.
res += '4' * idx1   # KBS1을 4번을 이용해서 첫 번째로 보낸다.(화살표는 첫 번째(index=0)을 가리킨다.)
if idx1 > idx2:     # KBS1이 KBS2보다 아래에 있으면 KBS1을 첫 번째로 보내는 과정을 통해 KBS2의 위치가 하나 낮아졌다.(index는 1 증가)
    idx2 += 1
res += '1' * idx2      # KBS2가 있는 곳으로 1번을 이용해서 화살표를 내린다.
res += '4' * (idx2-1)   # KBS2를 4번을 이용해서 두 번째로 보낸다.(첫 번째가 아닌 두 번째로 이동하면 되므로 idx2-1만큼 실행)
print(res)

 

+) 코드를 간결하게 만들기

 

 

 

 

 

 

 

 

풀이 2

<내용>

- 위의 코드에서 channel list를 for문으로 입력받고 index를 list.index()를 이용해 찾았다.

- KBS1의 위치가 KBS2의 위치보다 아래에 있을 경우 idx2를 1 증가시킨다.

- 그리고 위의 논리와 같이 1, 4를 적절하게 반복하도록 한다.

 

 

 

<코드>

n = int(input())
channel = [input() for _ in range(n)]
idx1, idx2 = channel.index('KBS1'), channel.index('KBS2')

if idx1 > idx2:
    idx2 += 1
    
print('1'*idx1 + '4'*idx1 + '1'*idx2 + '4'*(idx2-1))

 

 

 

 

 

 

728x90
반응형
Comments