[Silver III] 오버워치 월드컵 - 13923
성능 요약
메모리: 110848 KB, 시간: 132 ms
분류
구현, 문자열, 브루트포스 알고리즘
제출 일자
2026년 04월 25일 22:04:59
문제 설명
당신은 친구들과 오버워치 월드컵을 보러 갔다. 세계 각국에서 오버워치를 제일 잘하는 사람들이 모여서 오버워치의 최강자를 가리고 있었다.
오버워치 월드컵 경기도 재미있지만 이를 응원하는 것도 오버워치 월드컵의 큰 재미 중에 하나다. 이번 오버워치 월드컵 응원석은 구조가 특이하게 되어있어서, 정사각형 형태의 응원석으로 되어 있었고, 정사각형의 각 변은 오버워치 월드컵 대회에 참가한 팀의 숫자와 동일했다. 또한 사람들은 전부 자신이 응원하는 팀의 티셔츠를 입고 있었다.
응원하는데에는 또 특이한 룰이 있었는데, 응원석의 각 행과 각 열에는 모든 팀의 팬들이 각 한 명씩만 앉아있어야 했다. 사람들은 모두 그 규칙을 지키고 자리에 앉아있는 듯 했으나, 당신은 사람들 중 티셔츠를 잘못 입은 사람이 있다는 것을 깨달았다. 관중석의 사람들의 자리배치도와 각 사람의 티셔츠 팀이 주어졌을 때, 티셔츠를 잘못 입은 사람이 누구인지 그리고 원래대로라면 어떤 팀의 티셔츠를 입어야 하는지 결정하시오.
입력
여러개의 입력이 주어진다. 팀 티셔츠는 대문자 A부터 Z까지 최대 26개의 색깔이 있다고 가정한다. 첫 입력으로 오버워치 월드컵 출전 팀이 몇 개 있는지 N이 주어진다. (3 ≤ N ≤ 26) 다음으로는 N개의 줄에 걸쳐서 관객들이 어떻게 앉아있는지가 주어진다. 각 문자열은 관객들이 행으로 어떻게 앉아있는지 나타내고 문자열의 각 문자는 해당 관객이 어떤 팀의 티셔츠를 입고 있는지 나타낸다.
출력
각 테스트 케이스에 대해 두 정수 R, C와 하나의 문자 V를 출력한다. R, C는 티셔츠를 잘못 입고 온 관객의 위치를 나타내는 열과 행이다. 하나의 V는 원래 해당 관객이 입었어야 할 티셔츠가 나타내는 팀이다. 관객석의 열과 행은 1부터 시작한다. R과 C와 V 사이에 공백을 하나씩 넣어서 출력한다.
💡 해결 방법
💻 코드
# https://www.acmicpc.net/problem/13923
from sys import stdin
input = stdin.readline
uniform = set()
while True:
#입력은 여러개이므로, try - except문을 이용
lines =[]
try:
n = int(input())
except:
break
for x in range(n):
lines.append(input().strip())
translines = list(''.join(tup) for tup in zip(*lines))
# print(type(lines), *lines, sep = '\n')
# print(type(transline), *transline, sep = '\n')
#n은 3이상이므로, 0, 1이 동일하면 그것이 모범 케이스, 다르다면 2가 모범케이스이다
if set(lines[0]) == set(lines[1]):
uniform = set(lines[0])
else:
uniform = set(lines[2])
# print(uniform)
# print(*lines, sep = '\n')
#각 라인을 for로 탐색한다
for x in range(n):
#현재 라인이 모범케이스와 다른경우에 체크, 이떄는 불량라인
if set(lines[x]) != uniform:
# print(x, set(lines[x]), uniform, set(lines[x]) != uniform)
#불량 라인을 for로 돌리며 체크한다
for i in range(n):
#불량라인에서 불량 케이스를 발견한경우
if set(lines[i]) != uniform:
for i2 in range(n):
if set(translines[i2]) != uniform:
#세로, 가로, 모범라인집합 - 현재라인집합을 출력한다 > 이게 문제인가?
print(i + 1, i2 + 1, *(uniform - set(lines[x]) - set(translines[i2])))