2021년 3월 9일 화요일 IT뉴스

2021.03.09.

1. 카카오페이, 펀드·대출 서비스 ‘순항’…더 아쉬운 마이데이터 보류

카카오페이, 펀드·대출 서비스 ‘순항’…더 아쉬운 마이데이터 보류

카카오페이가 펀드 상품 구성을 다양화하는 것은 물론 보험사들에게 신용대출을 받을 수 있도록 연결해주는 다리역할까지 빠르게 기능을 추가하고 있는 등의 증권과 보험 등 전금융 부문에서 적극적으로 영역을 넓히고 있다.

카카오페이가 종합금융플랫폼이 되기까지 몇 걸음 안남은 상황이다보니 최근 금융위원회로부터 마이데이터 허가를 받지 못한 점이 더 속이 쓰린 상황이며, 이에 따라 카카오페이는 지난달 5일부터 Δ자산관리 서비스 중 은행, 카드, 투자, 보험, 대출, 현금영수증 통합조회 Δ금융리포트 서비스 중 은행, 카드, 현금영수증, 투자 기반 정보제공 Δ버킷리스트 서비스 중 카드, 현금영수증 정보 기반 부스터 기능 Δ영수증 서비스 중 오늘의 이용내역 Δ내보험관리 서비스 중 보험가입 내역 조회 일부 기능 등을 중단했다.

  • 마이데이터는 은행, 보험사, 카드사 등 기존 금융회사와 관공서, 병원 등에 흩어진 개인신용정보를 기반으로 맞춤형 금융상품과 서비스를 추천 및 개발할 수 있는 사업이다. 지난해 8월 시행된 개정 신용정보법에 따라 마이데이터 사업이 허가제로 전환되면서 기존 사업자도 지난달부터 허가를 받아야 한다.

2. 스타링크 위성 인터넷, 움직이는 자동차에도 제공될까

스타링크 위성 인터넷, 움직이는 자동차에도 제공될까

스페이스X는 현재까지 스타링크의 위성 인터넷은 인터넷 연결이 어려운 지역을 중심으로 초고속 인터넷 서비스를 제공하는 것을 목표로 해왔으며, 지난 금요일 미국 FCC에 자동차, 트럭, 선박, 항공기에 스타링크 인터넷 단말기를 설치해 인터넷 서비스를 제공할 수 있도록 요청하는 라이선스 인증 요청 서류를 제출했다.

스페이스X가 광대역 인터넷 서비스를 차량까지 확대해 전 세계 통신 시장의 몇 %를 확보할 수 있다면 회사의 매출이 크게 늘어날 수도 있을 전망이라고 외신들은 전했다.

3. 카카오·네이트 되는데…네이버뉴스에선 유튜브를 볼 수 없다

카카오·네이트 되는데…네이버뉴스에선 유튜브를 볼 수 없다

지난 2019년 2월 네이버는 “뉴스 내 유튜브 영상이 재생되지 않는 경우가 있는데 민원이 네이버로 향한다”며 “우리가 타사 플랫폼 문제에 대해 일일이 조치를 취할 이유가 없으니 네이버TV 등을 이용해 이용자들의 불편함이 없게 해달라”고 하면서 자체 포털에서 노출되는 뉴스에서 유튜브 영상 삽입을 제한했다.

실제 네이버가 ‘기술적인 이유’ 때문이 아니라 ‘자사 플랫폼을 우대’하려는 이해관계에서 유튜브 영상을 제한한 것이라면 공정거래법 위반 소지가 있다는 지적이 나오고 있지만, 네이버 관계자는 “네이버는 다른 포털에 비해 뉴스 트래픽이 훨씬 많이 발생하고 그만큼 민원도 많이 들어온다”며 “순수하게 이용자 불편 차원에서 접근한 것이지 ‘네이버TV 키우기’와는 아무 관련이 없다”고 했다.

4. 자본소득에 관심…주식·암호화폐 앱 사용자 1011만 명

자본소득에 관심…주식·암호화폐 앱 사용자 1011만 명

와이즈앱·와이즈리테일이 한국인 만 10세 이상 Android와 iOS 스마트폰 사용자를 표본조사한 결과, 지난 2월 한 달 동안 사용자가 많은 상위 10개 주식/암호화폐 앱을 1번 이상 이용한 사람은 1,011만 명으로 조사됐으며, 사용자 1,011만 명 중 10대는 2.4%, 20대는 17.4%, 30대 23.0%, 40대 32.0%, 50대 이상이 25.1%였다.

특히, 작년 11월부터 매달 주식/가상화폐 앱 사용자가 급증했고,

  • 키움증권 영웅문S는 작년 11월에는 사용자가 208만 명에서 올 2월에는 323만 명으로 55% 증가
  • 삼성증권 mPOP은 작년 11월에는 사용자가 132만 명에서 올 2월에는 184만 명으로 39% 증가
  • 업비트(가상화폐앱)는 작년 11월에는 사용자가 63만 명에서 올 2월에는 166만 명으로 163% 증가

5. “개발자 20년이면 치킨집행” 컴공과 기피현상 불렀다

“개발자 20년이면 치킨집행” 컴공과 기피현상 불렀다

서울대 컴퓨터공학과는 2006년부터 2011년까지 5년간 매번 미달 사태를 겪었고, 카이스트 전산학과는 2004년 이후 7년간 단 한 번도 학과 정원 50명을 채우지 못했고, 이후 주요 IT기업의 개발자들에 대한 처우가 막노동에 비견될 정도로 좋지 못하고 휴일없는 프로젝트로 혹사 논란까지 일어나 ‘개발자 20년이면 결국 치킨집행’이라는 자조까지 나돌면서 SW 전공 기피현상을 심화시켰다.

