루나의 TIL 기술 블로그

백준 2908 상수

|

백준 2908번 상수 문제

사고 과정

백의자리와 일의자리를 서로 바꾸고 둘 중 큰 수를 출력한다

a = list(map(int, input().split()))
#한 줄에 입력받은 두 수를 리스트에 저장한다
h = int(a[0]/100)
t = int(a[0]%100/10)
o = int(a[0]%10)
new_nums = []
new_nums.append(100 * o + 10 * t + h)
#리스트 중 첫번째 수를 백의자리와 일의자리를 서로 바꿔서 새 리스트에 추가한다
h = int(a[1]/100)
t = int(a[1]%100/10)
o = int(a[1]%10)
new_nums.append(100 * o + 10 * t + h)
print(new_nums)
#두 수를 비교해서 큰 수를 출력한다
print(max(new_nums))

잘 작동하는데 제출하니까 틀렸다고 나온다. 왜 틀린걸까..?

제출 답안

a, b = input().split()
# 두 변수를 입력받음 
a = int(a[::-1]) 
b = int(b[::-1])
# a[::-1] 이렇게 하면 역수가 된다
if a > b : 
    print(a)
else :
    print(b)

출처 : 유혹하는 개발하기

주요 포인트 및 생각해볼 점

indice를 잘 사용하는 방법이 많다.
문자형과 숫자형을 펼쳤다 붙였다하고 리스트에 넣었다 뽑았다하는 것을 잘 할 수 있어야겠다.

백준 1157 단어공부

|

백준 1157번 단어공부 문제

사고 과정

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

word = input().upper()
#입력받은 단어를 대문자로 word 변수에 저장한다.
unique_word = list(set(word))
print(unique_word) #zZa 의 경우 : ['Z', 'A']
#입력받은 단어에 사용된 알파벳을 중복되지 않은 리스트로 저장한다. set()의 사용
cnt_list = []
for i in unique_word:
    #unique_word의 각 알파벳들을 iterate하면서 
    cnt = word.count(i)
    #word변수에 들어있는 해당 알파벳의 갯수를 cnt변수에 저장한다
    cnt_list.append(cnt)
    #cnt의 값을 cnt_list 배열에 집어넣는다
print(cnt_list) #[2,1]

if cnt_list.count(max(cnt_list)) > 1:
    #cnt_list의 최대 인수의 갯수가 1개를 넘으면
    print('?')
    #물음표를 출력한다
else:
    print(unique_word[(cnt_list.index(max(cnt_list)))].upper())
    #아니라면 최대 인수의 위치를 cnt_list에서 찾아서 
    #풀어서 설명하자면
print(max(cnt_list)) # 사용된 알파벳의 갯수 중 가장 큰 수 : 2
print(cnt_list.index(2)) # cnt_list에서 2의 값의 위치 : 0
print(unique_word[0]) #unique_word리스트에서 0번째 값 : Z

3일 후에 다시 보니까 마지막 부분이 좀 헷갈렸는데
unique_word와 cnt_list값이 순서대로 1:1로 대응되기 떄문에 쓸 수 있는 방법인 것 같다.

숏코딩

from statistics import*
try:t=mode(input().upper()) #t에 최빈값(mode)을 저장한다
except:t='?' #안 되면 ? 출력
print(t)

