B to P #1

3890 단어 백준pythonpython

소프트웨어 마에스트로(이하 소마)를 위해 8일 전부터 알고리즘을 공부하고있다. 원래 주로 사용하는 언어는 JavaScript지만 알고리즘용으로는 예전에 조금 공부했었던 파이썬을 사용하기로 했다(나름 자격증도 있다 ... 별 쓸모는 없다) 거의 처음부터 공부하는 거지만 2번째 언어라서 그런지 꽤 쉬웠다(문법만)

1일차부터 5일차까지는 하루에 거의 9문제정도 풀었는데 3일 전부터 지지부진하다..
이유로는 기본수학1 파트라서 어려운 것도 있겠지만 학생이라 등교를 해야해서.. 저번주(비대면 수업)에 비해서 시간이 많이 없더라.. 공부계획을 조금 수정해야겠다. 오늘(금요일)부터 다음주 일요일까지 다시 열심히 해야겠다

사진은 매일 올려보려고 한다 solved.ac 라는 사이트에서 확인할 수 있다(https://solved.ac/) 우선 목표는 플레티넘5다(목표는 높게 잡아야 하기에 ㅎ) 검색을 해보니 소마의 코딩테스트는 1차 실버 3~1, 2차 골드5~3이면 무난하게 합격한다고 하지만 앞으로도 나는 계속 개발자로서의 길을 갈 것 이고 그 길에 있어서 알고리즘은 가장 중요한 요소중에 하나이기 때문에 이왕 하는김에 열심히 해보겠다.

매일매일 공부하다가 기억에 남는 재미있는 문제들을 올려보려고 한다

혹시라도 나에게 어떤 문제의 풀이를 부탁하려고 한다면 Go*gle에 검색해보면
정말 설명 잘하시는 분들이 넘쳐나니 Goog*e을 활용하기 바란다

다만 문제 추천은 환영이다 (이왕이면 내가 풀 수 있을 것 같은 문제로..)

내가 쓰는 글은 내가 이해한 내용을 바탕으로 작성하므로 설명보다는 복기이다
8일 공부하면서 느낀 것은 알고리즘은 결국 본인 방식대로 이해하는게 중요하다는 것이었으니 다들 응원하겠다


10250 - ACM호텔

호텔의 층수(h), 호실의 개수(w), 손님의 도착순서(n)를 주고서 손님의 방을 배치하라는 문제

포인트는 세로로 손님을 채워야한다는 것(101호부터 h01호까지 채우고 102호로 넘어감) 정확히는 입구에 가까운 쪽이라고 하는데... 이렇게 이해하는게 더 쉬울 것 같다.

풀이 :: 처음에는 감도 안잡혔지만 잘 생각해보니 h를 n으로 나누면 나오는 값에 1을 더하면 호실이 나오더라 ex) 6층짜리 건물에 10번째 입장 손님이라고 가정, 10 % 6 = 1(나머지 4)인데 6층 1호까지는 이미 채워져있다는 뜻이니까 n층 2호실에 들어가야하는 것이다 그리고 여기서 나머지 말인데.. 이 나머지가 층이더라 즉 4층 2호에 들어가면 된다는 뜻이다.

=> // 연산자와 % 연산자를 사용하면 풀리겠죠? (각각 나누기와 나머지 연산자인데 //는 정수만 남긴다)

로직을 떠올리고 난 뒤에 구현은 뭐 쉬웠다 한가지 주의할 점은 층 계산할 때 0으로 나누어 떨어지는 경우가 생기는데 이 때는 h와 층이 같다는 뜻이므로 h를 할당해주고 다음 호수로 안넘어갔기 때문에 호실에 -1을 해주면 된다

구현 ::

t = int(input()) #평소에 test 케이스 입력은 t로 받는다
for i in range(t): #t 횟수만큼 반복문 실행
	h,w,n = map(int, input().split()) #h,w,n을 int형으로 분할입력받는다
    y = n % h #층을 정의해준다
    x = n // h +1 #호실을 정의
    if y == 0: #예외처리 => 층이 나누어 떨어져서 0층이라면
    	y = h #층 재정의
        x = n // h #호실 재정의
    print(y*100 + x) #출력형식이 YYXX / YXX 길래 층에 100을 곱해줬다.. 이러면 y0x호나 yxx호로 표시되겠지
    


2775 - 부녀회장이 될거야

a층의 b호에 살려면 자신의 아래(a-1)층의 1호~b호까지 사람들의 합 만큼의 사람을 데려다 살아야 한다 즉 사람들의 합을 구해야 하는 문제

조건을 보니 비어있는 집은 없고(이건 난이도 하향을 위한 조건인듯) 0층 1호부터 있다고 한다
또 입력은 k와 n이다. 각각 층과 호다

음.. 어렵다 어떻게 풀어야되는지 모르겠어서 G*ogle에 검색해보았다..

아하!

요는 인덱스를 사용해서 그 전 번호 값을 이번 번호에 더해서 재저장(리셋)하면 된다는 거였다

이건 직접 구현한 코드로 설명하겠다(일단 나는 로직으로 설명이 불가능)

 t = int(input()) #테스트케이스

for _ in range(t): #t만큼 반복
    k = int(input()) #층
    n = int(input()) #호
    f0 = [x for x in range(1, n+1)] #f0이라는 배열을 생성, 1~호수까지
    for i in range(k): #층만큼 반복한다. 왜냐? 총 호수 = 층 * 호 라서
        for j in range(1, n): #인덱스로 사용할 i를 반복문으로 생성, 인덱스라서 그냥 n임
            f0[j] += f0[j-1] #그 전 번호를 이번 번호에 더해서 재저장, 그걸 인덱스만큼 반복 즉 마지막 저장값이 완성
    print(f0[-1])

내가 어려웠던 부분을 추가로 서술해놓겠다

  1. 배열 만드는데 이상한 문법이 있는데요??
    => 검색해보니 python의 Comprehension 문법이라고 합니다.
    예시를 보면 이해할 수 있죠
x * 2 for x in range(11) # 이 코드는 2의 배수를 갖는 배열이라고 합니다.. 이제 이해가 되시나요?
이해가 안된다면 출력값을 보면 이해가 되죠(나의 경우)
0, 2, 4, 6, 8, ... 20
즉 배열에는 x가 반복되면서 들어감 0~10까지 (11이므로) 그리고 x에는 2가 곱해져서 저런 배열이 생성되는 것
  1. ?? 왜 f0[j] += f0[j -1]을 하는거지 아니 애초에 -1이 왜 들어가는 거죠?
    => +=이라는 연산자를 이해하면 이해가 되지요... 저 코드를 풀어쓰면 이렇게 됩니다
f0[j] = f0[j] + f0[j-1]
# 그러니까 원래 값에 전 인덱스 번호를 가진 값을 더하라는 거죠
여기서는 1번값에 0번 값을 더해서 저장하는 것

.
.
.
.
210903~04 새벽 00:52분까지
:: 학교 수학이 아닌 수학은 생각보다 재밌다 의욕이 생김

좋은 웹페이지 즐겨찾기