코딩도장

구글 입사문제 중에서

1부터 10,000까지 8이라는 숫자가 총 몇번 나오는가?

8이 포함되어 있는 숫자의 갯수를 카운팅 하는 것이 아니라 8이라는 숫자를 모두 카운팅 해야 한다.
((注記) 예를들어 8808은 3, 8888은 4로 카운팅 해야 함)

2014年02月14日 01:03

pahkey

(追記) (追記ここまで)
댓글 작성은 로그인이 필요합니다.
여러 알고리즘이 존재할테고, 답도 여러가지인데...구글이 원했던, 혹은 가장 점수를 많이 줬던 정답은 뭘지 매우 궁금?궁금? - 예강효빠, 2017年05月24日 01:30 M D
경우의 수로 풀면 3번의 반복만으로 풀수 있어요 ^^ - 최재학, 2019年08月07日 11:20 M D
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

877개의 풀이가 있습니다. 1 / 88 Page

음....

10,000 에는 8 이 없으니 무시하고, 1 부터 9999 까지

X X X 8 인 경우 : 1,000개 ( X X X 는 세자리이므로 0 0 0 ~ 9 9 9 까지 천개)

X X 8 X 인 경우 : 1,000개 ( X X X 는 세자리이므로 0 0 0 ~ 9 9 9 까지 천개)

X 8 X X 인 경우 : 1,000개 ( X X X 는 세자리이므로 0 0 0 ~ 9 9 9 까지 천개)

8 X X X 인 경우 ; 1,000개 ( X X X 는 세자리이므로 0 0 0 ~ 9 9 9 까지 천개)

총 4,000 개 아닌가?

2014年02月14日 17:08

jake kim

댓글 작성은 로그인이 필요합니다.
+6 아마 입사문제라면, 이렇게 풀이 방식을 제시하는게 정석일 것 같네요. 네이버도 입사문제로 창의력을 발휘한 수학문제 풀기? 이런거 내는데, 구글도 아마 코딩을 하라는 의미는 아닐거 같아요. - 초록빛희망, 2014年02月14日 17:12 M D
네, 초록빛희망님 말씀에 동감합니다. ^^ 하지만 코딩으로 풀어봐도 재미있네요. - pahkey, 2014年02月14日 17:17 M D
그런데, 위의 경우 첫번째케이스와 두번째케이스에 중복된 값이 발생하지 않나요? 1188의 경우 첫번째와 두번째 모두 해당되는것 같습니다. - pahkey, 2014年02月16日 13:05 M D
+4 길가의풀 님 중복된값을 카운팅하기 때문에 문제에 나와있는 조건 "8이 포함되어 있는 숫자의 갯수를 카운팅 하는 것이 아니라 8이라는 숫자를 모두 카운팅 해야 한다." 를 만족할 수 있는 것 이라고 생각합니다. 1188의 경우 2여야겠죵 - Yoon Jake, 2014年02月16日 13:25 M D
+2 아.. 그렇군요. 8888의 경우 첫번째 케이스에서 1개가 카운트되고, 두번째 케이스에서 또 1개가 카운트되고,, 총 4개가 카운트되는 원리네요.. 한참 생각했네요..ᄒ - pahkey, 2014年02月16日 15:14 M D
+1 이것이 가장 훌륭한 답이네요. - 박연오, 2014年02月19日 01:07 M D
멋지네요.. 생각의 전환! - 임시, 2014年09月26日 12:26 M D
재밌게 잘 보고 갑니다. - 이성환, 2014年10月08日 11:07 M D
키야~ᄏᄏ 이정도문제는 컴퓨터도 필요없다 이겁니까? ᄏᄏᄏᄏᄏᄏ - kihyun lee, 2017年06月15日 21:15 M D
숫자의 개수를 구하는 것이 아니라 총 8의 개수를 구하는 것이라 아닌것 같아요 ^^; - 최재학, 2019年08月07日 11:21 M D
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

