백준: Silver⑤ - 1476, 1531, 1544, 1730
</br>
계속 풀이
</br>
1476: 날짜 계산
https://www.acmicpc.net/problem/1476
1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19 일 때 E S M으로 날짜 표현하기
if( e == s && e == m ){
cout << e << endl;
return 0;
}
e %= 15;
s %= 28;
m %= 19;
int ans = 16;
while( 1 ){
if( e == ans % 15 && s == ans % 28 && m == ans % 19 ){
break;
}
ans++;
}
cout << ans << endl;
1씩 늘리면서 나머지가 같아질 때를 찾으면 끝
</br>
1531: 투명
https://www.acmcpc.net/problem/1531
불투명 종이가 m번 초과 겹쳐지면 안 보일 때, 안 보이는 칸 개수 구하기
for(int i = 0; i < n; i++){
int x1,y1, x2,y2;
cin >> x1 >> y1 >> x2 >> y2;
for(int j = x1; j <= x2; j++){
for(int k = y1; k <= y2; k++){
mmap[j][k]++;
}
}
}
int cnt = 0;
for(int i = 1; i < 101; i++){
for(int j = 1; j < 101; j++){
if( mmap[i][j] > m ) cnt++;
}
}
cout << cnt << endl;
그냥 가려질 때마다 칸 마다 1씩 더해주고 m보다 크면 안 보이니까 카운트 해 줌
</br>
1544: 사이클 단어
https://www.acmcpc.net/problem/1544
어떤 단어가 순환해서 다른 단어가 되면 같은 단어라고 보기
int cnt = 0;
map<string, int> m;
for(int i = 0; i < n; i++){
string s;
cin >> s;
if( m.find(s) == m.end() ){
for(int j = 0; j < s.size(); j++){
m.insert(pair<string, int>(s.substr(j, s.size()-j) + s.substr(0, j), 1));
}
cnt++;
}
}
cout << cnt << endl;
어떻게 할까 했는데, 그냥 단어 하나가 들어오면 맵에다 순환한 단어들을 다 넣어 버리고, 다음 단어가 맵 안에 있으면 같은 단어이므로 체크하지 않는다.
</br>
1730: 판화
https://www.acmicpc.net/problem/1730
커맨드 입력 받아서 이동한 자국 출력하기
int pi = 1, pj = 1;
for(int i = 0; i < s.size(); i++){
int cmd1 = 0, cmd2 = 0;
if( s[i] == 'U' ) cmd1 = -1;
else if( s[i] == 'D' ) cmd1 = 1;
else if( s[i] == 'L' ) cmd2 = -1;
else if( s[i] == 'R' ) cmd2 = 1;
if( mmap[pi+cmd1][pj+cmd2] == -1 ) continue;
if( mmap[pi][pj] == 1 && cmd2 ) mmap[pi][pj] = 3;
else if( mmap[pi][pj] == 2 && cmd1 ) mmap[pi][pj] = 3;
else if( mmap[pi][pj] == 0 && cmd1 ) mmap[pi][pj] = 1;
else if( mmap[pi][pj] == 0 && cmd2 ) mmap[pi][pj] = 2;
pi += cmd1;
pj += cmd2;
if( mmap[pi][pj] == 1 && cmd2 ) mmap[pi][pj] = 3;
else if( mmap[pi][pj] == 2 && cmd1 ) mmap[pi][pj] = 3;
else if( mmap[pi][pj] == 0 && cmd1 ) mmap[pi][pj] = 1;
else if( mmap[pi][pj] == 0 && cmd2 ) mmap[pi][pj] = 2;
}
for(int i = 1; i < n+1; i++){
for(int j = 1; j < n+1; j++){
if( mmap[i][j] == 3 ) cout << '+';
else if( mmap[i][j] == 2 ) cout << '-';
else if( mmap[i][j] == 1 ) cout << '|';
else if( mmap[i][j] == 0 ) cout << '.';
}
cout << endl;
}
그냥 복붙하면서 구현했다
세로 방향일 땐 1, 가로 방향일 땐 2, 모두 갔으면 3으로 저장해 두고 출력해 준다.
</br>
실버 5 좋다
</br>
댓글남기기