업계에서는 같은 개발자라해도 개발수준과 경력에 따라 처우, 업무강도가 천차만별이라는 것이라는 지적이 있으며, 실제 최근 네카라쿠배당토(네이버·카카오·라인·쿠팡·배달의민족·당근마켓·토스) 등 주요 IT기업이 선점경쟁을 벌이는 인력들은 대부분 10년차 이상으로 각종 모바일 프로젝트나 신 서비스 구축을 경험한 팀장급이다. 나머지 대다수 일반 IT서비스 개발자들은 여전히 단순 코딩업무를 반복하며 야근과 밤샘에 시달린다는 후문이다.

–> 요즘 연봉을 올리면서 개발자를 영입하려는 기업들은 많고, 개발자는 부족하다고 하나….사실 기업들이 영입하려는 개발자는 상위1%이며, 나머지 개발자들은 기업에서 원하는 만큼의 기술과 실력이 부족하여 SW아카데미를 통해 직접 키워 개발자 수요를 채우고 있는 것 같다.

결론은 단순코딩이 아니라 문제 해결능력을 기르고 트렌드에 맞춰 기술을 쌓아야 취업에 도움이 된다.

2021년 3월 8일 월요일 IT뉴스

1. 네이버 후불결제 ‘고작 30만원’에 신용카드사 긴장한 까닭

네이버 후불결제 ‘고작 30만원’에 신용카드사 긴장한 까닭

네이버는 4월부터 네이버페이 포인트 등으로 제품을 구매할 때 부족한 현금은 후불 형식으로 상환하도록 할 수 있게 됐으며, 이를 네이버파이낸셜의 금융·재테크 서비스로도 이어붙일 수도 있다.

금융권 관계자는 “머지않아 네이버페이의 한도가 늘어날 것이기 때문에 기존 카드사와의 차별성은 사라졌다”며 “카드사들은 여신전문금융업법이 족쇄처럼 붙어 마케팅, 가맹점 수수료율, 여신한도 등 규제를 받아 신규 사업을 할 수 없지만 핀테크 회사들은 자유롭게 활동하고 있다”고 지적했다.

2. ‘갤럭시워치4’ 바늘 없이 혈당 측정한다

‘갤럭시워치4’ 바늘 없이 혈당 측정한다

혈압·심전도·산소포화도에 이어 혈당 측정 기능을 탑재한 삼성전자 차기 스마트워치가 2분기 중 출시될 것이란 관측이 나왔다.

앞서 삼성전자는 미국 매사추세츠공대(MIT) 연구팀과 공동으로 라만 분광법에 기반을 둔 비침습 혈당 측정 기술 연구 결과를 국제 학술지 ‘사이언스 어드밴시스’에 게재한 바 있다.

  • 라만 분광법은 레이저 빛이 특정 물질에 조사돼 산란할 때 물질 분자의 고유 진동에 의해 나오는 파장을 이용하는 분석법이다.

3. ‘무료 SW 다운로드 하려다’…악성코드·프로그램 ‘주의’

‘무료 SW 다운로드 하려다’…악성코드·프로그램 ‘주의’

안랩은 개발 SW 불법 설치파일로 사용자를 유도해 악성코드와 PUP 파일을 동시 유포하는 사례를 발견했다며, 사용자가 해당 파일을 내려받아 실행하면 프로그램 설치 창이 나타나고 사용자가 ‘다운로드하고 저장’을 누르면 크랙 파일과 함께 악성코드와 ‘가비지 클리너(Garbage Cleaner)’라는 PUP 프로그램이 함께 설치된다.

이번 공격으로 설치된 악성코드는 감염 PC 내 사용자 계정정보를 탈취해 공격자에게 전송한다. 함께 설치된 가비지 클리너는 사용자 PC의 임시파일을 삭제하는 도구로 유료 라이선스 구입을 지속 유도한다.

4. < ICT >구르다 멈춘 韓 롤러블폰… ‘최초’ 타이틀 中에 뺏길라

< ICT >구르다 멈춘 韓 롤러블폰… ‘최초’ 타이틀 中에 뺏길라

기술력에서 앞서가던 LG전자가 스마트폰 사업 철수 가능성으로 세계 최초 ‘롤러블(Rollable·돌돌 말리는)폰’ 출시 타이틀이 중국 업체에 넘어갈 가능성이 갈수록 커지고 있다.

삼성전자의 롤러블폰 출시 가능성도 속속 제기되지만, 실제 상용화까지는 적지 않은 시간이 소요될 전망이며, 삼성전자는 ‘최초’ 타이틀에 집착하기보다는 당분간은 상대적 우위를 점하고 있는 폴더블폰 시장에 더 집중한다는 방침이다.

5. 상장 앞둔 ‘야놀자’ 창업자, 전 직원에 주식 천만원어치씩 쏜다(종합)

상장 앞둔 ‘야놀자’ 창업자, 전 직원에 주식 천만원어치씩 쏜다(종합)

글로벌 여가 플랫폼 기업인 야놀자의 두 창업자가 전 직원에 일괄적으로 각 1000만원어치의 주식을 쏘기로 했다. 올해 상장을 앞두고 기업 가치평가가 상승에 대한 기대감이 높은 가운데 직원들을 격려하는 것은 물론 성장의 과실을 장기적으로 나누기 위한 차원이라는 설명이다.

6. 국민의힘 과방위 위원, “구글, 수수료 15% 이하로 인하하라”

국민의힘 과방위 위원, “구글, 수수료 15% 이하로 인하하라”

