반응형

https://pypi.org/project/jaconv/

 

jaconv

Pure-Python Japanese character interconverter for Hiragana, Katakana, Hankaku, Zenkaku and more

pypi.org

다운로드

pip install jaconv

 

기능

히라가나 -> 가타카나 전환

가타카나 -> 히라가나 전환

가능하다

 

영어 -> 히라가나

히라가나 -> 영어 기능도 제공한다고 위키에는 나와 있으나,

실험해보니 해당 기능은 부족한 부분이 있는 것으로 보인다

 

import jaconv

# Hiragana to Katakana
jaconv.hira2kata('ともえまみ')
# => 'トモエマミ'

# Hiragana to half-width Katakana
jaconv.hira2hkata('ともえまみ')
# => 'トモエマミ'

# Katakana to Hiragana
jaconv.kata2hira('巴マミ')
# => '巴まみ'

# half-width character to full-width character
# default parameters are followings: kana=True, ascii=False, digit=False
jaconv.h2z('ティロ・フィナーレ')
# => 'ティロ・フィナーレ'

# half-width character to full-width character
# but only ascii characters
jaconv.h2z('abc', kana=False, ascii=True, digit=False)
# => 'abc'

# half-width character to full-width character
# but only digit characters
jaconv.h2z('123', kana=False, ascii=False, digit=True)
# => '123'

# half-width character to full-width character
# except half-width Katakana
jaconv.h2z('アabc123', kana=False, digit=True, ascii=True)
# => 'アabc123'

# an alias of h2z
jaconv.hankaku2zenkaku('ティロ・フィナーレabc123')
# => 'ティロ・フィナーレabc123'

# full-width character to half-width character
# default parameters are followings: kana=True, ascii=False, digit=False
jaconv.z2h('ティロ・フィナーレ')
# => 'ティロ・フィナーレ'

# full-width character to half-width character
# but only ascii characters
jaconv.z2h('abc', kana=False, ascii=True, digit=False)
# => 'abc'

# full-width character to half-width character
# but only digit characters
jaconv.z2h('123', kana=False, ascii=False, digit=True)
# => '123'

# full-width character to half-width character
# except full-width Katakana
jaconv.z2h('アabc123', kana=False, digit=True, ascii=True)
# => 'アabc123'

# an alias of z2h
jaconv.zenkaku2hankaku('ティロ・フィナーレabc123')
# => 'ティロ・フィナーレabc123'

# normalize
jaconv.normalize('ティロ・フィナ〜レ', 'NFKC')
# => 'ティロ・フィナーレ'

# Hiragana to alphabet
jaconv.kana2alphabet('じゃぱん')
# => 'japan'

# Alphabet to Hiragana
jaconv.alphabet2kana('japan')
# => 'じゃぱん'

# Katakana to Alphabet
jaconv.kata2alphabet('ケツイ')
# => 'ketsui'

# Alphabet to Katakana
jaconv.alphabet2kata('namba')
# => 'ナンバ'

# Hiragana to Julius's phoneme format
jaconv.hiragana2julius('てんきすごくいいいいいい')
# => 't e N k i s u g o k u i:'

히라가나 - 가타카나 가타카나 - 히라가나 전환만 필요한 경우 해당 라이브러리를 이용하면 편리하다

반응형
반응형

python으로 pip 설치를 진행하다가 에러가 발생하였다

 

에러

[notice] A new release of pip is available: 24.2 -> 24.3.1
[notice] To update, run: python.exe -m pip install --upgrade pip

 

에러의 원인은 버전이 낮아서 발생하는 것으로 pip upgrade가 필요하다

 

해결방법

사실 해당 에러는 매우 간단하다

python.exe -m pip install --upgrade pip

파이썬이 안내해주는 방식 그대로 사용하면 해결 가능하다!

 

해당 방법으로 pip를 업그레이드한 후 본래 사용하고 싶었던 명령어를 사용할 수 있었다.

반응형
반응형

Python  가상환경 사용하기

Python에서는 가상 환경을 사용할 수 있고 특병 프로젝트에 맞춰서 패키지를 다르게 독립적으로 설정해줄 수 있다

버전관리나 동일한 환경에서 다른사람들과 작업하기 편리하다

Python 가상환경 생성하기

python -m venv '가상 환경 이름'

Python 가상환경 활성화하기

생성된 가상 환경으로 이동 후 활성화

cd '가상 환경 이름 '
source Scripts/activate

해당 명령어를 입력하면 하단에('가상환경이름') 가상환경이 연결된걸 확인할 수 있다.

나의 경우 venv로 대충 지음

 