0000부터 9999라고 생각하고 4자리숫자가 10000개이므로 들어가는 숫자의개수는 4만개 0부터 9까지 10개의 숫자가 같은 비율로 들어가니 4만을 10으로 나누면 4천!

2014年02月19日 09:45

장 한솔

댓글 작성은 로그인이 필요합니다.
와우~ 감동이네요!! - pahkey, 2014年02月19日 09:49 M D
와~~ 더 지니어스에요 ^_^ - 무명소졸, 2014年03月07日 15:56 M D
와쩐다 ᄏᄏ - 한기우, 2015年11月24日 16:40 M D
오줌쌌다.. - Kookeedd, 2019年03月19日 11:37 M D
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬 2.7 입니다.

print str(range(1,10001)).count('8')
댓글 작성은 로그인이 필요합니다.
죄송한데 파이썬 초보라 이해가 잘 안됩니다. 위의 코드를 넣고 돌려봤는데(print에 괄호 넣고) 0 이 나오더라구요(python 3.3). 제가 뭔가 잘못한걸까요? str(range(1,10001)) 넣으면 '1234567891011....'이 나오나요? - 에밀로, 2014年02月19日 05:18 M D
파이썬 2.7.6 잘 됩니다. 파이썬 2.7.6에서 str(range(1,10001))하시면 "[1,2,3,...,10000]" 됩니다 - Lee SunYeop, 2014年02月19日 05:24 M D
답변 감사합니다. 그럼 버전의 문제인듯한데, 3.3버전에서 str(range(1,10001))을 하려면 어떻게 해야할까요? - 에밀로, 2014年02月19日 05:35 M D
+8 답을 찾았습니다. print(str(list(range(1,10001))).count('8')) 로 하면 되는군요. - 에밀로, 2014年02月19日 09:20 M D
오 저는 숫자 하나 하나의 '8'의 갯수를 찾고 그 것의 갯수를 더하는 방법을 택했는데, list에 넣고 한번에 세는 것이 더 간단하고 좋은 것 같네요~ 간결하고 멋져요!! - lkungs, 2016年08月16日 17:41 M D
멋진 발상의 전환입니다. - Kim J.S., 2016年10月29日 18:36 M D
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

JAVA

public class CountingEight {
 public static void main(String[] args) {
 for (int i=0; i<=10000; i++){
 searchEight(i);
 }
 System.out.println("1에서 10,000 사이에 존재하는 8의 개수는? "+count);
 }
 private static int count = 0;
 public static void searchEight(int num){
 if (num%10==8) count++; 
 if (num>10) searchEight(num/10);
 }
}

1에서 10,000 사이에 존재하는 8의 개수는? 4000

2015年02月24日 18:33

그린구름

댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬 3.5로 풀었습니다.

print(str(list(range(1, 10001))).count('8'))

2016年11月22日 01:24

Analyticsstory

댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬은 한줄로 가능하군요!!! @_@ 제 능력으로는 이렇게 밖에.... 하아~~

int count = 0;
for(int i = 1; i < 10001; i++)
{
 for(int j = i; j > 0; j /= 10)
 {
 if(j % 10 == 8)
 {
 count++;
 }
 }
}

2014年02月14日 16:10

Nemorino

댓글 작성은 로그인이 필요합니다.
멋진 방법이네요. 감탄했습니다. ^^ - pahkey, 2014年02月14日 16:29 M D
+1 아래 파이썬 해법은 알고보면 무척 단순합니다. 숫자 리스트를 모두 문자열로 변환해서 합친다음에 그 합쳐진 문자열에서 8이라는 숫자가 몇개인지 조사하는 방법입니다. - pahkey, 2014年02月14日 16:44 M D
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
  1. 8이 들어가지 않는 자리에 0~9까지 8을 제외한 값을 넣는다.
  2. 경우의 수만큼 곱한다.
  3. 8이 들어가는 자릿수만큼 곱한다.

8이 한번 나올 때