과학기술방송정보통신위원회 위원들은 8일 성명을 통해 “국내 앱마켓시장 점유율 63%의 압도적인 지위를 차지하고 있는 구글이 지난해 발표한 인앱결제 수수료 30% 부과는 국내 콘텐츠 개발사와 소비자들에 대한 부담이 너무 과도하다는 점을 깊이 공감한다”고 밝혔으며, “국내 앱 생태계의 상생과 발전이 무엇보다 중요하다는 차원에서 구글이 가까운 시일 내 대·중소기업 규모에 관계없이 일률적으로 15% 이하 수준으로 수수료를 인하할 것을 강력히 촉구한다”고 강조했다.

이들은 “과기부 실태조사 결과 국내 대기업의 50%는 구글의 30% 수수료를 콘텐츠 가격에 전가할 계획이라는 점에서 확인되었듯이 중소 앱 개발사뿐만 아니라 네이버·카카오 등 국내 플랫폼에 등록된 콘텐츠에 책정되는 수수료 부담이 그대로 소비자의 부담으로 돌아갈 것이 예상된다”고 밝혔다.

7. 인앱결제법 외면하는 야당…속 타는 콘텐츠 개발사

인앱결제법 외면하는 야당…속 타는 콘텐츠 개발사

국회 과학기술정보방송통신위원회에서 입법을 논의 중인 인앱결제 강제 방지법이 해를 넘겨 난항을 겪고 있고, 과방위 소속 의원들이 앞다퉈 전기통신사업법 개정안을 내놓으며 구글과 같은 앱마켓 사업자의 갑질을 막으려 했지만, 야당인 국민의힘이 번번이 반대 목소리를 내는 탓에 국내 디지털콘텐츠 업계의 우려가 커지고 있다.

업계 한 관계자는 “글로벌 시장을 대상으로 국경이 없는 사업을 하는 구글에 특정 국가에서만 수수료를 바꾸라는 요구는 ICT 시장에 대한 무지와 무관심을 드러낸 것”이라며 “기업에 특정 수수료를 명시해 강요하는 것은 공산주의 국가에서나 가능한 일이 아니냐”고 비판했다.

  • 인앱 결제 방지법 - 일명 구글 갑질 방지법..글 및 애플의 인앱결제 대신 다른 결제 시스템을 이용하더라도 불이익을 줄 수 없도록 하는 법안
    해외 사례 문제를 보면 구글의 자국 시장에서 주 별로 인앱결제 수단을 강요할 수 없는 법안이 잇달아 추진되고 있고, 애리조나 주 하원에서는 법안이 통과하기도 했다. 실제 입법 사례는 외면하면서 오히려 전례가 없는 수수료율 강제를 논하고 있다는 지적이다.
[백준] 2798번 블랙잭

[백준] 2798번 블랙잭

출처: [백준] 2798번 블랙잭


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 61157 27608 21782 44.404%

문제

카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다.

한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다.

김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다.

이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.

N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.


입력

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다.

합이 M을 넘지 않는 카드 3장을 찾을 수 있는 경우만 입력으로 주어진다.


출력

첫째 줄에 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력한다.


예제 입력 1

1
2
5 21
5 6 7 8 9

예제 출력 1

1
21

예제 입력 2

1
2
10 500
93 181 245 214 315 36 185 138 216 295

예제 출력 2

1
497

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import sys
from itertools import combinations

input = sys.stdin.readline

n, m = map(int, input().split())
cards_list = list(map(int, input().split()))

result = list(combinations(cards_list, 3))

max_sum = 0
for cards in result:
temp_sum = sum(cards)
if m >= temp_sum > max_sum:
max_sum = temp_sum

print(max_sum)

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sys

input = sys.stdin.readline

N, M = map(int, input().split())
cards_list = list(map(int, input().split()))

max_sum = 0
for i in range(N):
for j in range(i + 1, N):
for k in range(j + 1, N):
if M >= cards_list[i] + cards_list[j] + cards_list[k] > max_sum:
max_sum = cards_list[i] + cards_list[j] + cards_list[k]

print(max_sum)

[C++] String 클래스

출처

string class

Header :


.assign : 문자열을 할당

( 문자열 ) : 문자열을 할당한다.

( 개수, 문자 ) : 문자를 개수만큼 할당한다

( 문자열, 시작위치, 개수 ) : 매개변수 문자열의 시작위치부터 개수만큼을 호출한 문자열에 할당

1
2
3
4
string s1, s2, s3 ;
s1.assign( "ABCDEFG" ) ; // s1 = "ABCDEFG"
s2.assign( 3, 'a' ) ; // s2 = "aaa"
s3.assign( s, 2, 4 ) ; // s3 = "CDEF" ( 문자열 s의 2부터 4개를 복사하여 할당 )

.append : +연산자의 역할처럼 문자열을 끝에 더한다.

( 문자열 ) : 문자열을 더한다

( 개수, 문자 ) : 문자를 개수만큼 끝에 더한다

( 문자열, 시작위치, 개수 ) :

1
2
3
4
5
string s, s2 ;
s.append( "ABCDEF" ) ; // s = "ABCDEF"
s.append( 3, 'x' ) ; // s = "ABCDEFxxx"
s2.append( s, 2, 4 ) ; // s2 = "CDEF"
s2 += "x" ; // s2 = "CDEFx"

.clear : 문자열의 내용을 모두 삭제

1
s.clear() ;

.compare : 문자열을 비교 ( 사전순으로 비교 )

1
s.compare( s2 ) ;  // s == s2이면 0,  s<s2이면 음수,  s>s2이면 양수를 반환

