본문 바로가기
코딩/백준

알고리즘 - Python / 백준 - 14397번 : 해변

반응형

14397번: 해변 (acmicpc.net)

 

14397번: 해변

단위 정육각형 이루어져 있는 지도가 주어졌을 때, 해변의 길이를 구하는 프로그램을 작성하시오. 해변은 정육각형의 변 중에서 한 쪽은 물인데, 한 쪽은 땅인 곳을 의미한다.

www.acmicpc.net

 


난이도 치고 제출이 적은 것 같아 궁금해서 풀어본 문제 , 어렵진 않았지만 조금 귀찮은 방법으로 풀었었다.

 

풀이

  • 한줄씩 입력받은 지형을 2차원 배열에 저장한다.
  • 육지와 바다 타일이 육각형 이므로 홀수줄과 짝수줄을 분리하여 위 , 아래 , 좌우의 해변 수를 센다.
  • 연산 방향이 왼쪽에서 오른쪽 , 위에서 아래 이므로 중복되지 않도록 연산방향에 해당되는 해변 수만 체크한다.

 

import sys

count = int(0)
n , m = map(int , sys.stdin.readline().split())
stack = []
for i in range(0,n):
  a = list(map(str , sys.stdin.readline()))
  a.pop()
  stack.append(a)

for i in range(0,n):
  for t in range(0,m-1):
    if (stack[i][t] == "." and stack[i][t+1] == "#") or (stack[i][t] == "#" and stack[i][t+1] == "."):
      count += 1

for i in range(0,n-1):
  if i%2 == 0:
    if (stack[i][0] == "." and stack[i+1][0] == "#") or (stack[i][0] == "#" and stack[i+1][0] == "."):
      count += 1
    for t in range(1,m):
      if (stack[i][t] == "." and stack[i+1][t] == '#') or (stack[i][t] == "#" and stack[i+1][t] == '.'):
        count += 1
      if (stack[i][t] == "." and stack[i+1][t-1] == '#') or (stack[i][t] == "#" and stack[i+1][t-1] == '.'):
        count += 1
  else:
    for t in range(0,m-1):
      if (stack[i][t] == "." and stack[i+1][t] == '#') or (stack[i][t] == "#" and stack[i+1][t] == '.'):
        count += 1
      if (stack[i][t] == "." and stack[i+1][t+1] == '#') or (stack[i][t] == "#" and stack[i+1][t+1] == '.'):
        count += 1
    if (stack[i][m-1] == "." and stack[i+1][m-1] =="#") or (stack[i][m-1] == "#" and stack[i+1][m-1] =="."):
      count += 1

print(count)

 

비슷한 문제

 

알고리즘 - Python / 백준 - 2115번 : 갤러리 (tistory.com)

 

알고리즘 - Python / 백준 - 2115번 : 갤러리

2115번: 갤러리 (acmicpc.net) 2115번: 갤러리 첫째 줄에 갤러리의 세로 길이 M과 가로 길이 N이 주어진다. (1<=M, N<=1,000) 다음 M개의 줄에는 각각 N개의 문자가 주어진다. 문자는 'X' 또는 '.'이며 'X'는 벽을

ddggblog.tistory.com

 


 

 

 

반응형