[백준] CLASS 3 달성하기 5일차

이진규·2022년 7월 13일
1

백준(PYTHON)

목록 보기
51/115

1. 단지번호붙이기(BFS)

링크 : https://www.acmicpc.net/problem/2667

from sys import stdin
from collections import deque
input = stdin.readline

n = int(input())
pan = [ list(input().rstrip()) for _ in range(n) ]
visited = [ [False] * n for _ in range(n) ]
answer = []

dx, dy = [0, 0, -1, 1], [-1, 1, 0, 0]
def bfs(x, y):
    visited[x][y] = True
    cnt = 1
    q = deque([(x, y)])

    while q:
        px, py = q.popleft()

        for k in range(4):
            mx = px + dx[k]
            my = py + dy[k]

            if 0 <= mx < n and 0 <= my < n:
                if pan[mx][my] == '1' and not visited[mx][my]:
                    visited[mx][my] = True
                    cnt += 1
                    q.append((mx, my))

    return cnt

for i in range(n):
    for j in range(n):
        if pan[i][j] == '1' and not visited[i][j]:
            res = bfs(i, j)
            answer.append(res)

print(len(answer))
for i in sorted(answer):
    print(i)

2. AC(★문자열)

링크 : https://www.acmicpc.net/problem/5430

from sys import stdin

input = stdin.readline

T = int(input())

for _ in range(T):
    p = input()
    n = int(input())
    reverse_flag = False
    break_flag = False

	# '[', ']', ',' 문자열 처리하는 부분
    arr = input()
    arr = arr.replace('[', '')
    arr = arr.replace(']', '')
    arr = list(arr.rstrip().split(','))

    for i in p:
        if i == 'R': # 뒤집는 횟수가 2의 배수이면 같은 결과 이므로 flag로 기록
            reverse_flag = not reverse_flag
        elif i == 'D':
        	# 1. D -> 0 -> [] 결과 : error 
            # 2. R -> 0 -> [] 결과 : [] 이 나와야 하므로 밑의 if문이 중요하다.
            # 1.의 경우 배열 내에 ['']와 같이 빈 문자열이 생겨 이 부분을 처리해줘야 함.
            if not arr or arr[0] == '': 
                print("error")
                break_flag = True
                break
            else:
                if reverse_flag:
                    arr.pop()
                else:
                    arr.pop(0)


    if not break_flag:
        if reverse_flag:
            arr.reverse()
        print('[' + ','.join(arr) + ']')

3. IOIOI(★문자열)

링크 : https://www.acmicpc.net/problem/5525

50점 코드(이중 반복문 이용 - 시간 복잡도 오버)

from sys import stdin
input = stdin.readline

n = int(input())
m = int(input())
letter = list(input().rstrip())
cnt = 0

for i in range(m - (2*n)):

    if letter[i] == 'I':
        T = 'O'

        for j in range(i+1, i+(2*n)+1):
            if letter[j] == T:
                if T == 'I':
                    T = 'O'
                else:
                    T = 'I'
            else:
                break
        else:
            cnt += 1

print(cnt)

100점 코드(투 포인터 이용)

from sys import stdin
input = stdin.readline

n = int(input())
m = int(input())
letter = input().rstrip()
left, right = 0, 0
cnt = 0

while right < m:

    if letter[right:right+3] == "IOI":
        right += 2
        if right - left == (2 * n):
            cnt += 1
            left += 2
    else:
        right += 1
        left = right

print(cnt)

4. 카잉달력(수학)

링크 : https://www.acmicpc.net/problem/6064

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글