수학통계함수 statistics(설명)[https://python.flowdas.com/library/statistics.html]와 오류예외처리구문(설명)[https://wikidocs.net/30]을 이용한 간결한 코드이다!

주요 포인트 및 생각해볼 점

다른 조원의 블로그롤 보고 생각이 나서 algorithm을 푼 3일 뒤에 다시 살펴봤는데 마지막 줄을 읽을 수 없어서 당황스러웠다.
algorithm을 풀 때 특히 다른 곳에서 가져온 것이라면 한 줄 한 줄 다 이해하고 주석을 달아놓는 것이 좋을 것 같다.

백준 4673 셀프넘버

|

백준 4673번 셀프넘버 문제

사고 과정

자기자신과 자기자신을 구성하는 숫자들을 더한 리스트를 만들고 정수리스트에서 뺀다.

for i in range(1,10001):
    a = i + str(i)
    nums = []
    nums.append(a)
print(range(1,10001) - set(nums))
#런타임에러


제출 답안

natural_num = set(range(1,10001)) 
generated_num = set() 

for i in range(1,10001):
    for j in str(i):
        i += int(j) 
    generated_num.add(i) # add 함수 사용

self_num = sorted(natural_num - generated_num)
for i in self_num:
    print(i)

출처 in my duty 블로그

숏코딩

r=range(9999);
print(*sorted({*r}-{n+sum(map(int,str(n)))for n in r}))

읽을 수가 없다 ㅋㅋㅋㅋ

주요 포인트 및 생각해볼 점

add와 append의 차이점 알아보기
set은 문자열 리스트에서만 쓸 수 있는걸까?

문제가 점점 어려워지고 있다. 런타임에러가 안 나도록 문법은 맞춰서 제출해야겠다.

*r 은 무엇을 의미하는걸까?

*의 사용 06.18 추가

백준 1065 한수

|

백준 1065번 한수 문제

사고 과정

100미만이면 입력한 수를 출력하고, 100이상이면 공차가 같은 수들의 리스트를 구해서
(일의자리 - 십의자리 = 십의자리 - 백의자리 )그 수들의 갯수 +99 를 출력한다.

n = int(input())

if n < 100:
    print(n)
if n => 100: #비교연산자 위치 틀렸다
    for i in range(100,n):
        #num = list(map(int, str(i))) 넣어야함
        if num[2] - num[1] = num[1] - num[0]:
            nums.add(num)
    print(len(nums)+99)


제출 답안 1

n = int(input())
nums = set()
#그냥 nums=[]했더니 리스트에는 add함수가 없다고 해서 set으로 만들었다

if n < 100:
    print(n)
if n >= 100: #크거나 같다 비교연산자
    for i in range(100,n+1): 
        #n이 포함되려면 1을 더해야한다
        hund = int(i / 100)
        ten = int((i % 100) / 10)
        one = int(i % 10)
        #인터넷에서 찾은 각 자리수별 숫자 추출법
        if hund - ten == ten - one:
            nums.add(i)
    print(len(nums)+99)

제출 답안 2

n = int(input())
nums = set()

if n < 100:
    print(n)
if n >= 100:
    for i in range(100,n+1):
        num = list(map(int, str(i)))
        if num[2] - num[1] == num[1] - num[0]:
            nums.add(i)
    print(len(nums)+99)

주요 포인트 및 생각해볼 점

map함수는 map(변환 함수, 순회 가능한 데이터) 이렇게 사용한다.

num = list(map(int, str(i)))
이 구문은 문자형으로 저장된 i를 iterate해서(int는 iterate할 수 없다)
map을 이용해 하나씩 int형으로 변환해서 num이라는 리스트에 넣는다는 뜻이다.

뭔가 쓸데없이 복잡해지는 것 같기도한데.. 숫자는 숫자로 처리하는게 좋은 것 같다.
답을 안 보고 문법만 참고해서 끝까지 풀 수 있게 됐다!

백준 8958 OX퀴즈

|

백준 8957번 OX퀴즈 문제

사고 과정

O가 한개면 1을 더하고 O가 두 개면 1을 더하고… O가 4개면 1을 더한다.

n = int,input()

for _ in n:
    a = list((input())
    count = 0
    for i in a
        if 'O' in i :
            count += 1
        if 'OO' in i :
            count += 1
        if 'OOO' in i:
            count += 1
        if 'OOOO' in i:
            count += 1
        print(count)


제출 답안

n = int(input())

for _ in range(n):
    a = list(input())
    sum = 0
    #sum 과 cnt(카운트)를 따로 만들었어야했다
    cnt = 0
    #sum은 총점, cnt는 점수를 누적할 때 사용되는 변수이다
    for i in a:
        if i =='O':
            cnt += 1
            #O의 갯수만큼 카운트를 1씩 증가시키고
            sum += cnt
            #늘어난 카운트를 총점에 누적시킨다
        else:
            cnt = 0
            #X가 나오면 카운트를 0으로 리셋한다
    print(sum)

주요 포인트 및 생각해볼 점

중첩된 for문에 조금 익숙해졌다.  
변수가 몇 개 필요한지 미리 생각을 더 해보는 것이 좋겠다.

백준 4344 평균은 넘겠지

|

백준 4344번 평균은 넘겠지 문제

사고 과정

n = int(input())
for i in range(n):
    a = list(input())
    pct = 0
    avg = 0
    sum = 0
    for i in a:
        sum += i
        #모든 점수를 더한 총점을 만들어서 
    avg = sum/len(a)
    #총점을 사람수로 나눈 것이 평균이 된다
    for i in a:
        if i > avg:
            count += 1
            #평균이 넘는 학생 수를 세서
    pct = count/len(a) * 100
    #총 학생수 중 평균이 넘는 학생수의 퍼센테이지를 구한다
    print(pct)


제출 답안

n = int(input())
for _ in range(n):
    grades = list(map(int, input().split()))
    avg = sum(grades[1:])/grades[0]
    #입력값 중에 총 학생 수가 맨 앞에 들어있는걸 제대로 못 봤다
    #sum(grades[1:])을 처음 봤는데 참 좋은 구문이다
    cnt = 0
    for grade in grades[1:]:
        if grade > avg:
            cnt += 1
    pct = cnt/grades[0] *100
    print(f'{pct:.3f}%') 
    #.을 빼먹어서 왜 틀렸는지 5분쯤 고민했다

주요 포인트 및 생각해볼 점

인덱스를 사용한 부분이 간결하다.

백준 1546 평균

|

백준 1546번 평균 문제

사고 과정

입력받은 점수를 저장하고 해당 식을 적용해서 새 점수들을 구한다. 구한 새 점수들의 평균값을 출력한다.

list_grades = []
list_grades_new = []
n = int,input()
for i in n:
    a = int(input())
    list_grades.append(a)
    max_grade = max(list_grades)
    list_grades_new.append(i/max_grade*100)
print(sum(new_grade)/n)


제출 답안

n = int(input())
list_grades = list(map(int, input().split()))
#연속해서 받는 입력값의 처리
max_grade = max(list_grades)

new_grades = []
for i in list_grades:
    new_grades.append(i/max_grade*100)
print(sum(new_grades)/n)

주요 포인트 및 생각해볼 점

입력을 한 줄에 받을 때와 새로운 줄에 받을 때 각각 리스트와 반복문으로 받아서 저장하는 방법을 익혔다.

백준 3052 나머지

|

백준 3052번 나머지 문제

사고 과정

수를 차례대로 입력받아서, 입력값들을 42로 나눈 나머지를 리스트에 저장하고, 리스트의 원소의 갯수를 출력한다

a = int,input()
b = int,input()
c = int,input()
d = int,input()
e = int,input()
f = int,input()
g = int,input()
h = int,input()
i = int,input()
j = int,input()
list_nums = {a%42, b%42, c%42, d%42,e%42, f%42, g%42, h%42, i%42, j%42}
print(len(set(list_nums)))


제출 답안

list_nums = []

for _ in range(10):
    #반복해서 쓰는 것은 항상 반복문으로 쓰자
    a = int(input())
    #새로운 줄에 받는 입력값의 처리
    b = a % 42
    list_nums.append(b)
    #append의 사용에 익숙해져야겠다
print(len(set(list_nums)))

주요 포인트 및 생각해볼 점

입력을 새로운 줄에 받을 때 반복문으로 받아서 저장하는 방법을 익혔다.

백준 1110 더하기 사이클

|

백준 더하기 사이클 문제

사고 과정

전의 두 숫자를 더한 값의 일의 자리가 새 숫자의 일의 자리가 되고
전의 두 숫자 중 일의 자리가 새 숫자의 십의자리가 되는 사이클을 만들었다.

n = int(input())

while true
    counter += i
    n = n[1]+(n[0]+n[1])[1]  
    if n == n:
        break
    print(counter)

제출 답안

num = int(input())
check = num #같은 값이지만 새 변수로 만들어야했다.
new_num = 0
temp = 0
count = 0
while True:
    temp = num//10 + num%10
    new_num = (num%10)*10 + temp%10
    count += 1
    num = new_num
    #new_num을 num에 넣어서 num이 계속 돌아가게 한다
    if new_num == check:
        break
print(count)

주요 포인트 및 생각해볼 점

10분정도 고민하고 바로 답을 찾아보고 있는데 답을 너무 빨리 보는건가 싶은데  
무슨 함수를 써야되는지 모르겠어서 힌트 없이 풀려면 너무 진척이 없을 것 같다.     
쉬운 문제들은 조금 시간이 지난 뒤에 다시 풀어보면 좋지않을까싶다.   

자바스크립트 - 시계, 언어 변경

|

포트폴리오페이지에 간단한 자바스크립트 기능(시계, 언어변경)을 추가하기로 했다.
한국과 독일의 시간을 넣고 시간에 따라 사진이 낮/밤으로 바뀌도록 했고 언어는 세 가지가 바뀔 수 있도록 했다.
포트폴리오 링크

시계

포폴에 반영된 시계

  • html
<!-- 한국 시계-->
<div class="layer-intro" id="pic-kr">
    <h2 class="clock-kr"></h2>
</div>
<!-- 독일 시계-->
<div class="layer-intro" id="pic-de">
    <h2 class="clock-de"></h2>
</div>

상관없는 부분은 생략했다.

  • css
/* 도시 사진을 클래스마다 넣는다 */
.seoul-day {
  background-image: url(../images/seoul_day.jpeg);
  background-size: cover;
}
.seoul-night {
  background-image: url(../images/seoul_night.jpeg);
  background-size: cover;
  background-color: rgba(34, 49, 63, 0.6);
}
.berlin-day {
  background-image: url(../images/berlin_day.jpeg);
  background-size: cover;
  color: #333;
  background-color: rgba(34, 49, 63, 0.6);
}
.berlin-night {
  background-image: url(../images/berlin_night.jpeg);
  background-size: cover;
}
  • javascript
// clock-kr 클래스를 clock_kr 변수에 저장
var clock_kr = document.querySelector(".clock-kr");
var clock_de = document.querySelector(".clock-de");

function getTime() {
  // 자바스크립트에서 현재 시간 받아서 상수 curr에 저장 
  const curr = new Date();
  // 표준시간 UTC 구하기
  const utc = curr.getTime() + curr.getTimezoneOffset() * 60 * 1000;

  // UTC to KST 한국 (UTC + 9시간)
  const KR_TIME_DIFF = 9 * 60 * 60 * 1000;
  const kr_curr = new Date(utc + KR_TIME_DIFF);

  // UTC to CET 독일 (UTC + 1시간)
  const DE_TIME_DIFF = 1 * 60 * 60 * 1000;
  const de_curr = new Date(utc + DE_TIME_DIFF);

  // 시, 분 변수 저장
  let kr_hr = kr_curr.getHours();
  let kr_mm = kr_curr.getMinutes();
  let de_hr = de_curr.getHours();
  let de_mm = de_curr.getMinutes();

  //am, pm 표시
  var kr_ampm = kr_hr >= 12 ? "pm" : "am";
  var de_ampm = de_hr >= 12 ? "pm" : "am";

  // 10이하 숫자일때 보기 좋게 숫자 앞에 0 추가
  clock_kr.innerHTML =
    `${kr_hr < 10 ? `0${kr_hr}` : kr_hr}:${kr_mm < 10 ? `0${kr_mm}` : kr_mm}` +
    " " +
    kr_ampm;
  clock_de.innerHTML =
    `${de_hr < 10 ? `0${de_hr}` : de_hr}:${de_mm < 10 ? `0${de_mm}` : de_mm}` +
    " " +
    de_ampm;

  // 시간별로 사진 바꾸기
  // pic-kr 아이디를 obj_kr 변수에 저장
  var obj_kr = document.getElementById("pic-kr");
  var obj_de = document.getElementById("pic-de");
  // 7시 초과 18시 미만일 때 obj_kr 변수의 클래스를 seoul-day로 바꿈
  if (kr_hr > 7 && kr_hr < 18) {
    obj_kr.setAttribute("class", "seoul-day");
  } else {
    obj_kr.setAttribute("class", "seoul-night");
  }
  if (de_hr > 7 && de_hr < 18) {
    obj_de.setAttribute("class", "berlin-day");
  } else {
    obj_de.setAttribute("class", "berlin-night");
  }
}
// 1초마다 함수를 업데이트
setInterval(getTime, 1000);

언어 변경

포폴에 반영된 시계 포폴에 반영된 시계2

  • html
<li>
  <a>
    <!-- 이 부분이 왜인지 꼭 필요하던데 숨길 수가 없어서 css로 숨겼다 -->
    <p id="language">
      <span data-lang="now_sys_lang"></span>
      <span id="locale"></span>
    </p>
    <!-- 각 언어별 버튼 -->
    <span id="btn-ko" class="nav-lang">KR</span>
    <span id="btn-en" class="nav-lang">EN</span>
    <span id="btn-de" class="nav-lang">DE</span>
  </a>
</li>
  • css
/* 비활성화 일때 버튼 클래스 */
.nav-lang {
  border: grey 2px solid;
  border-radius: 4px;
  padding: 5px 10px;
  color: grey
}
/* 활성화 일때 버튼 클래스 */
.active {
  border: #1ecba7 2px solid;
  color:#1ecba7
}
/* 마우스 올렸을 때 버튼 색 변화 */
#btn-en:hover{
  border: #1ecba7 2px solid;
  color:#1ecba7
}
#btn-ko:hover{
  border: #1ecba7 2px solid;
  color:#1ecba7
}
#btn-de:hover{
  border: #1ecba7 2px solid;
  color:#1ecba7
}
#language{
  display:none;
} 
  • javascript

