자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
도서 [시작하는 사람들을 위한 델파이 프로그래밍] 모듈 7 - Exercise 4
2016.05.02 10:43
'시작하는 사람들을 위한 델파이 프로그래밍' 도서에서 제공하는 Exercise(연습문제) 입니다.
정해진 답은 없습니다. 해결방법을 찾으신 분은 아래 댓글로 공유해주세요.
간혹 수학이 나오지만, 충분히 할 수 있습니다. 필요하면 구글 검색에게 물어보세요.
중요한 것은 '내가 생각하면서 프로그래밍을 한다'는 것입니다.
모듈 7. 중첩된 IF...THEN...ELSE 문. 작업 해결 실습하기
Exercise 4.
10111213 … 9899 는 두 자리 숫자를 10에서 99까지 나열하여 만든 180 자리 문자열이다.
정수 k (1 <= k <= 180) 가 주어지면, 이 180자리 문자열에서 앞에서 k번째 순서에 있는 숫자가 무엇인지 찾아보자.
- 다른 연습문제들도 풀어보세요!
댓글 2
-
달걀후라이
2020.07.02 16:05
-
WhiteC
2020.07.03 14:28
문제 제출자의 의도에 맞게 중첩된 방식으로 풀어낸 해법이네요.
저는 문제 제출자의 의도와는 살짝 빚나가지만 이렇게 해봤습니다. (FMX)
procedure TMainFrom.Button1Click(Sender: TObject);
var
k, ValueOfPosition, I: integer;
FullString: String;
begin
//입력받은 k(위치)
k := StrToInt(Edit1.Text);
//[해법] k(위치)에 있는 값을 구하기
if k mod 2 = 1 then //홀수번째는 10의 자리수
begin
ValueOfPosition := (k div 20) + 1;
end
else //짝수번째는 1의 자리수
begin
ValueOfPosition := ((k div 2) - 1) mod 10;
end;
//k(위치)의 값을 표시
Label1.Text := IntToStr(ValueOfPosition);
//[검증용 출력] k(위치)별 값을 모두 표시
for I := 10 to 99 do
begin
FullString := FullString + IntToStr(I);
end;
for I := 1 to 180 do
begin
Memo1.Lines.Add(Format('<%d> %s',[I, FullString.Substring(I-1,1)]));
end;
end;
도서 [시작하는 사람들을 위한 델파이 프로그래밍] 모듈 7 - Exercise 4
2016.05.02 10:43
'시작하는 사람들을 위한 델파이 프로그래밍' 도서에서 제공하는 Exercise(연습문제) 입니다. 정해진 답은 없습니다. 해결방법을 찾으신 분은 아래 댓글로 공유해주세요.
간혹 수학이 나오지만, 충분히 할 수 있습니다. 필요하면 구글 검색에게 물어보세요. 중요한 것은 '내가 생각하면서 프로그래밍을 한다'는 것입니다.
|
모듈 7. 중첩된 IF...THEN...ELSE 문. 작업 해결 실습하기
Exercise 4.
10111213 … 9899 는 두 자리 숫자를 10에서 99까지 나열하여 만든 180 자리 문자열이다.
정수 k (1 <= k <= 180) 가 주어지면, 이 180자리 문자열에서 앞에서 k번째 순서에 있는 숫자가 무엇인지 찾아보자.
- 다른 연습문제들도 풀어보세요!
댓글 2
-
달걀후라이
2020.07.02 16:05
-
WhiteC
2020.07.03 14:28
문제 제출자의 의도에 맞게 중첩된 방식으로 풀어낸 해법이네요.
저는 문제 제출자의 의도와는 살짝 빚나가지만 이렇게 해봤습니다. (FMX)
procedure TMainFrom.Button1Click(Sender: TObject);
var
k, ValueOfPosition, I: integer;
FullString: String;
begin
//입력받은 k(위치)
k := StrToInt(Edit1.Text);
//[해법] k(위치)에 있는 값을 구하기
if k mod 2 = 1 then //홀수번째는 10의 자리수
begin
ValueOfPosition := (k div 20) + 1;
end
else //짝수번째는 1의 자리수
begin
ValueOfPosition := ((k div 2) - 1) mod 10;
end;
//k(위치)의 값을 표시
Label1.Text := IntToStr(ValueOfPosition);
//[검증용 출력] k(위치)별 값을 모두 표시
for I := 10 to 99 do
begin
FullString := FullString + IntToStr(I);
end;
for I := 1 to 180 do
begin
Memo1.Lines.Add(Format('<%d> %s',[I, FullString.Substring(I-1,1)]));
end;
end;
다음과 같은 문제를 푸는 식이 있는지 모르겠으나 저는 몰라서 일단 제 나름대로 해보았습니다.
101112 .. 19
212223 .. 29
90.. 99
이렇게 2차원으로 생각한 다음 홀수 일 때는 10의 자리, 짝수일 때는 1의 자리인걸 알고는 먼저 이를 구분하기 위해 if문을 사용 했으며 1의 자리의 경우 다시 한줄의 20개의 숫자 중 짝수로 생각해서 정수 나누기로 값을 구했습니다.
다만 20으로 나누면 몫이 0이 되기 때문에 이를 다시 중첩 if문을 사용해서 예외적으로 고정 값인 9를 주는걸로 처리 하였습니다.
먼가 더 깔끔한 방식이 있을거 같은데 저의 한계는 여기까지네요 ;ㅁ;...
procedure TForm1.Button1Click(Sender: TObject);
var
n, x, x10, x1 : integer;
begin
n := strtoint(edit1.Text);
x10 := n div 20 + 1;
x1 := (n mod 20) div 2 - 1;
if n mod 2 = 0 then
begin
//짝수는 1의 자리수
if n mod 20 = 0 then
begin
label1.Caption := '9';
end
else
label1.Caption := inttostr(x1);
end
else
begin
//홀수는 10의 자리수
label1.Caption := inttostr(x10);
end;
end;