[BOJ] 10709. 기상캐스터

Jimeaning·2023년 4월 11일
0

코딩테스트

목록 보기
74/143

Python3

문제

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

키워드

  • 구현

문제 풀이

문제 요구사항

  • 모든 구름은 1분이 지날 때마다 1킬로미터씩 동쪽(왼->오른)으로 이동한다
  • 지금부터 몇 분후에 처음으로 구역 (i, j) 에 구름이 뜨는지를 표시한다
  • 처음부터 구역 (i, j) 에 구름이 떠 있었던 경우에는 0을, 몇 분이 지나도 구름이 뜨지 않을 경우에는 -1을 출력한다

변수 및 함수 설명

h, w = H × W개의 구역을 의미한다
s = 구름이 있는 경우 c, 없는 경우 . 으로 표현한다
c_flag = 구름이 있었는지 없었는지 0과 1로 판단한다
cloud = 구름의 개수이다

로직

  1. h행만큼 반복한다

    • 구름의 유무를 s 문자열로 입력받는다
    • c_flag는 0으로, cloud는 -1로 초기화한다

    1. s문자열 내 반복문
    • 만약 c (구름이 있다면)
      1) 만약 구름이 새로 떴다면 (c_flag는 1)
      cloud 변수에 0을 대입한다.
      2) 전 구름이 흘러가는중이면
      cloud 변수를 1 증가시키고, c_flag에 1을 넣는다.
    • 현재 구름이 없는데(.) 흘러들어온 구름이 있으면
      cloud 변수에 1을 증가시킨다

    구름 한 행을 출력한다.

최종 코드

h, w = map(int, input().split())

for i in range(h):
    s = input()
    c_flag = 0
    cloud = -1
    
    for j in s:
        if j == 'c':
            if c_flag == 1:
                cloud = 0
            else:
                cloud += 1
                c_flag = 1
        elif j == '.' and c_flag == 1:
            cloud += 1
        print(cloud, end=' ')   
    print()

업데이트

(23.4.14 추가)

h, w = map(int, input().split())

for i in range(h):
    s = input()
    cloud = -1
    c_flag = 0
    
    for j in range(len(s)):
        if s[j] == 'c':
            if c_flag == 1:
                cloud = 0
            else:
                cloud += 1
                c_flag = 1
        else:
            if c_flag == 1:
                cloud += 1
            else: c_flag = 0

        print(cloud, end=' ')
    print()

구름이 들어오지 않을 때, 즉 '.' 이 들어 왔을 때를 수정한 코드이다.
조건식을 통해서 어떤 처리를 하는지 시각적으로 보여주거나(최종 코드),
구름이 들어 왔을 때처럼 두 개의 경우로 나누어서 대칭적으로 적거나(수정 코드)
편한 대로 하면 될 것 같다.
최종 & 수정 코드 모두 시간 복잡도와 메모리 사용량은 같음!

(+23/5/19)

h, w = map(int, input().split())

ans = [[-1 for _ in range(w)] for _ in range(h)]

for i in range(h) :
    c = input()
    
    for j in range(w) :
    	# 구름이 뜬 경우는 0
        if c[j] == 'c' :
            ans[i][j] = 0
        # 구름이 뜨지 않은 경우
        else :
        	# 구름이 전에 뜬 경우
            if j > 0 and ans[i][j-1] >= 0 : # 전에 구름이 떴다면 리스트에 0 이상의 수가 담겨 있다
                ans[i][j] = ans[i][j-1] + 1
            # 전에 뜬 구름도 없는 경우
            else : ans[i][j] = -1
            
for i in range(h) :
    for j in range(w) :
        print(ans[i][j], end=' ')
    print()

미리 구름이 뜨는 리스트를 만들어 놓고 -1로 초기화한다.

시간 60ms에서 48ms까지 낮춤

피드백

스스로 풀어서 맞췄다!

profile
I mean

0개의 댓글