본문 바로가기
구름톤 챌린지

[구름톤 챌린지] 2주차_ 6~ 8일차 학습

by 깁갑수 2023. 8. 24.
목차

Day6  문자열 나누기 - 구름LEVEL (goorm.io)

내 풀이 과정

2주차가 되더니 생각이상으로 확 어려워 진 느낌이다 고작 다섯문제 풀었는데 이렇게까지 난이도를 올리다니..

자습도 병행해야 하는 코스였나보다.

누군가에겐 익숙하겠지만 나에겐 생각이란게 필요한 문제들이다. 검색도 참 많이해봤고..

 

먼저 문자열 길이와 문자열을 입력 받는 부분은 익숙하니 간단하게 처리,

문자열을 자를 수 있는 경우의 수를 어떻게 편하게 구하는가 고민을 해봤지만 뭔가 수식으로 만드는건 내머리로 부족했다.

그래서 숫자의 조합을 생성할 수 있는 기능을 찾아보니 itertools 의 product를 활용 할 수 있을 듯 하다. 

대충 표현하자면 주어진 문자열의 조합을 뽑아내는 방법

이터레이터의 활용

하여 입력받은 N을 이용해 1~N 까지의 문자열을 만들고 product 를 3회 반복해 중복되지 않는 문자열 조합 리스트를 만들어준 뒤 

입력받은 N과 같은지, 중복되지 않는지 확인 후 최종적으로  문자열을 잘라 줄 유형을 저장한다.

from itertools import *

N = int(input()) 
S = input()

combN = [x+1 for x in range(N)] #if N == 4 ->  1,2,3,4
combN = list(product(combN, repeat=3))

for j in combN:
	for k in j:
		if sum(j) == N and j not in new_combN :
			new_combN.append(j)

문자열 조합을 구성하기 위해 변수를 선언하고 중복 문자열을 추가하지 않기 위해 set()으로 초기화하여 문자열 조합을 찾아준 뒤 사전순서로 정렬

combS = set() ## set()중복된거 안들어감
for j in new_combN:
	combS.add(S[:j[0]])
	combS.add(S[j[0]:j[0]+j[1]])
	combS.add(S[-j[2]:])
aa = sorted(list(combS))

 

이제 최고점을 계산하여야 하는데 포문을 두개돌리는 것 보단 하나로 처리하는게 좋을 듯 하여 위의 포문 안에서 점수계산도 포함하도록 한다

 

# -*- coding: utf-8 -*-
# UTF-8 encoding when using korean
from itertools import *

N = int(input()) 
S = input()

combN = [x+1 for x in range(N)] #if N == 4 ->  1,2,3,4
combN = list(product(combN, repeat=3))
new_combN = []

for j in combN:
	for k in j:
		if sum(j) == N and j not in new_combN :
			new_combN.append(j)

combS = set() ## set()중복된거 안들어감
scoreSet = set()

for j in new_combN:
	combS.add(S[:j[0]])
	combS.add(S[j[0]:j[0]+j[1]])
	combS.add(S[-j[2]:])
	scoreSet.add((S[:j[0]], S[j[0]:j[0]+j[1]], S[-j[2]:]))
	
aa = sorted(list(combS))

score = 0
for a, b, c in scoreSet :
	if score < aa.index(a) + aa.index(b) + aa.index(c) +3 : score  = aa.index(a) + aa.index(b) + aa.index(c) +3
print(score)

정해 코드

이터레이터를 사용하긴 하였는데 콤비네이션을 사용하였고 점수를 계산하는 과정도 조금 다르게 구현되어있다.

올바른 의식의 흐름대로 제대로 작성한 코드는 아래와 같겠지..

from itertools import combinations

N = int(input())
S = input()

P = set()

blank = [i for i in range(1, N)]
comb = list(combinations(blank, 2))

for f, s in comb:
	P.add(S[:f])
	P.add(S[f:s])
	P.add(S[s:])

P = sorted(list(P))

result = 0

for f, s in comb:
	temp = 0
	
	temp += P.index(S[:f]) + 1
	temp += P.index(S[f:s]) + 1
	temp += P.index(S[s:]) + 1
	
	result = max(result, temp)

print(result)

 

 

Day7 구름 찾기 깃발 - 구름LEVEL (goorm.io)

내 풀이 과정

지뢰찾기 게임이다 깃발을 세주기만 하는 문제로 간단해보였으나 내부에서  계산하는과정이 생각할게 조금 있었다.

계산을 편하게 하기 위해 플래그맵과 지뢰맵을 따로 선언했고 게임판을 참고하여 깃발맵에 깃발을 심고 다시 계산하는 방법을 이용했다.

 

# -*- coding: utf-8 -*-
# UTF-8 encoding when using korean

N, K = map(int, input().split())
M = []
flag = [[0] * (N + 2) for _ in range(N + 2)]

for _ in range(N):
    M.append(list(map(int, input().split())))