다국어지원 자바스크립트는 아래 블로그 글에서 복사해왔다.
http://yoonbumtae.com/?p=2469

// 언어별 JSON 파일
const lang = {
  en: {
    seoul: "Seoul",
    berlin: "Berlin",
    intro: "Introduction",
    intro_txt:
      "Luna is a foodie, film lover studying to become a useful developer. 2021 new year's resolution is to run regularly and polish on rusty piano skill. she majored in food science and worked as UX designer at K7music for a year and half.",
    title: "My Skills",
    content:
      "Luna is motivated to make software that improves people's life by combining the art of programming and intuitive design.",
    now_sys_lang: "EN",
    skill_a: "Proficiency with web markup and design, including HTML5, CSS3",
    skill_b:
      "Has solid working knowledge of server-side CSS pre-processing, such as LESS and SASS",
    skill_c: "Has basic understanding of client-side scripting and JavaScript",
    skill_d:
      "Experience with a variety of JS frameworks including React and Angular",
    contactme: "Feel free to contact me for your next project",
    portfolio: "Portfolio",
  },
  ko: {
    seoul: "서울",
    berlin: "베를린",
    intro: "자기소개",
    intro_txt:
      "맛있는 것과 재미있는 영화를 가장 좋아하는 30대 학생입니다. 올해에는 규칙적인 조깅과 피아노 실력향상을 목표로 하고있습니다. 식품영양을 전공했고 국비지원 자바 프론트엔드 과정을 들은 뒤에 독일의 인디음악회사에서 UX디자이너로 1년반정도 일했습니다. 앞으로 4개월간 잘 부탁드립니다!",
    title: "스킬",
    content:
      "사람들의 삶을 개선할 수 있는 소프트웨어를 만들고 싶습니다. 언어교육에 관심있습니다.",
    now_sys_lang: "KO",
    skill_a: "HTML, CSS를 포함한 웹디자인과 마크업에 능숙합니다",
    skill_b: "SCSS, LESS등 CSS전처리기를 이용해서 일한 경험이 있습니다",
    skill_c:
      "클라이언트측 스크립트 언어에 대한 지식이 있고 기본적인 자바스크립트를 활용할 수 있습니다",
    skill_d:
      "React, Angular 프레임워크로 서비스를 제공하는 환경에서 일했습니다",
    contactme: "궁금한 점이 있으면 언제든지 연락주세요",
    portfolio: "포트폴리오",
  },
  de: {
    seoul: "Seoul",
    berlin: "Berlin",
    intro: "Einführung",
    intro_txt:
      "Luna ist eine Feinschmeckerin und Filmliebhaberin, die studiert, um eine nützliche Entwicklerin zu werden. Der Vorsatz für das neue Jahr 2021 ist es, regelmäßig zu laufen und an rostigen Klavierkünsten zu polieren. sie studierte Lebensmittelwissenschaften und arbeitete eineinhalb Jahre als UX-Designerin bei K7music.",
    title: "Fahigkeit",
    content:
      "Luna ist motiviert, Software zu entwickeln, die das Leben der Menschen verbessert.",
    now_sys_lang: "DE",
    skill_a: "Kenntnisse in Web-Markup und -Design, einschließlich HTML5, CSS3",
    skill_b:
      "Hat solide Kenntnisse der serverseitigen CSS-Vorverarbeitung wie LESS und SASS",
    skill_c:
      "Hat grundlegende Kenntnisse in clientseitigem Scripting und JavaScript",
    skill_d:
      "Erfahrung mit einer Vielzahl von JS-Frameworks einschließlich React und Angular",
    contactme: "Kontaktieren Sie mich gerne für Ihr nächstes Projekt",
    portfolio: "Portfolio",
  },
};