bash에 입력시

 

sou + Tab S + Tab a + Tab 

Tab 입력시 간편하게 자동완성 해준다

가상 환경에 패키지 설치

가상 환경에 접속 후 pip를 사용해서 패키지를 설치할 수 있다

pip install requests

위의 명령어를 입력하면 전역 환경에는 깔리지 않지만 나의 venv환경에서는 requests 라이브러리가 추가된다!

가상환경 비활성화

deactivate

입력하면 bash 하단의('가상환경이름') 이 사라진다

 

가상환경 삭제

가상환경 삭제는 간단하게 해당 가상환경이 포함된 폴더늘 삭제 해주면 된다

rmdir

 

추가 팁

내가 설치한 패키지와 버전을 한번에 txt 파일로 뽑아낼 수 있다.

pip freeze > requirements.txt

그리고 이대로 설치도 가능하다

pip install -r requirements.txt
반응형
반응형

SQL을 공부하려고 테이블을 생성하고 있었는데 포켓몬 데이터를 하나하나 insert하는게 귀찮아서...

정신차리고 보니 웹 크롤링중...헤헿

 

크롤링 할 사이트는 여기!

https://pokemonkorea.co.kr/pokedex

 

:::포켓몬 도감

포켓몬 도감:::

pokemonkorea.co.kr

공식 사이트의 포켓몬 도감이다.

 

기본적인 크롤링 코드는 chat gpt에게 부탁했다

chat gpt가 작성해준 python 크롤링 코드

import requests
import csv
from bs4 import BeautifulSoup

url = 'https://pokemonkorea.co.kr/pokedex/'

response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')

# 필요한 정보 추출
pokemon_list = []
for tr in soup.select('table.poke_dex_table > tbody > tr'):
    row = []
    for td in tr.select('td'):
        row.append(td.text.strip())
    pokemon_list.append(row)

# 추출한 정보 .csv 파일로 저장
with open('pokemon_data.csv', mode='w', newline='', encoding='utf-8-sig') as file:
    writer = csv.writer(file)
    writer.writerow(['pno', 'pname', 'categorize'])
    for pokemon in pokemon_list:
        writer.writerow(pokemon)

chat gpt에게 사이트 명을 알려줘도 그 내부까지 들어가서 분석을 해주진 않으므로 내부 코드를 몽땅 수정해야 한다.

내가 원하는 데이터는 가장 상단의

No. 0001 의 숫자,

그리고 포켓몬의 이름,

분류(씨앗포켓몬) 이다.

메이 페이지에서 크롤링 할 수 있는데이터는

넘버, 이름, 타입 정보인데 왜 한번 더 페이지를 클릭해야 들어올 수 있는 분류로 정했냐 하면...!

타입은 하나 이상인 경우가 있어서 해당 경우에 데이터에 어떤식으로 추가해줘야 할지 감이 안잡힘ㅠ

 

허튼 그런 이유로

메인 페이지에서 넘버와 이름을 가지고 오는 코드,

세부 페이지에서 분류를 가지고 오는 코드로 나눠서 작성했다.

메인 페이지에서 넘버와 이름을 가지고 오는 코드

pokemon_list = []

# https://pokemonkorea.co.kr/pokedex/ 페이지에서 바로 추출할 수 있는 넘버, 이름 정보를 리스트에 추가
for item in soup.select('#pokedexlist li'):
    no = item.select('h3 p')[0].text.split('.')[1]
    name = item.select('h3')[0].text.split()[1]
    pokemon_list.append([no, name])

세부 페이지에서 분류를 가지고 오는 코드

pokemon_list = []

# https://pokemonkorea.co.kr/pokedex/view/[number] 페이지에서 추출해야하는 분류를 리스트에 추가
for view in range(1,len(pokemon_list)+1):
    typeview = requests.get(url+'view/'+str(view))
    soup_type = BeautifulSoup(typeview.content, 'html.parser')
    type_name = soup_type.select_one('.bx-detail div:nth-child(3) p')
    print(type_name.text)
    pokemon_list[view-1].append(type_name.text)

