본문 바로가기
코딩테스트

[Python] 백준 3100번 - '국기 인식' 풀이

by CuckooBird 2023. 1. 19.

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

 

3100번: 국기 인식

희원이는 국기 인식 시스템을 만들었다. 이 알고리즘은 국기를 6*9크기의 행렬로 필터링 시킨 뒤, 인식한다. 행렬에는 색을 나타내는 알파벳 대문자가 있다. 이 시스템은 아직 개발 초기 단계이

www.acmicpc.net


코드

정답이 안 뜨지만 예제는 잘 돌아가는 코드입니다...

정답은 https://hsin.hr/2010/index.html > School Competition 18th February 2010 > Seniors > Solutions 에서 C++코드로 확인 가능합니다.

import sys
flag = []
horiziontal_f = [[] for i in range(3)]
vertical_f = [[] for i in range(3)]
for r in range(6):
    flag += list(sys.stdin.readline().rstrip().rsplit())
    for c in range(9):
        horiziontal_f[r//2] += flag[r][c]
        vertical_f[c//3] += flag[r][c]

data_dic = dict()
row_ans = 0
col_ans = 0
for i in range(3):
    for str in horiziontal_f[i]:
        if str in data_dic:
            data_dic[str] += 1
        else:
            data_dic[str] = 1
    row_ans += horiziontal_f[i].count(max(data_dic, key=data_dic.get))
    data_dic.clear()

    for str in vertical_f[i]:
        if str in data_dic:
            data_dic[str] += 1
        else:
            data_dic[str] = 1
        
    col_ans += vertical_f[i].count(max(data_dic, key=data_dic.get))
    data_dic.clear()
print(6*9 - max(row_ans, col_ans))

이렇게 수평방향과 수직방향의 배열을 만들었습니다.

후에 딕셔너리를 이용하여 row_n, col_n에는 각각의 배열에 가장 많은 문자의 개수를 행 따로, 열 따로 누적하여 저장했습니다. 마지막에 그 중 큰 값을 6*9에 빼어 정답을 구했습니다.


후기

어렵게 찾은 정답이었지만 c++로 작성된 코드라 이해도 어렵더라고요... c++을 배웠으면 좋았을텐데... 예제가 다 돌아가는데도 정답이 안 뜨는 이유는 틀려서가 아니라 제출한 사람도 정답인 사람도 적어서 정답 케이스도 적은게 아닐까요...