// 아래부분 4가지는 복사해다 붙여넣기 했는데 무슨 뜻인지 아직 잘 모르겠다.
// 현재 브라우저의 언어 가져오기
function getLanguage() {
  return navigator.language || navigator.userLanguage;
}

// 언어별 적용
function init(localeStr) {
  document.getElementById("locale").textContent = localeStr;
}

// 초기 작업
const currentLang = getLanguage();
init(currentLang);
render(currentLang.substr(0, 2));

// 언어별 렌더링
function render(locale) {
  const $lang = document.querySelectorAll("[data-lang]");
  $lang.forEach((el) => {
    const code = el.dataset.lang;
    el.textContent = lang[locale][code];
  });
}

// 버튼 이벤트
document.getElementById("btn-en").addEventListener("click", (e) => {
  render("en");
});
document.getElementById("btn-ko").addEventListener("click", (e) => {
  render("ko");
});
document.getElementById("btn-de").addEventListener("click", (e) => {
  render("de");
});

// 버튼 활성화 - 비활성화일 때 클릭하면 활성화
$(".nav-lang").on("click", function () {
// nav-lang 클래스가 클릭되면 함수실행
  $(".nav-lang").removeClass("active");
  // nav-lang 클래스 모두(버튼3개)에서 active 클래스 삭제 
  $(this).addClass("active");
  // 클릭된 버튼 클래스에 active클래스 추가
});

주요 포인트 및 생각해볼 점

css - 템플릿에서 사진에 회색이 옅게 깔려있는게 예뻤는데 복사해서 만든 요소에는 적용되지 않는다. 넣으려고 해봤는데 모르겠다.
js - 언어 변경하는데 사용된 함수를 꼭 다시 공부해봐야겠다.
포트폴리오 페이지는 나중에 이런 느낌으로 다시 만들고 싶다.
에이버리임 포트폴리오

질문

js - 사진이 로딩되는데 1초정도 걸려서 어색하다. 고치려면 어떻게 해야할까?