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값이 주어지든 코드의 실행 시간은 입력 크기에 관계 없이 일정합니다. 따라서 시간 복잡도 측면에서는 두 코드가 동일합니다.
다음으로 가독성을 고려해봅시다. 두 번째 코드는 하나의 수식으로 모든 계산을 처리하므로 코드가 더 간결합니다. 그러나 가독성은 주관적인 요소이며, 어떤 코드가 더 읽기 쉽다고 말하기는 어렵습니다.
마지막으로 최적화 측면에서 보면, 두 코드 모두 간단한 연산을 수행하므로 큰 차이가 없습니다. 또한, 현대 컴퓨터에서는 이러한 간단한 연산의 차이가 큰 성능 차이를 일으키지 않습니다.
요약하면, 두 코드는 시간 복잡도와 최적화 측면에서 큰 차이가 없습니다. 두 코드 중 가독성이나 개인적인 취향에 따라 더 선호하는 코드를 선택하시면 될 것 같습니다.
가독성은 주관적이니 취향대로 작성하란다.