.empty : 문자열이 비었는지 확인

1
s.empty() ;

.erase : 문자열을 지운다

( 시작위치, 개수 ) : 시작위치부터 개수만큼의 문자를 지운다.

1
2
string s = "ABCDEF" ;
s.erase( 0, 3 ) ; // s = "DEF" ( 인덱스 0부터 3개의 문자를 지운다 )

.find : 특정 문자열을 찾고, 그 시작위치를 반환

( 문자 ) : 인덱스 0부터 해당 문자를 찾고, 시작위치를 반환한다.

( 문자열 ) : 인덱스 0부터 해당 문자열을 찾고, 그 시작위치를 반환한다.

( 문자열, 시작위치 ) : 시작위치부터 문자열을 찾고, 시작위치를 반환한다.

1
2
3
4
5
6
string s1 = "abcd" ;
string s2 = "b" ;
**int** location = s1.find( s2 ) ;
location = s1.find( s2, x ) ;
location = s1.find_first_of( s2, x ) ;
location = s1.find_first_not_of( s2, x ) ; location = s1.find_last_of s1.find_last_not_of

.replace : 문자열을 대체

( 시작위치, 개수, 문자열 ) : 호출한 문자열의 시작위치부터 개수만큼의 문자를 매개변수 문자열로 대체한다.

1
2
   string s = "abc_def" ;
s.replace( 4, 3, "zzz" ) ; // s = "abc_zzz" ( 인덱스 4부터 3개의 문자를 "zzz"로 대체 )

.insert : 문자열을 지정한 위치에 삽입

( 시작위치, 문자열 ) : 시작위치에 문자열을 삽입한다.

string s = “ABCDEF” ; s.insert( 2, “xx” ) ; // s = “ABxxCDEF”

.pop_back : 문자열에서 가장 뒤의 문자 하나를 빼낸다.

.push_back : 문자열의 가장 뒤에 문자 하나를 추가한다.

string s = “ABCDEF” ; s.pop_back() ; // s = “ABCDE” s.push_back( ‘x’ ) ; // s = “ABCDEx”

.resize : 문자열의 크기를 재설정

s

.size, .length : 문자열의 크기를 반환

.max_size : 문자열이 최대로 가질수 있는 길이를 반환한다.

string s = “ABCDEF” ; int size = s.size() ; // size = 6 ( 실제 사용되고 있는 크기 ) int length = s.length() ; // length = 6 ( 문자열의 길이 )

.capacity : 할당된 메모리의 크기를 반환 ( reallocation 없이 사용할 수 있는 문자수를 반환 )

string s = “ABCDEF” ; int capacity = s.capacity() ; // size = 6, capacity = 15

★ capacity가 size보다 클때, 속도는 더 빠르다 !

= capacity가 size보다 크면, 기존 공간에 문자를 추가하면 되지만

그 반대의 경우에는 문자를 추가하기 위해 새로운 메모리를 할당해야 하기 때문이다.

.reserve : reallocation을 피하기 위해, 메모리의 최소용량을 지정

( 크기 ) : 크기만큼의 여유 메모리를 할당한다.

** 이때, 매개변수의 크기는 현재 capacity보다 크지않으면 의미도 효과도 없다.

string s = “ABCDEF” ; // size = 6, capacity = 15 s.reserve( 100 ) ; // size = 6, capacity = 111 s.reserve( 1000 ) ; // size = 6, capacity = 1007

.substr : 문자열의 일부분을 문자열로 반환

( 시작위치 ) : 시작위치부터 끝까지의 문자들을 문자열로 반환

( 시작위치, 개수 ) : 시작위치부터 개수만큼의 문자를 문자열로 반환

string s = “ABCDEF” ; string s2 = s.substr( 4 ) ; // s2 = “EF” ( 인덱스 4부터 끝까지의 문자열을 반환 ) string s3 = s.substr( 1, 3 ) ; // s3 = “BCD” ( 인덱스 1부터 3까지의 문자열을 반환 )

.swap : 문자열을 서로 바꾼다

string a = “ABCD” ; string b = “WXYZ” ; a.swap( b ) ; // a = “WXYZ”, b = “ABCD” b.swap( a ) ; // a = “ABCD”, b = “WXYZ”

.at : 문자열에서 특정위치의 문자를 액세스

string s = “ABCDEF” ; char c = s.at(3) ; // c = ‘D’

.c_str : string 문자열을 char* 형으로 바꾸어 반환한다.

string s = “ABCDEF” ; int length = strlen( s.c_str() ) ;

.date

.copy

.back

.front

.begin

.end

[백준] 10039번 평균점수

[백준] 10039번 평균점수

출처: [백준]10039번


문제

상현이가 가르치는 아이폰 앱 개발 수업의 수강생은 원섭, 세희, 상근, 숭, 강수이다.

어제 이 수업의 기말고사가 있었고, 상현이는 지금 학생들의 기말고사 시험지를 채점하고 있다. 기말고사 점수가 40점 이상인 학생들은 그 점수 그대로 자신의 성적이 된다. 하지만, 40점 미만인 학생들은 보충학습을 듣는 조건을 수락하면 40점을 받게 된다. 보충학습은 거부할 수 없기 때문에, 40점 미만인 학생들은 항상 40점을 받게 된다.

학생 5명의 점수가 주어졌을 때, 평균 점수를 구하는 프로그램을 작성하시오.


입력

입력은 총 5줄로 이루어져 있고, 원섭이의 점수, 세희의 점수, 상근이의 점수, 숭이의 점수, 강수의 점수가 순서대로 주어진다.