typeview에서 세부페이지인(https://pokemonkorea.co.kr/pakedex/view/[number]) 정보를 받아와 Bueatifulshop으로 파싱 한 후, 원하는 데이터를 가지고 왔다.

분류가 위치한 곳은 .bx-detail > div > div > p 였는데

타입 정보가 위치한 곳도 .bx-detail > div > div > p로 동일하여 데이터가 계속 '풀'이 들어가는 것이다!

 

그래서 div:nth-child(3)으로 3번째에 있는 데이터를 넣도록 하였다

 

 

지금 보니 여기서 넘버와 이름을 가지고 와서 추가했어도 되는거였는데...

 

고럼 이렇게 데이터가 들어가진다!

최종코드

import requests
import csv
from bs4 import BeautifulSoup

url = 'https://pokemonkorea.co.kr/pokedex/'

response = requests.get(url)

soup = BeautifulSoup(response.content, 'html.parser')

# 필요한 정보 추출
pokemon_list = []

# https://pokemonkorea.co.kr/pokedex/ 페이지에서 바로 추출할 수 있는 넘버, 이름 정보를 리스트에 추가
for item in soup.select('#pokedexlist li'):
    no = item.select('h3 p')[0].text.split('.')[1]
    name = item.select('h3')[0].text.split()[1]
    pokemon_list.append([no, name])

# https://pokemonkorea.co.kr/pokedex/view/[number] 페이지에서 추출해야하는 분류를 리스트에 추가
for view in range(1,len(pokemon_list)+1):
    typeview = requests.get(url+'view/'+str(view))
    soup_type = BeautifulSoup(typeview.content, 'html.parser')
    type_name = soup_type.select_one('.bx-detail div:nth-child(3) p')
    print(type_name.text)
    pokemon_list[view-1].append(type_name.text)

print(pokemon_list)

# 추출한 정보 .csv 파일로 저장
with open('pokemon_data.csv', mode='w', newline='', encoding='utf-8-sig') as file:
    writer = csv.writer(file)
    writer.writerow(['pno', 'pname', 'categorize'])
    for pno in pokemon_list:
        writer.writerow(pno)

최종적으로 엑셀로 출력된 데이터와 수정한 데이터

실제로 엑셀로 출력된 데이터는 왼쪽 데이터지만 중복된 숫자가 있는걸 확인할 수 있다.

sql에 삽입할 때 pno를 primary key로 줄 생각이었기에 이렇게 되면 오류가 생길 것 같아 임의로 id 값을 추가했다...

id를 primary key로 주는 수 밖에...

 

 

※ 혹시 틀린 내용이나 부족한 부분이 있다면 댓글 남겨주세요

 

∩  ∩
ฅ(=ˇωˇ=)ฅ

반응형
반응형

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

 

2161번: 카드1

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가

www.acmicpc.net

문제

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다.

이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다.

예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리면 234가 남는다. 여기서 2를 제일 아래로 옮기면 342가 된다. 3을 버리면 42가 되고, 4를 밑으로 옮기면 24가 된다. 마지막으로 2를 버리고 나면, 버린 카드들은 순서대로 1 3 2가 되고, 남는 카드는 4가 된다.

N이 주어졌을 때, 버린 카드들을 순서대로 출력하고, 마지막에 남게 되는 카드를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 N(1 ≤ N ≤ 1,000)이 주어진다.

출력

첫째 줄에 버리는 카드들을 순서대로 출력한다. 제일 마지막에는 남게 되는 카드의 번호를 출력한다.


풀이

가장 앞의 카드를 출력하고 빼주면 되는거라 pop을 사용했다.

앞의 카드를 뒤로 돌릴때도 append와 pop 사용.

순서에 주의하자

코드

# 2161 카드

n = int(input())
card = []

for i in range(1, n+1):
    card.append(i)
while len(card) > 1:
    print(card[0],end=' ')
    card.pop(0)
    card.append(card[0])
    card.pop(0)
print(card[0])
반응형
반응형

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

 

1475번: 방 번호

첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

문제

다솜이는 은진이의 옆집에 새로 이사왔다. 다솜이는 자기 방 번호를 예쁜 플라스틱 숫자로 문에 붙이려고 한다.

다솜이의 옆집에서는 플라스틱 숫자를 한 세트로 판다. 한 세트에는 0번부터 9번까지 숫자가 하나씩 들어있다. 다솜이의 방 번호가 주어졌을 때, 필요한 세트의 개수의 최솟값을 출력하시오. (6은 9를 뒤집어서 이용할 수 있고, 9는 6을 뒤집어서 이용할 수 있다.)

입력

첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 필요한 세트의 개수를 출력한다.


풀이

딕셔너리를 통해서 풀이 하였다.

6과 9는 서로 공유할 수 있기 때문에 입력된 수 안에 있는 경우 둘 다 더해준 후 나중에 2로 나눠 나눠진 값을 ceil로 올림 해줬다

코드

# 1475 방 번호
import math

num = list(input())
sets = {}

for n in num:
    if n in sets:
        if n == '9' or n == '6':
            sets['6'] += 1
            sets['9'] += 1
        else:
            sets[n] += 1
    else:
        if n == '9' or n == '6':
            sets['9'] = 1
            sets['6'] = 1
        else:
            sets[n] = 1

if '6' in sets:
    sets['6'] = math.ceil(sets['6']/2)
if '9' in sets:
    sets['9'] = math.ceil(sets['9']/2)

print(max(sets.values()))
# print(sets)
반응형
반응형

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

 

1064번: 평행사변형

평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. A(xA,yA), B(xB,yB), C(xC,yC) 이때, 적절히 점 D를 찾아서 네 점으로 평행사변형을 만들면 된다. 이때, D가 여러 개 나

www.acmicpc.net

문제

평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. A(xA,yA), B(xB,yB), C(xC,yC)

이때, 적절히 점 D를 찾아서 네 점으로 평행사변형을 만들면 된다. 이때, D가 여러 개 나올 수도 있다.

만들어진 모든 사각형 중 가장 큰 둘레 길이와 가장 작은 둘레 길이의 차이를 출력하는 프로그램을 작성하시오. 만약 만들 수 있는 평행사변형이 없다면 -1을 출력한다.

입력

첫째 줄에 xA yA xB yB xC yC가 주어진다. 모두 절댓값이 5000보다 작거나 같은 정수이다.

출력

첫째 줄에 문제의 정답을 출력한다. 절대/상대 오차는 10-9까지 허용한다.


풀이

평행사변형을 만들수 있는 경우의 수는

다음과 같이 3개의 경우가 있다

그래서 D 좌표를 미리 구한 후

해당 삼각형의 넓이를 모두 구해준 후 3개의 경우의 수 중 가장 큰 수에서 적은 수를 빼주었다!

 

수학 넘 오랜만인지 D 좌표를 찾는게 생각보다 오래 걸렸다

2개의 D 좌표를 찾을 수 있지만 둘레를 구하기 위해서는 2변의 길이만 알면 되기 때문에 2개중 하나의 좌표만 사용해서 둘레를 구해줄 수 있었다!

코드

# 1064 평행사변형

xa, ya, xb, yb, xc, yc = map(int,input().split())


if ((xa - xb) * (ya - yc) == (ya - yb) * (xa - xc)):
    print(-1.0)
else:
    xd2 = (xa + xc) - xb
    yd2 = (ya + yc) - yb

    cir_1 = (abs(xa - xb) ** 2 + abs(ya - yb) ** 2) ** 0.5 + (abs(xa - xc) ** 2 + abs(ya - yc) ** 2) ** 0.5
    cir_2 = (abs(xa - xb) ** 2 + abs(ya - yb) ** 2) ** 0.5 + (abs(xa - xd2) ** 2 + abs(ya - yd2) ** 2) ** 0.5
    cir_3 = (abs(xa - xc) ** 2 + abs(ya - yc) ** 2) ** 0.5 + (abs(xa - xd2) ** 2 + abs(ya - yd2) ** 2) ** 0.5

    ans = max(cir_1, cir_2, cir_3) - min(cir_1, cir_2, cir_3)

    print(ans*2)
반응형
반응형

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

 

4963번: 섬의 개수

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도

www.acmicpc.net

문제

정사각형으로 이루어져 있는 섬과 바다 지도가 주어진다. 섬의 개수를 세는 프로그램을 작성하시오.

한 정사각형과 가로, 세로 또는 대각선으로 연결되어 있는 사각형은 걸어갈 수 있는 사각형이다. 

두 정사각형이 같은 섬에 있으려면, 한 정사각형에서 다른 정사각형으로 걸어서 갈 수 있는 경로가 있어야 한다. 지도는 바다로 둘러싸여 있으며, 지도 밖으로 나갈 수 없다.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다.

둘째 줄부터 h개 줄에는 지도가 주어진다. 1은 땅, 0은 바다이다.

입력의 마지막 줄에는 0이 두 개 주어진다.

출력

각 테스트 케이스에 대해서, 섬의 개수를 출력한다.


풀이

상하좌우 뿐만 아니라 대각선을 생각해줘야 하는 문제다!

상하좌우만 생각하면 벡터의 범위가

dr = [-1, 1, 0, 0]

dc = [0, 0, -1, 1]

이렇게 나오지만

상좌, 상우, 하좌, 하우

dr = [-1, 1, -1, 1]

dc = [-1, -1, 1, 1]

이 추가로 나오게 된다!

그래서 처음에 벡터를 

 

 

dr = [-1, -1, -1, 0, 0, 1, 1, 1]
dc = [-1, 0, 1, -1, 1, -1, 0, 1]

로 정의 해둔 후 문제를 풀었다.

def dfs(매개변수1, 매개변수2) <- 처음에 매개변수의 이름을 처음 받은 넓이 높이와 같은 값인 w 와 h로 받아버리는 바람에 고생했다ㅠ

python코드

#4963 섬의 개수
import sys
sys.setrecursionlimit(10**6)

dr = [-1, -1, -1, 0, 0, 1, 1, 1]
dc = [-1, 0, 1, -1, 1, -1, 0, 1]

def dfs(a, b):
    global island, visited
    visited[a][b] = 1
    for dir in range(8):
        nr = dr[dir] + a
        nc = dc[dir] + b
        if nr >= 0 and nr < h and nc >= 0 and nc < w:
            if arr[nr][nc] == 1 and visited[nr][nc] == 0:
                dfs(nr,nc)



while True:
    island = 0
    w, h = map(int,input().split())
    if w == 0 and h == 0 :
        break
    arr = []
    visited = [[0] * w for _ in range(h)]
    for i in range(h):
        arr.append(list(map(int,input().split())))
    for i in range(h):
        for j in range(w):
            if arr[i][j] == 1 and visited[i][j] == 0:
                dfs(i,j)
                island += 1
    print(island)
반응형
반응형

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

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net

문제

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. <그림 2>는 <그림 1>을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오.

입력

첫 번째 줄에는 지도의 크기 N(정사각형이므로 가로와 세로의 크기는 같으며 5≤N≤25)이 입력되고, 그 다음 N줄에는 각각 N개의 자료(0혹은 1)가 입력된다.

출력

첫 번째 줄에는 총 단지수를 출력하시오. 그리고 각 단지내 집의 수를 오름차순으로 정렬하여 한 줄에 하나씩 출력하시오.


풀이

dfs로 풀었다!

python에서 vector는 방향과 크기를 가지는 단위라고 하는데 C++ 에서 정의해서 쓰는 Vector랑 뭔가 다른 느낌이라 헷갈린다.

전에는 상,하,좌,우를 분명하게 인지하고 가는게 중요하다고 생각했는데 그냥 사방을 검사하는거라면 굳이 상하좌우를 명확히 할 필요는 없는 것 같다

dfs로 탐색하고, 탐색이 끝나면 ans 에 1을 더한다.

각각의 크기는 hap을 통해 더하고 리스트에 넣어줬다. 그 이후 sort로 정렬 후 출력!

python 코드

# 2667 단지번호붙이기
dr = [0, 0, -1, 1]
dc = [-1, 1, 0, 0]

def dfs(i,j):
    global ans, hap
    visited[i][j] = 1
    for d in range(4):
        nr = i +dr[d]
        nc = j +dc[d]
        if nr >= 0 and nr < N and nc >= 0 and nc < N:
            if arr[nr][nc] == '1' and visited[nr][nc] == 0:
                hap += 1
                dfs(nr,nc)
    return

N = int(input())
arr = []
visited = [[0] * N for _ in range(N)]
ans = 0
ans_arr = []
for n in range(N):
    arr.append(list(input()))

for i in range(N):
    for j in range(N):
        hap = 0
        if arr[i][j] == '1' and visited[i][j] == 0:
            dfs(i,j)
            ans += 1
            ans_arr.append(hap)
print(ans)
ans_arr.sort()
for i in ans_arr:
    print(i+1)
반응형
반응형

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

 

1051번: 숫자 정사각형

N×M크기의 직사각형이 있다. 각 칸에는 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행

www.acmicpc.net

문제

N×M크기의 직사각형이 있다. 각 칸에는 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행 또는 열에 평행해야 한다.

입력

첫째 줄에 N과 M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 수가 주어진다.

출력

첫째 줄에 정답 정사각형의 크기를 출력한다.


풀이

배열에서 벗어나서 오류가 나지 않게 i+a  < N, j+a < M 조건을 걸어줬다

그리고 1씩 늘려가면서 정사각형이 있나 탐색한 후 정 사각형이 있다면 넓이를 계산해서 받아줬다!

python코드

# 1051 숫자 정사각형

N, M = map(int,input().split())

arr = [list(input()) for _ in range(N)]
if N > M:
    k = M
else:
    k = N
ans = 0
max_ans = 0
for i in range(N):
    for j in range(M):
        for a in range(k):
            if i+a < N and j+a < M and arr[i][j] == arr[i + a][j] == arr[i][j+a] == arr[i+a][j+a]:
                ans = (a + 1) * (a + 1)
                if ans > max_ans:
                    max_ans = ans
print(max_ans)
반응형

+ Recent posts