8000 0800 0080 0008

9x9x9x4 2916번

8이 2번 나올 때

8800 8080 8008 0880 0808 0088

9x9x6x2 972번

8이 3번 나올 때

8880 8088 8808 0888

9x4x3 108번

8이 4번 나올 때

8888 4번

8은 4000번 나온다.

댓글 작성은 로그인이 필요합니다.
정말 다양한 풀이가 존재하는군요 ^^ - pahkey, 2014年09月30日 23:08 M D
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
int main()
{
 int i,j,n,m;
 int sum;
 sum = 0;
 for (i=0; i<10; i++){
 for(j=0; j<10; j++){
 for (n=0; n<10; n++){
 for(m=0; m<10; m++){
 if( m == 8 ){sum = sum+1;}
 if( n == 8){sum = sum+1;}
 if ( j == 8){sum = sum+1;}
 if( i == 8 ){sum = sum+1;}
 }
 }
 }
 }
 printf("1~10000까지 8을 가진 숫자의 갯수는 %d 이다.\n",sum);
}

이제 C 공부하기 시작한 초보입니다. 배운 범위에서는 이렇게 하면 되네요.

댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Ruby

puts ("1".."10000").to_a.join.count("8")

문자열 Range "1" 부터 "10000" 까지를, Array로 변환, Array를 하나의 문자열로 합치고, "8"이라는 문자를 Count 한 후, 결과를 출력한다.

여러분 루비하세요. 자바가 한문이라면 루비는 한글입니다.

댓글 작성은 로그인이 필요합니다.
오~ 문자열 "1"도 열거형처럼 동작하나요?? "10" 다음에 "11"인걸 어떻게 처리하는지 궁금하네요 - Han Jooyung, 2016年11月10日 09:29 M D
+1 range클래스는 주어진 값의 #succ로 다음값을 획득하게 되어있습니다. String#succ는 오른쪽 끝문자의 숫자/영문 여부를 확인한 뒤 숫자면 숫자범위에서만 값증가, 영문이면 영문내에서 값증가, 혼합형이면 ascii로 증가시킵니다. 값을 증가시키는 중에 최대값을 넘어서는 carry가 발생하면 올림자리 값을 증가시켜줍니다. ("1a".."zz")는 range의 시작값이 숫자문자이므로 1a,1b...,1z,2a,..9z까지 만들어 주는 식이죠. 엑셀문자열 배열은 ("A".."ZZZ") 와 같이 만들 수 있습니다. http://bit.ly/28UZ60o - #succ 설명 : http://ruby-doc.org/core-2.3.1/String.html#method-i-succ - c source : https://rxr.whitequark.org/mri/source/string.c?v=2.1.2 3254라인 - rk, 2016年11月10日 12:12 M D
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Java로 풀어보았습니다.

각 자리수에 대해 8인지 검사하고 8이면 cnt값을 하나씩 증가시켜서 8의 개수를 구하는 코드입니다.

class Count8 {
 public static void main(String[] args) {
 int cnt = 0;
 for(int i = 1; i < 10000; i++ ) {
 if( i % 10 == 8 ) cnt++;
 if( (i / 10) % 10 == 8 ) cnt++;
 if( (i / 100) % 10 == 8 ) cnt++;
 if( (i / 1000) % 10 == 8 ) cnt++;
 }
 System.out.println("result : " + cnt);
 }
}
댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

(注記) 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
풀이 작성은 로그인이 필요합니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.


언어별 풀이 현황
전 체 x 877
기 타 x 137
python x 457
java x 134
cpp x 59
ruby x 7
javascript x 27
php x 8
cs x 18
lisp x 2
scala x 7
clojure x 1
objectivec x 5
perl x 2
go x 4
haskell x 3
r x 4
matlab x 2
코딩도장 © 2014 · 문의 [email protected]
피드백 · 개인정보취급방침 · RSS

AltStyle によって変換されたページ (->オリジナル) /