점수는 모두 0점 이상, 100점 이하인 5의 배수이다. 따라서, 평균 점수는 항상 정수이다.


출력

첫째 줄에 학생 5명의 평균 점수를 출력한다.


예제 입력 1

1
2
3
4
5
10
65
100
30
95

예제 출력 1

1
68

힌트

숭과 원섭이는 40점 미만이고, 보충학습에 참여할 예정이기 때문에 40점을 받게 된다. 따라서, 점수의 합은 340점이고, 평균은 68점이 된다.


출처

Olympiad > 일본정보올림피아드 > 일본정보올림피아드 예선 > JOI 2014 예선 1번


알고리즘 분류



풀이

  • 조건에 맞는 5개의 숫자를 받으면서 더한 후, 평균을 구한다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>

using namespace std;

int main()
{
int result=0,tmp;

for(int i=0; i<5; i++){
cin >> tmp;

if(tmp<0 || tmp>100 || tmp%5!=0){
return 0;
}

if(tmp<40){
tmp=40;
}

result+=tmp;
}

cout << result/5;
return 0;
}
[백준] 2920번 음계

[백준] 2920번 음계

출처: [백준]2920번


문제

다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, …, C를 8로 바꾼다.

1부터 8까지 차례대로 연주한다면 ascending, 8부터 1까지 차례대로 연주한다면 descending, 둘 다 아니라면 mixed 이다.

연주한 순서가 주어졌을 때, 이것이 ascending인지, descending인지, 아니면 mixed인지 판별하는 프로그램을 작성하시오.


입력

첫째 줄에 8개 숫자가 주어진다. 이 숫자는 문제 설명에서 설명한 음이며, 1부터 8까지 숫자가 한 번씩 등장한다.


출력

첫째 줄에 ascending, descending, mixed 중 하나를 출력한다.


예제 입력 1

1
1 2 3 4 5 6 7 8

예제 출력 1

1
ascending

예제 입력 2

1
8 7 6 5 4 3 2 1

예제 출력 2

1
descending

예제 입력 3

1
8 1 7 2 6 3 5 4

예제 출력 3

1
mixed

출처

Contest > Croatian Open Competition in Informatics > COCI 2009/2010 > Contest #1 1번


알고리즘 분류



풀이

  • 8개의 숫자를 순서대로 string으로 받는다. 그리고 그 string이 ‘12345678’ 인지, ‘87654321’ 인지 아닌지 확인 후 알맞은 결과값을 출력시킨다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <string>

using namespace std;

int main()
{
string str;
string tmp;

for(int i=0; i<8; i++){
cin >> tmp;
str.append(tmp);
}

string as="12345678";
string des="87654321";

if(str==as){
cout << "ascending";
}
else if(str==des){
cout << "descending";
}
else {
cout << "mixed";
}

return 0;
}
[백준] 2577번 숫자의 개수

[백준] 2577번 숫자의 개수

출처: [백준] 2577번 숫자의 개수


문제

세 개의 자연수 A, B, C가 주어질 때 A×B×C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.

예를 들어 A = 150, B = 266, C = 427 이라면

A × B × C = 150 × 266 × 427 = 17037300 이 되고,

계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다.


입력

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 같거나 크고, 1,000보다 작은 자연수이다.


출력

첫째 줄에는 A×B×C의 결과에 0 이 몇 번 쓰였는지 출력한다. 마찬가지로 둘째 줄부터 열 번째 줄까지 A×B×C의 결과에 1부터 9까지의 숫자가 각각 몇 번 쓰였는지 차례로 한 줄에 하나씩 출력한다.


예제 입력 1

1
2
3
150
266
427

예제 출력 1

1
2
3
4
5
6
7
8
9
10
3
1
0
2
0
0
0
2
0
0

출처

Olympiad > 한국정보올림피아드 > 한국정보올림피아드시․도지역본선 > 지역본선 2006 > 초등부 2번

  • 문제의 오타를 찾은 사람: pineapple
  • 잘못된 데이터를 찾은 사람: tncks0121

알고리즘 분류



풀이

  • 세 개의 자연수를 곱한 값을 10으로 나눈 나머지를 확인하여 해당 배열 인덱스에 카운트 1을 증가시켜준다.

  • 곱한 값은 10으로 나누어 1의 자리를 없앤다.

    ==> 1의 자리 숫자 하나씩 확인하면서, 10으로 나누어서 자릿수를 없애는 방식


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;
int main()
{
int A, B, C, result;
int count[10]={}; // 0으로 초기화

cin >> A >> B >> C; // 3개의 값 입력

result=A*B*C;

while(result != 0){
int temp = result %10;
result =result/10;
count[temp]++;
}


for(int i=0; i<10; i++){
printf("%d\n",count[i]);
}

return 0;
}
[백준] 8958번 OX퀴즈

[백준] 8958번 OX퀴즈

출처: [백준] 8958번 OX퀴즈


문제

“OOXXOXXOOO”와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.

“OOXXOXXOOO”의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.

출력

각 테스트 케이스마다 점수를 출력한다.

예제 입력 1 복사

1
2
3
4
5
6
5
OOXXOXXOOO
OOXXOOXXOO
OXOXOXOXOXOXOX
OOOOOOOOOO
OOOOXOOOOXOOOOX

예제 출력 1 복사

1
2
3
4
5
10
9
7
55
30

출처

ACM-ICPC > Regionals > Asia > Korea > Asia Regional - Seoul 2005 A번

  • 문제를 번역한 사람: baekjoon
  • 문제의 오타를 찾은 사람: jh82582

링크


풀이



소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <cstring>
using namespace std;