# 각 셀 주변의 8개 셀을 한 번에 계산.
for r in range(1, N + 1):
	for c in range(1, N + 1):
		if M[r - 1][c - 1] == 1:
			for dr in [-1, 0, 1]:
					for dc in [-1, 0, 1]:
							flag[r + dr][c + dc] += 1
							
for r in range(1, N + 1):
	for c in range(1, N + 1):
		if M[r - 1][c - 1] == 1: flag[r][c] = 0

Kcount = 0
for r in range(1, N + 1):
	for c in range(1, N + 1):
		if flag[r][c] == K : Kcount +=1
print(Kcount)

정해 코드

내가 주변을 탐색한 방법이 정말 맞나? 궁금했다 이번해설을 통해 알아보도록 하자

 

미리 탐색할 부분을 생각하고 미리 작성해둔다는 방법이다 내가한 방법은 작은 탐색영역으로 생각하기 쉽지만 복잡한 영역 탐색이라면 아래의 방법이 도움이 될 것으로 보인다.

 

 

dy = [-1, -1, 0, 1, 1, 1, 0, -1]
dx = [0, -1, -1, -1, 0, 1, 1, 1]

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

matrix = []

for _ in range(N):
	row = list(input().split())
	matrix.append(row)

result = 0

for i in range(N):
	for j in range(N):
		if matrix[i][j] == "1":
			continue
		
		check = 0
		
		for k in range(8):
			y = i + dy[k]
			x = j + dx[k]

			if y < 0 or y >= N or x < 0 or x >= N:
				continue
			
			if matrix[y][x] == "1":
				check += 1

		if check == K:
			result += 1

print(result)

 

Day8 통증 - 구름LEVEL (goorm.io)

 

내 풀이 과정

각 통증제거 수치가 7의 배수로 그냥 최고통증 우선순위로 나누고 몫과 나머지를 더하면 되는 문제이다 갑자기 쉬워졌다.

# -*- coding: utf-8 -*-
# UTF-8 encoding when using korean

N = int(input())		
print(((N//7)+1)//2+(N%7))

계산 과정을 직관적으로 보여줄 수 있는 고통을 덜기위해 페인킬러부터 우선적으로 사용하는코드를 while 을 이용해 작성해보았는데 타임 오류가 발생했다 고통이 커질수록 약을 먹는시간이 길어져서 그런듯 하다.

while pain > 0:
	if pain > 14 :
        pain - 14
        continue
     ''''''''''''''''''' #이런식의 고통해소는 아무런 도움이 되지 않아

 

정해 코드

코드 줄수는 늘어났지만 본인의 풀이와 다를것은 없다 계산 과정이 풀어져 있을뿐 

N = int(input())

result = N // 14
N %= 14

result += N // 7
N %= 7

result += N

print(result)

한줄로 작성한 내 코드와 아래의 작성 코드의 효율이 다른가? 궁금하지만 효율계산을 하지 못하는 나는 챗쥐피티 형님께 질문하기로 했다.

 

주어진 두 코드는 두 수를 입력 받아서 어떤 연산을 수행하고 결과를 출력하는 코드입니다. 첫 번째 코드는 연산을 여러 단계로 나누어서 수행하고, 두 번째 코드는 하나의 수식으로 계산을 처리합니다. 두 코드의 효율을 비교하기 위해 시간 복잡도와 코드 간의 가독성을 고려해보겠습니다.

첫 번째 코드:
```python
N = int(input())

result = N // 14
N %= 14

result += N // 7
N %= 7

result += N

print(result)
```

두 번째 코드:
```python
N = int(input())
print(((N//7)+1)//2+(N%7))
```

먼저 시간 복잡도를 살펴보겠습니다. 두 코드 모두 주어진 N에 대해 상수 시간 복잡도(O(1))로 작동합니다. 어떤 N값이 주어지든 코드의 실행 시간은 입력 크기에 관계 없이 일정합니다. 따라서 시간 복잡도 측면에서는 두 코드가 동일합니다.

다음으로 가독성을 고려해봅시다. 두 번째 코드는 하나의 수식으로 모든 계산을 처리하므로 코드가 더 간결합니다. 그러나 가독성은 주관적인 요소이며, 어떤 코드가 더 읽기 쉽다고 말하기는 어렵습니다. 

마지막으로 최적화 측면에서 보면, 두 코드 모두 간단한 연산을 수행하므로 큰 차이가 없습니다. 또한, 현대 컴퓨터에서는 이러한 간단한 연산의 차이가 큰 성능 차이를 일으키지 않습니다.

요약하면, 두 코드는 시간 복잡도와 최적화 측면에서 큰 차이가 없습니다. 두 코드 중 가독성이나 개인적인 취향에 따라 더 선호하는 코드를 선택하시면 될 것 같습니다.

 

가독성은 주관적이니 취향대로 작성하란다.

 

 

"갑수야 반갑수"에는 쿠팡파트너스 등 제휴링크가 포함 되어 있으며 수수료를 제공받을 수 있습니다.