[Python/백준] #3085 -[사탕게임]

2021. 11. 19. 02:39·코딩테스트/백준[Python]

[사탕게임]-3085번

 

3085번: 사탕 게임

예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다.

www.acmicpc.net

My answer

def init(board,n,sums):
    cnt=1
    for i in range(n):
        for j in range(n-1):
            if(board[i][j]==board[i][j+1]):
                cnt+=1
            else:
                sums.append(cnt)
                cnt=1
        if(cnt!=1):
            sums.append(cnt)
            cnt=1
    return sums
    
def calc(board,n,sums):
    tmp=copy.deepcopy(board)
    for i in range(n):
        for j in range(n-1):
            if(tmp[i][j]!=tmp[i][j+1]):
                tmp[i][j],tmp[i][j+1]=tmp[i][j+1],tmp[i][j]
                coltmp=[k[j] for k in tmp]
                sums=main(coltmp,n,sums)
                coltmp=[k[j+1] for k in tmp]
                sums=main(coltmp,n,sums)
                coltmp=tmp[i]
                sums=main(coltmp,n,sums)
                tmp=copy.deepcopy(board)

def main(arr,n,sums):
    cnt=1
    for i in range(n-1):
        if(arr[i]==arr[i+1]):
            cnt+=1
        else:
            sums.append(cnt)
            cnt=1
    if(cnt!=1):
        sums.append(cnt)
        cnt=1
    return sums

import copy             # copy 모듈을 가져옴

n=int(input())
board,sums = [],[]
# 필수부분:board를 이중리스트로 만듦
for i in range(n):
    tmp=input()
    tmp=[i for i in tmp]
    board.append(tmp)    
# 처음옮기기 전 최대먹을 수 있는 사탕개수를 세기    
init(board,n,sums)        
board = list(map(list, zip(*board)))
init(board,n,sums)
calc(board,n,sums) #같은 행에 있는 것끼리 바꾸기(좌우)  
board = list(map(list, zip(*board))) #board 전치
calc(board,n,sums) #같은 행에 있는 것끼리 바꾸기(상하)
print(max(sums))

Another answer

n=int(input())
a=[list(input()) for _ in range(n)]
result=1
def check():
	global result
	for i in range(n):
		cnt=1
		for j in range(1,n):
			if a[i][j]==a[i][j-1]:
				cnt+=1
				result=max(cnt,result)
			else:
				cnt=1
	for i in range(n):
		cnt=1
		for j in range(1,n):
			if a[j][i]==a[j-1][i]:
				cnt+=1
				result=max(cnt,result)
			else:
				cnt=1
for i in range(n):
	for j in range(1,n):
		if a[i][j]!=a[i][j-1]:
			a[i][j],a[i][j-1]=a[i][j-1],a[i][j]
			check()
			a[i][j],a[i][j-1]=a[i][j-1],a[i][j]
		if a[j][i]!=a[j-1][i]:
			a[j][i],a[j-1][i]=a[j-1][i],a[j][i]
			check()
			a[j][i],a[j-1][i]=a[j-1][i],a[j][i]
print(result)
더보기

나는 내 코드가 길고 쓸데없이 반복되는게 많아서 그냥 무식하게 푼 줄 알았는데, 원래 이렇게 푸는건가보다. 아래와 나랑 다른점은 난 board를 아예 전치시켜서 했는데 왜 그렇게 했지?그냥 i랑 j랑 바꿔서 풀면됐는데 그거 땜에 메모리도 많이 잡아먹고 시간도 함수를 한번씩 더 실행시키느라 오래걸렸나보다. 내일 수정해봐야겠다.

728x90

'코딩테스트 > 백준[Python]' 카테고리의 다른 글

[Python/백준] #2447 - [별 찍기-10]  (0) 2021.11.21
[Python/백준] 기초문제들 2  (0) 2021.11.20
[Python/백준] #1062 - [가르침] [try_again]  (0) 2021.11.16
[Python/백준] #14719 - [빗물]  (0) 2021.11.15
[Python/백준] #14888 - [연산자 끼워넣기] / #2504 -[괄호의 값]  (0) 2021.11.12
'코딩테스트/백준[Python]' 카테고리의 다른 글
  • [Python/백준] #2447 - [별 찍기-10]
  • [Python/백준] 기초문제들 2
  • [Python/백준] #1062 - [가르침] [try_again]
  • [Python/백준] #14719 - [빗물]
창빵맨
창빵맨
  • 창빵맨
    Let's be Developers
    창빵맨
    로그인/로그아웃
  • 전체
    오늘
    어제
    • 분류 전체보기 (471)
      • 알쓸신잡 (79)
      • ML & DL (85)
        • Computer v.. (22)
        • NLP (22)
        • 파이썬 머신러닝 완.. (3)
        • 개념정리 (38)
      • 리눅스 (21)
      • 프로젝트 (29)
        • 산불 발생 예측 (6)
        • 음성비서 (12)
        • pdf 병합 프로그.. (0)
        • 수위 예측 (5)
        • 가짜 뉴스 분류 (5)
        • 전력사용량 예측 (1)
      • 코딩테스트 (217)
        • 프로그래머스[Pyt.. (17)
        • 프로그래머스[Fai.. (3)
        • 백준[Python] (160)
        • 이것이취업을위한코딩.. (18)
        • 파이썬 알고리즘 (19)
      • 데이터분석실습 (25)
        • 데이터 과학 기반의.. (18)
        • 헬로 데이터 과학 (7)
      • 메모장 (0)
      • 잡담 (4)
  • Personal

    GITHUB
    Instagram
  • 공지사항

  • 인기 글

  • 태그

    나동빈
    그리디
    BFS
    백준
    이코테
    이분탐색
    dp
    DFS
    이것이취업을위한코딩테스트다
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3

HOME

HOME

상단으로

티스토리툴바