int main(void)
{
char str[100];
int number = 0, result =0, flag=1;

cin >> number;

for (int i=0; i<number; i++){
cin >> str;
int length = strlen(str); // str의 길이를 미리 계산하여 loop문에서 계속 계산되는 것을 방지?

for(int j=0; j<length; j++){
if (str[j] == 'O'){ // O일 때 결과값 flag만큼 증가
result+=flag;
flag++;
}
else{ // X일 때 flag 1로 초기화
flag=1;
}
}

cout << result << endl;
result =0;
flag =1;
}

return 0;
}
[백준] 1152번 단어의 개수

[백준] 1152번 단어의 개수

출처: [백준] 1152번 단어의 개수


문제

영어 대소문자와 띄어쓰기만으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.


입력

첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열의 앞과 뒤에는 공백이 있을 수도 있다.


출력

첫째 줄에 단어의 개수를 출력한다.


예제 입력 1

1
The Curious Case of Benjamin Button

예제 출력 1

1
6

예제 입력 2

1
Mazatneunde Wae Teullyeoyo

예제 출력 2

1
3

예제 입력 3

1
Teullinika Teullyeotzi

예제 출력 3 복사

1
2

출처


알고리즘 분류



소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <string>

using namespace std;
using std::string;

int main()
{
string str={};
int wordCnt=0; // 단어 갯수

getline(cin,str);

for(int i=0; i<str.length(); i++) {
if(str[i] == ' ')
wordCnt++;
}

if(str.at(0) == ' ')
wordCnt--;

if(str.at(str.length()-1)==' ')
wordCnt--;

cout << wordCnt+1;
return 0;
}
[JS] [번역] 40가지의 유용한 JavaScript팁, 트릭과 모범사례

[JS] [번역] 40가지의 유용한 JavaScript팁, 트릭과 모범사례

이 글에서는 브라우저 / 엔진 또는 SSJS (Server Side JavaScript) 인터프리터에 관계없이 모든 JavaScript 개발자가 알아야 할 JavaScript 팁, 트릭 및 모범 사례를 제공합니다.

이 글의 코드 스니펫은 V8 JavaScript 엔진 (V8 3.20.17.15)을 사용하는 최신 Chrome 버전 30에서 테스트되었습니다.


1. 변수를 처음으로 선언 할 때마다 var를 붙인다

선언되지 않은 변수는 자동으로 전역 변수로 정의된다. 전역변수를 피하자!


2. == 대신에 === 사용

== 및 != 연산자는 필요한 경우 자동 유형 변환을 수행한다

=== 및 !== 연산자는 변환을 수행하지 않고, 값과 유형을 비교한다. (그래서 ==보다 빠르다, == 및 != 연산자는 되도록 사용하지 않도록하자! )

1
2
3
4
5
6
7
8
[10] === 10    // is false
[10] == 10 // is true
'10' == 10 // is true
'10' === 10 // is false
[] == 0 // is true
[] === 0 // is false
'' == false // is true but true == "a" is false
'' === false // is false

3. undefined, null, 0, false, NaN, ''(empty string) 는 논리 값에 False


4. 세미콜론을 사용하여 행 구분

세미콜론을 사용하여 라인종료하는 것이 좋다. 대부분의 경우 JavaScript 파서에 의해 삽입되기 때문에 잊어 버리면 경고하지 않는다. 세미콜론을 왜 사용해야하는지에 대한 자세한 내용은… 참조


5. 객체 생성자 (object constructor) 생성

1
2
3
4
5
6
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}

var Saad = new Person("Saad", "Mousliki");

6. typeof, instanceof, constructor를 사용할 때 주의

  • typeof : JavaScript 단항 연산자는 변수의 기본 유형을 나타내는 문자열을 반환하는 데 사용되며 typeof null “객체”를 반환 한다는 사실을 잊지 말고 대부분의 객체 유형 (Array, Date 등)에서도 “객체”를 반환한다.
  • constructor : 내부 프로토 타입 속성의 속성으로 코드에 의해 재정의 될 수 있습니다.
  • instanceof : 모든 프로토 타입 체인을 검사하는 또 다른 JavaScript 연산자입니다. 생성자가 발견되면 true를 반환하고 그렇지 않으면 false를 반환합니다.
1
2
3
4
var arr = ["a", "b", "c"];
typeof arr; // return "object"
arr instanceof Array; // true
arr.constructor(); //[]

7. 자신을 실행하는 Function (자체 호출) 만들기

이를 종종 자체 호출 익명 함수, 즉시 실행 함수 또는 IIFE (Immediately Invoked Function Expression)라고합니다. 이 함수는 함수를 작성할 때 자동으로 실행되며 다음과 같은 형식을 갖습니다.

1
2
3
4
5
6
7
(function () {
// some private code that will be executed automatically
})();
(function (a, b) {
var result = a + b;
return result;
})(10, 20);

8. 배열에서 임의의 항목 가져오기

1
2
3
var items = [12, 548, "a", 2, 5478, "foo", 8852, , "Doe", 2145, 119];

var randomItem = items[Math.floor(Math.random() * items.length)];

9. 특정 범위의 난수 가져오기

이 코드 조각은 테스트를 위해 더미 데이터를 생성하는 예를 들어 월급의 하한과 상한을 지정하고 그 범위에서 임의의 값을 얻고 싶은 경우에 유용합니다.

1
var x = Math.floor(Math.random() * (max - min + 1)) + min;

10. 0부터 최대값을 갖는 배열 생성

1
2
3
4
var numbersArray = [],
max = 100;

for (var i = 1; numbersArray.push(i++) < max; ); // numbers = [1,2,3 ... 100]

