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])
다솜이는 은진이의 옆집에 새로 이사왔다. 다솜이는 자기 방 번호를 예쁜 플라스틱 숫자로 문에 붙이려고 한다.
다솜이의 옆집에서는 플라스틱 숫자를 한 세트로 판다. 한 세트에는 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)
next.js 만 사용한 매장이 손님의 주문을 확인하고 주문을 받을 수 있으며, 매장 내 음료 매진 처리, 판매 데이터를 확인할 수 있는 pc 버전 두가지를 만들었다.
각각을 따로 repository를 파서 만들었다!
저번 SSG.com 클론코딩에서는 명확하게 어떤 부분을 맡아 진행할지 나눠서 나는 상품 카테고리와 상품 상세보기, 상품 주문을 맡아서 진행했지만
이번 커피 오더 프로젝트에서는 분명 개인의 역할이 있긴 하지만 어떤 부분에서는 다른 사람의 코드를 보고 다른 사람의 코드를 수정하기도 하면서 프로젝트를 진행했다. 물론 conflict을 피하기 위해서 현재 수정하고 있는 페이지를 건드리게 될 것 같으면 미리 말을 하고 다른 부분 진행하고,,, 그렇게 진행했다!
서비스 이름은 녹템 오더로 녹템은 밤샘을 뜻한다고 한다.
커피랑 이미지도 맞는것 같고 우리의 프로젝트 마음가짐도...! 묘하게 밤이 주는 이미지가 신비한 이미지도 있구 해서 전반적인 컨셉은 마법사로 진행했다.
typescript는 마땅히 좋은 강의가 없어서 이 강의를 중심으로 보고, 그 이후엔 에러가 나는 부분을 중점으로 그냥 블로그 검색을 했다ㅠ
프로젝트를 진행하다가 기초적인 이해가 부족하다보니 이슈가 너무 많았고 프로젝트 중반 이후부터
단숨에 배우는 타입스크립트 책을 통해 기초부터 다지기 시작했다.
근데 프로젝트가 끝난 이 시점... 아직 책 다 못읽었음ㅠㅠ 시간 내에 프로젝트를 진행하려고 하다 보니 시간이 부족했다.
지금은 프로젝트 끝났으니깐!
다시 처음부터 읽어봐야지!
기초가 중요하지 아무렴!
3. CSR 과 SSR
프로젝트를 진행하면서 가장 고민했던 부분은 어디서 SSR을 사용하고 어디서 CSR 을 사용할지였다.
next.js는 SSR 환경을 제공하니 우리는 이 환경을 적제적소에 사용할 수 있어야 할텐데 강의를 봐도
'그래서 우리가 이걸 어느 페이지에 적용해야하는데!'
를 잘 모르겠었다. 팀원들이랑 다른 팀원의 프론트 분들이랑도 이야기해봤는데 어떤 분은 이건 이래서, 여기가 SSR 어떤 분은 아니다 이건 이래서 여기는 CSR! 의견이 다른 부분이 있어서 개인적으로 어떻게 사용하는게 좋았을지 작성해본다
CSR
- 매장 페이지 대부분의 페이지 : 매장 페이지의 경우에는 주문의 상태를 변경하거나, 품절 상태를 변경하는 등 상태를 변경해야하는 페이지가 주를 이룬다, 그러므로 빠른 페이지 확인 보다는 매장 페이지를 이용하는 이용자와의 즉각적인 상호작용이 더 중요하지 않을까 생각했다.
SSR
- 유저 페이지 카테고리 부분, 유저 페이지 음료 상세 페이지 : 사용자가 어떤 음료가 있는지 시각적으로 빠르게 확인하고 음료 정보를 빠르게 확인할 수 있어야 한다고 생각했다. 음료를 선택했다가 세부 정보를 보고 음료를 주문할지 말지 결정하므로 일단 빠르게 정보 습득하는게 중요하지 않을까?
이것은 개인적인 생각
이 부분이 사용자 UX에 많은 영향을 미치니 프론트 입장에서는 가장 중요한 부분이 아니었나 싶다.
4. 오류
노션에 오류를 만날 때 드문드문 기록해 두었다. 더 꼼꼼히 기록할걸....
내가 해결한 방법 등을 추가로 블로그에 기록해 볼 예정이다.
Curly braces are unnecessary here.
**여기에서는 곱슬곱슬한 교정기는 필요 없어요.**
몬가 귀여웠던 오류
저건 그냥 중괄호{}를 지우면 되는 간단한 오류였다.
가장 많이 마주친 오류는 타입스크립트 오류와 린트 오류...
5. 프로젝트 결과
스파로스 아카데미 최종 프로젝트 우수상 수상했다!
같이 고생한 프로젝트가 우수상까지 수상해서 너무 좋기도 하고, 컨셉을 재미있게 잡았다보니 프로젝트를 진행하는 과정도 너무 재미있었다. 역시 재미있는 컨셉을 가진 프로젝트는 개발할 때도 재미있다.
후반부에 취업 준비로 자주 프로젝트에 빠져서 팀원들에게 미안한 마음이 계속 남아있다... 그래도 좋은 결과를 얻어서 다행이다
정사각형으로 이루어져 있는 섬과 바다 지도가 주어진다. 섬의 개수를 세는 프로그램을 작성하시오.
한 정사각형과 가로, 세로 또는 대각선으로 연결되어 있는 사각형은 걸어갈 수 있는 사각형이다.
두 정사각형이 같은 섬에 있으려면, 한 정사각형에서 다른 정사각형으로 걸어서 갈 수 있는 경로가 있어야 한다. 지도는 바다로 둘러싸여 있으며, 지도 밖으로 나갈 수 없다.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 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)
<그림 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)