본문 바로가기

컴퓨터과학/Algorithm

[Python] [백준] 2890번 카약

 

2890번: 카약

첫째 줄에 R과 C가 주어진다. 다음 R개 줄에는 '.', 'S', 'F', '1'~'9'로 이루어진 위성 지도가 주어진다. 한 줄에는 최대 한 개의 카약만 있고, 위성 사진에 있는 카약은 항상 9개이다. (10 ≤ R, C ≤ 50)

www.acmicpc.net

문제

상근이는 카약 대회를 개최했다. 대회는 전세계에 생중계되고, 위성이 경기장 전체를 촬영하고 있다. 상근이는 위성 사진을 바탕으로 실시간 순위를 계산하는 프로그램을 만들려고 한다.

위성 사진은 R행 C열이다. 모든 줄의 첫 번째 글자는 'S'이고 출발선을 의미한다. 또, 마지막 글자는 'F'이고 이것은 결승선을 의미한다. 대회에 참가한 팀은 총 9팀이고, 각 팀은 1부터 9까지 번호가 매겨져 있다. 카약은 항상 열에 대해 연속하는 세 칸을 차지하며, 카약 번호로 표시한다. 마지막으로 물은 '.'로 나타나 있다.

팀의 순위는 결승선으로부터 떨어진 거리로 측정한다. 가까울수록 순위가 높다. 만약, 두 팀이 결승선과 떨어진 거리가 같다면, 같은 등수이다.

입력

첫째 줄에 R과 C가 주어진다. 다음 R개 줄에는 '.', 'S', 'F', '1'~'9'로 이루어진 위성 지도가 주어진다. 한 줄에는 최대 한 개의 카약만 있고, 위성 사진에 있는 카약은 항상 9개이다. (10 ≤ R, C ≤ 50)

출력

출력은 총 9줄을 해야 한다. i번째 줄에는 i번 팀의 등수를 출력한다. (i=1~9)

예제

예제 입력1 예제 출력1
10 10
S.....111F
S....222.F
S...333..F
S..444...F
S.555....F
S666.....F
S.777....F
S..888...F
S...999..F
S........F
1
2
3
4
5
6
5
4
3
10 15
S..........222F
S.....111.....F
S...333.......F
S...555.......F
S.......444...F
S.............F
S......777....F
S..888........F
S........999..F
S...666.......F
5
1
6
3
6
6
4
7
2

코드

import re

R, C = map(int, input().split())
res = [-1]*9

for _ in range(R):
    S = re.split('[1-9]{2}', input())
    if S[0].count('.') != (C - 2):
        res[int(S[1][0])-1] = ((C - 5) - S[0].count('.'))


#Rank
dict = {}
rank = 1
for num in sorted(res):
    if num not in dict:
        dict[num] = rank
        rank += 1
rank_list = [dict[i] for i in res]

for i in rank_list:
    print(i)

 

설명

좀 억지로 푼 감이 없잖아 있는데… 어쨌건

 

카약은 항상 9대이므로 길이 9만큼의 리스트를 만들어 준 후, 리스트의 인덱스(index-1)를 팀 번호로 삼았다.

그 후, 정규표현식을 사용해서 입력값을 둘로 쪼갰다. 예컨대, 입력값이 'S......777....F'이라면 ['S......', '7....F']식이다. 쪼갠 값으로 팀 번호와 결승선까지의 길이를 구해 처음 만든 리스트에 저장했다. (카약이 없는 레일은 제쳤다.)

그 후 딕셔너리를 이용하여 순서를 구해 출력했다.