11. 알파벳중에서 무작위 문자열 생성

1
2
3
4
5
6
7
8
9
function generateRandomAlphaNum(len) {
var rdmString = "";
for (
;
rdmString.length < len;
rdmString += Math.random().toString(36).substr(2)
);
return rdmString.substr(0, len);
}

12. 숫자 배열 섞기

1
2
3
4
5
var numbers = [5, 458, 120, -215, 228, 400, 122205, -85411];
numbers = numbers.sort(function () {
return Math.random() - 0.5;
});
/* the array numbers will be equal for example to [120, 5, 228, -215, 400, 458, -85411, 122205] */

더 나은 옵션은 기본 정렬 JavaScript 함수를 사용하는 것보다 코드에 의해 임의의 정렬순서를 구현하는 것일 수 있다. 참조


13. 문자열 trim 함수

문자열에서 공백을 제외하는 trim 함수는 Java, C#, PHP 등 다양한 언어로 구현되어 있지만, JavaScript에는 존재하지 않는다. 그래서 String 개체에 추가할 수 있다.

1
2
3
String.prototype.trim = function () {
return this.replace(/^s+|s+$/g, "");
};

14. 배열을 다른 배열에 추가

1
2
3
4
5
var array1 = [12 , "foo" , {name "Joe"} , -2458];

var array2 = ["Doe" , 555 , 100];
Array.prototype.push.apply(array1, array2);
/* array1 will be equal to [12 , "foo" , {name "Joe"} , -2458 , "Doe" , 555 , 100] */

15. arguments 객체를 배열로 반환

1
var argArray = Array.prototype.slice.call(arguments);

16. 주어진 argument가 숫자인지 확인

1
2
3
function isNumber(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}

17. 주어진 argument가 배열인지 확인

1
2
3
function isArray(obj) {
return Object.prototype.toString.call(obj) === "[object Array]";
}

위 코드에서 toString() 메소드가 재정의되면, 예상한 결과를 얻지 못할 수 있다.
그래서…

1
Array.isArray(obj); // its a new Array method

18. 배열 안의 숫자의 최대 값과 최소값 얻기

1
2
3
var numbers = [5, 458, 120, -215, 228, 400, 122205, -85411];
var maxInNumbers = Math.max.apply(Math, numbers);
var minInNumbers = Math.min.apply(Math, numbers);

19. 배열 비우기

1
2
var myArray = [12, 222, 1000];
myArray.length = 0; // myArray will be equal to [].

20. 배열에서 item을 제거할 때 delete 사용하지 말것

배열의 item를 제거 할 때는 delete 대신 split을 사용하자.
delete 는 배열에서 item을 제외하는 것이 아니라, undefined으로 바꾼다.

1
2
3
4
5
var items = [12, 548, "a", 2, 5478, "foo", 8852, , "Doe", 2154, 119];
items.length; // return 11
delete items[3]; // return true
items.length; // return 11
/* items will be equal to [12, 548, "a", undefined × 1, 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119] */

위 대신에 다음과 같이 사용

1
2
3
4
5
var items = [12, 548, "a", 2, 5478, "foo", 8852, , "Doe", 2154, 119];
items.length; // return 11
items.splice(3, 1);
items.length; // return 10
/* items will be equal to [12, 548, "a", 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119] */

21. 배열의 length 속성을 사용하여 자르기

위의 배열을 비우기 예와 같이 length 속성을 사용하여 자를 수 있다.

1
2
var myArray = [12, 222, 1000, 124, 98, 10];
myArray.length = 4; // myArray will be equal to [12 , 222 , 1000 , 124].

또한 배열의 length보다 큰 값을 넣으면 배열의 길이가 변경되고, 새로운 item이 undefined 값으로 추가 된다.
배열 길이는 읽기 전용 속성이 아니다.

1
2
myArray.length = 10; // the new array length is 10
myArray[myArray.length - 1]; // undefined

22. 조건 판정에 논리적 AND / OR 사용

1
2
3
var foo = 10;
foo == 10 && doSomething(); // is the same thing as if (foo == 10) doSomething();
foo == 5 || doSomething(); // is the same thing as if (foo != 5) doSomething();

논리적 OR은 함수 argument에 기본 값을 설정하는데 사용할 수 있다.

1
2
3
function doSomething(arg1) {
arg1 = arg1 || 10; // arg1 will have 10 as a default value if it’s not already set
}

23. Use the map() function method to loop through an array’s items

1
2
3
4
var squares = [1, 2, 3, 4].map(function (val) {
return val * val;
});
// squares will be equal to [1, 4, 9, 16]

24. 소수점 이하 N자리수 반올림

1
2
var num = 2.443242342;
num = num.toFixed(4); // num will be equal to 2.4432

25. 부동 소수점 문제

1
2
3
0.1 + 0.2 === 0.3; // is false
9007199254740992 + 1; // is equal to 9007199254740992
9007199254740992 + 2; // is equal to 9007199254740994

0.1 + 0.2 는 0.30000000000000004과 같다. IEEE 754 표준에 따라 JavaScript의 숫자는 모두 내부적으로 64bit 부동 소수점 형으로 다루어지는 것을 알 필요가 있다. 자세한 설명은 블로그 게시물 참조

toFixed()및 버튼 toPrecision()을 사용하면이 문제를 해결할 수 있습니다.


26. for-in 루프를 사용할 때 객체의 속성확인

이 코드 조각은 객체의 프로토타입의 속성을 열거하고 싶지 않은 경우에 편리하다.

1
2
3
4
5
for (var name in object) {
if (object.hasOwnProperty(name)) {
// do something with name
}
}

27. 쉼표 연산자

1
2
3
4
var a =  0 ;
var b = (a + , 99 );
console . log (a); // a will be equal to 1
console . log (b); // b is equal to 99

28. 요소의 쿼리와 계산을 필요로 하는 Cache 변수

jQuery 셀렉터의 경우는 DOM 요소를 캐시 할 수 있다.

1
2
3
4
var navright = document.querySelector("#right");
var navleft = document.querySelector("#left");
var navup = document.querySelector("#up");
var navdown = document.querySelector("#down");

29. isFinite() 를 지나기 전에 인수 확인하기

1
2
3
4
5
6
7
isFinite(0 / 0); // false
isFinite("foo"); // false
isFinite("10"); // true
isFinite(10); // true
isFinite(undefined); // false
isFinite(); // false
isFinite(null); // true !!!

30. 배열에서 음수 인덱스 사용하지 않기

1
2
3
var numbersArray = [1, 2, 3, 4, 5];
var from = numbersArray.indexOf("foo"); // from is equal to -1
numbersArray.splice(from, 2); // will return [5]

splice에 전달 된 인수가 음수가 아닌지 확인해야 함


31. 직렬화와 역직렬화 (JSON 작업)

1
2
3
4
5
var person = { name: "Saad", age: 26, department: { ID: 15, name: "R&D" } };
var stringFromPerson = JSON.stringify(person);
/* stringFromPerson is equal to "{"name":"Saad","age":26,"department":{"ID":15,"name":"R&D"}}" */
var personFromString = JSON.parse(stringFromPerson);
/* personFromString is equal to person object */

32. eval(), Function 생성자 사용하지 말기

eval이나 Function 생성자의 사용은 JavaScript 엔진이 실행가능한 소스코드로 변환해야하기 때문에 cost가 높다.

1
2
var func1 = new Function(functionCode);
var func2 = eval(functionCode);

33. with() 사용하지 말기 (The Good Part)

with()를 사용하면 전역 범위에 변수가 삽입된다. 따라서 다른 변수와 이름이 같으면 혼동을 일으켜 값을 덮어 쓸 수 있다.


34. 배열에 for-in 루프 사용하지 말기

1
2
3
4
var sum = 0;
for (var i in arrayNumbers) {
sum += arrayNumbers[i];
}

위 대신에 다음과 같이 사용

1
2
3
4
var sum = 0;
for (var i = 0, len = arrayNumbers.length; i < len; i++) {
sum += arrayNumbers[i];
}

또한, ilen의 인스턴스화는 for 루프의 첫번 째 명령문에 있기 때문에 한번 실행된다. 이렇게 하는 것이 아래처럼 하는 것보다 빠르다

1
for (var i = 0; i < arrayNumbers.length; i++)

그 이유는 arrayNumbers의 length를 루프마다 다시 계산하기 때문이다.


35. setTimeout()setInterval()는 문자열이 아닌 함수를 전달

setTimeOut() 또는 setInterval()로 문자열을 전달하면 실행속도가 느린 eval과 같은 방식으로 평가된다.

1
2
setInterval("doSomethingPeriodically()", 1000);
setTimeout("doSomethingAfterFiveSeconds()", 5000);

위 대신에…

1
2
setInterval(doSomethingPeriodically, 1000);
setTimeout(doSomethingAfterFiveSeconds, 5000);

를 사용


36. 일련의 if / else 대신 switch / case 문 사용

2개 이상의 case가 있을 경우, switch / case를 사용하는 편이 빠르고 우아하다. 10개 이상의 case가 있는 경우는 특히 피해야한다.


37. 숫자 범위 판정에 switch / case 사용

숫자 범위의 판정은 아래와 같이 실형 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function getCategory(age) {
var category = "";
switch (true) {
case isNaN(age):
category = "not an age";
break;
case age >= 50:
category = "Old";
break;
case age <= 20:
category = "Baby";
break;
default:
category = "Young";
break;
}
return category;
}
getCategory(5); // will return "Baby"

38. 주어진 객체를 프로토 타입 객체로 생성하기

줘진 객체를 프로토 타입 객체로 생성하는 함수는 다음과 같이 설명 할 수 있다.

1
2
3
4
5
6
function clone(object) {
function OneShotConstructor() {}
OneShotConstructor.prototype = object;
return new OneShotConstructor();
}
clone(Array).prototype; // []

39. HTML 이스케이프 함수

1
2
3
4
5
6
function escapeHTML(text) {
var replacements= {"<": "&lt;", ">": "&gt;","&": "&amp;", """: "&quot;"};
return text.replace(/[<>&"]/g, function(character) {
return replacements[character];
});
}

40. 반복문 내에서 try-catch-finally 절은 사용하기 말기

try-catch-finally 절은 현재 범위에 매번 새로운 변수를 생성한다.
이것은 catch 절에서 포착되는 예외를 할당하기 때문이다.

1
2
3
4
5
6
7
8
9
var object = ["foo", "bar"],
i;
for (i = 0, len = object.length; i < len; i++) {
try {
// do something that throws an exception
} catch (e) {
// handle exception
}
}

위 대신에 다음과 깉이 사용

1
2
3
4
5
6
7
8
9
var object = ["foo", "bar"],
i;
try {
for (i = 0, len = object.length; i < len; i++) {
// do something that throws an exception
}
} catch (e) {
// handle exception
}

정리

이 밖에도 팁 및 우용한 모범사례가 많이 있습니다. 만약 다른 것을 추가하는 것을 바라고, 의견이나 지적이 있으면 댓글을주세요.


출처

40 Useful JavaScript Tips, Tricks and Best Practices